2016-12-03 2 views
0

У меня есть небольшое приложение для vaadin, которое позволит пользователям вводить некоторые данные в форме (данные сотрудника, такие как имя, фамилия, адрес и т. Д.) И хранить каждый объект-сотрудник в списке. Это структура до сих пор:Где разместить мой бизнес-логин в приложении vaadin

EmployeeForm 
    src/main/java 
     com.vaadin.project.EmployeeForm 
      MyUI.java 
     employee 
      Address.java 
      Employee.java 

Таким образом, для целей тестирования я создал объект Employee непосредственно внутри MyUI.java, например, так:

Address address1 = new Address(34, "Flinch Street","KT25AG"); 
Employee employee1 = new Employee("John","Smith", "Male", 39, address1, "Permanent", 8765); 
List<Employee> employee = new ArrayList<Employee>(); 
employee.add(employee1); 
for(Employee currentEmployee : employee){ 
    System.out.println(employee); 
} 

просто чтобы убедиться, что работает, но кажется неправильным сделать это там, поэтому я хотел бы создать еще один класс, который касается всей бизнес-логики, и мне было интересно, какой лучший способ. Под бизнес-логином я подразумеваю, что мне нужно убедиться, что это происходит, когда пользователи заполняют форму в файле MyUI.java и нажимают кнопку отправки, создается новый объект Employee и сохраняется в списке. Итак, я думаю, могу ли я вызвать функцию в MyUI.java, что-то вроде createNewEmployee(), а затем эту функцию определить внутри другого класса CreateEmployee.java, получить все необходимые мне данные (имя, фамилия, адрес и т. Д.) Из MyUI.java и построить новый объект Employee в CreateEmployee.java? Это звучит разумно? Достаточно легко сделать это в MyUI.java, но я считаю, что нужно иметь дело только с графическим интерфейсом, что вы, ребята, думаете?

ответ

1

Мне нравится использовать шаблон проектирования службы, где вся бизнес-логика инкапсулируется в сервисах.

У вас будет класс EmployeeService, который в простейшей форме может быть создан как переменная-член в вашем MyUI. Мои услуги обычно не имеют гражданства и имеют бизнес-методы. В вашем примере это будет иметь метод createNewEmployee().

Мне обычно нравится иметь интерфейс для моих услуг. Некоторые люди используют дополнительный уровень для любого взаимодействия с источником данных (поиск DAO). Мне нравится держать его простым и доступ к источникам данных непосредственно из моего сервиса.

Если я думаю, что у меня будет несколько реализаций или вам нужно будет поменять источники данных в будущем, тогда у меня будет функция AbstractEmployeeService, в которой будет выполняться большая часть истинной бизнес-логики, а затем будет реализована конкретная реализация источника данных (например, JdbcEmployeeService.)

Если вы хотите получить более продвинутый подход, я бы рекомендовал использовать Spring для внедрения ваших услуг. См. http://vaadin.github.io/spring-tutorial/, чтобы начать.

У разных разработчиков будут разные мнения. Нет ни одного правильного ответа, но вы на правильном пути, чтобы отделить нашу бизнес-логику!

+0

спасибо за совет, я создал класс EmployeeService и реализовал 'createNewEmployee (...)' и 'clearTextFields (...)' там (оба вызываются из MyUI.java), и все это работает. Теперь есть еще одна связанная вещь, что мне делать с обработкой ошибок, то есть, должен ли я создать для нее другой отдельный класс или иметь дело с ним в MyUI.java? – antobbo

+0

Мне нравится использовать 'setErrorHandler' в пользовательском интерфейсе и выводить собственное окно ошибок для обработки ошибок по всем разделам. Если мне нужна специальная обработка ошибок, тогда я могу обращаться с ней там, где это необходимо. Мне понравятся ошибки пузыря, обернув в RuntimeExceptions, когда я не уверен, как обрабатывать ошибку. Я обычно регистрирую исключение в обработчике ошибок. – chenson42

+0

Есть ли у вас пример этого? [Vaadin] (https://vaadin.com/docs/-/part/framework/application/application-errors.html), похоже, обрабатывает их в пользовательском интерфейсе. В моем конкретном случае мне нужно обрабатывать пустые поля ввода и, по крайней мере, исключение NumberFormatException, если строка в текстовом поле не может быть преобразована в int – antobbo

Смежные вопросы