Что использовать throw + try/catch или if + return? Всем доброго времени суток!
Имеется приложение "Телефонная книга" на JavaFX. Оно состоит из двух форм(Stage).
На первой таблица и три кнопки: добавить, изменить, удалить. В таблице хранятся объекты типа Person с двумя полями: fio и phone. Вторая для ввода или изменения данных из таблицы, содержит две кнопки "Сохранить" и "Отмена".
Формы: mainPane.fxml, addPane.fxml. Два контроллера (классы с обработчиками событий) к ним: MainPaneController.java и AddPaneController.java соответственно.
Контроллер для главного окна выглядит следующим образом:public class MainPaneController {

....

private AddPaneController addPaneController;
//Коллекция объектов Person - записей телефонной книги
private CollectionAddressBook addressBookImpl = new CollectionAddressBook();
...

@FXML
private void initialize(){
...
addPaneController = fxmlLoader.getController();
addressBookImpl.fillPersonList();
}

...

@FXML
private void actionButtonPressed(ActionEvent actionEvent){
Object source = actionEvent.getSource();
if (!(source instanceof Button)) return;
Button clickedButton = (Button) source;
try {
switch (clickedButton.getId()){
case "btnAdd":
addPaneController.setPerson(new Person());
showDialog(TypeDialog.ADD);
addressBookImpl.add(addPaneController.getPerson());
break;
case "btnEdit":
Person selectedPerson = (Person)tableAddresBook.getSelectionModel().getSelectedItem();
addPaneController.setPerson(selectedPerson);
showDialog(TypeDialog.UPDATE);
break;
case "btnDelete": break;
}
}
catch (EmptyPersonException e){}
catch (NullPersonException e){
DialogManager.showErrorDialog(e.getMessage());
}
}

...

private void showDialog(TypeDialog typeDialog) {
// Отображает форму addPane.fxml
}
}
Класс контроллера для окна добавления/изменения записей в таблице:public class AddPaneController {
private Person person;
@FXML
private TextField txtFIO, txtPhone;
public void setPerson(Person person) throws NullPersonException {
if (person == null)
throw new NullPersonException();
this.person = person;
txtFIO.setText(person.getFio());
txtPhone.setText(person.getPhone());
}
public Person getPerson(){
return person;
}
//region LISTENERS
//для кнопки "Отмена"
@FXML
public void actionClose(ActionEvent actionEvent){
Node source = (Node)actionEvent.getSource();
Stage stage = (Stage)source.getScene().getWindow();
stage.hide();
}

//для кнопки "Сохранить"
@FXML
public void actionSave(ActionEvent actionEvent) {
try {
person.setFio(txtFIO.getText());
person.setPhone(txtPhone.getText());
actionClose(actionEvent);
}
catch (EmptyPersonException e){
DialogManager.showErrorDialog(e.getMessage());
}
}
//endregion
}
Класс Person:public class Person {
private SimpleStringProperty fio = new SimpleStringProperty("");
private SimpleStringProperty phone = new SimpleStringProperty("");
public Person(){}
public Person(String fio, String phone) {
this.fio.set(fio);
this.phone.set(phone);
}
public String getFio() {
return fio.get();
}
public String getPhone() { return phone.get(); }
public void setFio(String fio) throws EmptyPersonException {
if (fio.length() == 0)
throw new EmptyPersonException();
this.fio.set(fio);
}
public void setPhone(String phone) throws EmptyPersonException{
if (phone.length() == 0)
throw new EmptyPersonException();
this.phone.set(phone);
}
}
Класс CollectionAddressBook:public class CollectionAddressBook implements IAddressBook {
private ObservableList personList = FXCollections.observableArrayList();
@Override
public void add(Person person) throws EmptyPersonException {
if (person.getFio().length() == 0 || person.getPhone().length() == 0)
throw new EmptyPersonException();
personList.add(person);
}

...
public ObservableList getPersonList(){ return personList;}
public void fillPersonList(){
personList.add(new Person("Артем","8 800 555 3535"));
personList.add(new Person("Василий","8 802121 3535"));
personList.add(new Person("Нина","8 23222390 3535"));
}
}
Эксцепшены:public class EmptyPersonException extends Exception {
public EmptyPersonException(){
super("Не все поля заполненны!");
}
}
public class NullPersonException extends Exception {
public NullPersonException(){
super("Не выбрана запись из списка!");
}
}
Вопрос: насколько употребимо в данной ситуации (для проверки заполненности полей объекта Person) применение механизма исключений?
Может быть стоило использовать if и return, к примеру?@FXML
private void actionButtonPressed(ActionEvent actionEvent){
Object source = actionEvent.getSource();
if (!(source instanceof Button)) return;
Button clickedButton = (Button) source;

switch (clickedButton.getId()){
case "btnAdd":
addPaneController.setPerson(new Person());
showDialog(TypeDialog.ADD);
if (person.getFio().length() == 0 || person.getPhone().length() == 0){
DialogManager.showErrorDialog("Не все поля заполненны!");
return;
}
else
addressBookImpl.add(addPaneController.getPerson());
break;
case "btnEdit":
Person selectedPerson = (Person)tableAddresBook.getSelectionModel().getSelectedItem();
if (selectedPerson == null){
DialogManager.showErrorDialog("Не выбрана запись из списка!");
return;
}
else{
addPaneController.setPerson(selectedPerson);
showDialog(TypeDialog.UPDATE);
}
break;
case "btnDelete": break;
}
}
Какой из двух способов реализации метода actionButtonPressed лучше и почему? Что можете сказать про мой код?:) Принимаю любую критику. Заранее спасибо.

21 Авг 2019 в 06:59
225 +1
0
Ответы
1

Оба способа - использование механизма исключений (throw + try/catch) и if + return - являются допустимыми способами обработки ошибок, и выбор между ними зависит от личных предпочтений и особенностей проекта.

Однако, в данном случае, использование механизма исключений кажется более предпочтительным. Причины:

Читаемость кода: использование исключений делает код более читаемым и понятным, так как мы явно указываем, что происходит именно ошибка при работе с объектом Person.

Модульность: использование исключений позволяет легко обработать различные исключительные ситуации в разных частях кода, что повышает модульность и упрощает поддержку приложения.

Расширяемость: при использовании исключений проще добавить новые типы ошибок и их обработку, не затрагивая существующий код.

Однако, важно помнить, что некоторые разработчики предпочитают избегать чрезмерного использования исключений из-за их потенциальной накладной себестоимости. В конечном итоге, выбор между использованием исключений и if + return зависит от конкретной ситуации и стиля программирования.

Относительно вашего кода, он выглядит чистым и хорошо структурированным. Использование JavaFX и паттерна MVC позволяет создать удобное и интуитивно понятное приложение. Также обработка ошибок с помощью специализированных исключений делает код более надежным и понятным для других разработчиков. У вас хорошая практика использования FXML и контроллеров для управления интерфейсом. В целом, ваш код выглядит хорошо структурированным и легким для понимания.

20 Апр в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 83 722 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир