Что использовать 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
270 +1
0
Ответы
1

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

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

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

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

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

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

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

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