Я работаю над генератором счетов в формате PDF в Vaadin 7. Код в его нынешнем виде на момент написания этой статьи можно найти здесь. Репо включает в себя грубую диаграмму классов.
Мой вопрос касается наилучшей практики сбора пользовательского ввода из TextField и других компонентов Vaadin для создания экземпляра Invoice.
В настоящее время это работает так:
- Когда пользователь нажимает кнопку для создания PDF-файла, класс VaadinInvoiceGui (панель) вызывает метод createPdf(VaadinInvoiceGui gui) в классе VaadinInvoiceController.
- VaadinInvoiceController вызывает метод getInvoiceFromForm (графический интерфейс VaadinInvoiceGui) в классе InvoiceMapperImpl.
- InvoiceMapperIml создает и возвращает счет-фактуру (POJO), вызывая методы get в переданном ему VaadinInvoiceGui. Эти геттеры возвращают значения компонентов в представлении.
- VaadinInvoiceController берет счет-фактуру, возвращенный InvoiceMapperImpl, и создает из него PDF-файл и т. д.
Геттеры в VaadinInvoiceGui выглядят так.
public String getCustomerName() {
return infoPanel.getCustomerNameTextField().getValue().toString();
}
public String getCustomerStreet() {
return infoPanel.getCustomerStreetTextField().getValue().toString();
}
public String getCustomerCity() {
return infoPanel.getCustomerCityTextField().getValue().toString();
}
...
Мне действительно не кажется хорошей идеей передавать весь класс графического интерфейса контроллеру и особенно мапперу, но я не уверен, как это сделать лучше. Я мог бы изменить метод createPdf(VaadinInvoiceGui gui) на что-то вроде createPdf(String имя клиента, String customerStreet,...), но количество параметров метода стало бы огромным. Я мог бы сделать это с помощью сеттеров, но тогда это в основном будет выполнять сопоставление объектов в графическом интерфейсе, что тоже не кажется очень чистой идеей.
Каков правильный способ сделать это?