Страницы

Поиск по вопросам

вторник, 27 ноября 2018 г.

Правильно ли помещать логику ввода данных с консоли в конструктор?

Задание: "Реализовать программу учета среднесуточной температуры на протяжении месяца. Ввод данных реализовать с консоли." Что правильнее:
Поместить в конструктор по умолчанию логику ввода данных с консоли со всеми валидациями? Создать отдельный метод для ввода данных, затем создавать объект класса, и к нему применять этот метод?
У меня сейчас вот так в конструкторе:
public TemperatureRecords() { System.out.println("Введите название месяца:"); setMonth(input.nextLine().toLowerCase()); while (getDaysAmount()!=0) { System.out.printf("Введите температуру %d числа:%n", temp);
try { setTemperature(input.nextInt()); setDaysAmount(getDaysAmount()-1); } catch (Exception e) { System.out.println("Ошибка!"); input.skip(".*"); } } }


Ответ

Определённо, нет. То, как это реализовано у вас - явно неправильно. В вашем случае конструктор класса и сам класс зависят от консольного ввода. Вообще зависимости между классами - вещь не очень хорошая, а зависимости настолько явные и того хуже. В данном случае мы имеем вот какую проблему: ваш класс не может работать без консоли, хотя не имеет к ней ни малейшего отношения. Представьте, что вам понадобилось использовать этот класс в каком-то другом приложении, где взаимодействие с пользователем происходит не через консоль, а каким-то другим способом (страница в браузере, форма десктопного приложения или как-то ещё). Вы не сможете корректно создать экземпляр вашего класса, и конструктор потребуется переписывать (или добавлять ещё один) чтобы он мог принимать данные не из консоли. Это говорит о том, что конструктор должен принимать необходимые данные в качестве параметров, класс можно будет безболезненно использовать о куда угодно. Как-то так:
public TemperatureRecords(String month, int[] temperatureData) { setMonth(month); for(int value : temperatureData) { setTemperature(value); setDaysAmount(getDaysAmount()-1); } }
Дело даже не в том, что конструктор стал вдвое короче (вырезанный из него код все равно должен будет использоваться, только в другом месте), а в том, что он во-первых, стал проще, а в-вторых, и в-главных, он теперь получает только те данные, которые ему нужны, знать ничего не знает ни о каких классах, которые не имеют к нему отношения и, следовательно, может быть вызван откуда угодно.
Логику же получения данных от пользователя и их валидацию правильнее будет возложить на другой код, разделив тем самым логику вашего класса и логику получения для него данных (да-да, старый принцип "разделяй и властвуй" никто не отменял).

Комментариев нет:

Отправить комментарий