Задание: "Реализовать программу учета среднесуточной температуры на протяжении месяца. Ввод данных реализовать с консоли."
Что правильнее:
Поместить в конструктор по умолчанию логику ввода данных с консоли со всеми валидациями?
Создать отдельный метод для ввода данных, затем создавать объект класса, и к нему применять этот метод?
У меня сейчас вот так в конструкторе:
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);
}
}
Дело даже не в том, что конструктор стал вдвое короче (вырезанный из него код все равно должен будет использоваться, только в другом месте), а в том, что он во-первых, стал проще, а в-вторых, и в-главных, он теперь получает только те данные, которые ему нужны, знать ничего не знает ни о каких классах, которые не имеют к нему отношения и, следовательно, может быть вызван откуда угодно.
Логику же получения данных от пользователя и их валидацию правильнее будет возложить на другой код, разделив тем самым логику вашего класса и логику получения для него данных (да-да, старый принцип "разделяй и властвуй" никто не отменял).
Комментариев нет:
Отправить комментарий