ООП на Java - для чего могут использоваться геттеры?

Обычно, getters всегда возвращают значение переменной. В своей литературе я узнал, что доступ к полям контролируется геттерами и сеттерами. Когда у меня был код, оцененный программистами, неожиданно было сказано, что геттеры и сеттеры нарушают объектно-ориентированное мышление.

До сих пор я всегда устанавливал выходные инструкции в методе класса, который вносил изменения в объект. Однако, если я хочу изменить способ создания выходов (например, графически или в терминале), мне пришлось бы переписать все классы. Поэтому я решил сделать следующее: выход больше не реализуется в классе, но класс предоставляет методы, которые предоставляют отображаемые значения. Затем для отображения создается другой класс, который использует специальные геттеры для запроса состояния объекта и отображения данных по своему усмотрению. Получатели находятся в классе, который имеет эти данные. Например, у меня мог бы быть объект «Человек». Человек имеет среди прочего переменные lifeCurrent и lifeMax. Эти поля представляют собой здоровье, если вы установите эти значения в отношении. Другой класс под названием «Дисплей» теперь отвечает за отображение текущего состояния здоровья человека. Поэтому я бы создал геттер «getHealth» в Человеческом классе, который возвращает список с lifeCurrent и lifeMax. Дисплей-класс будет иметь функцию, называемую health (Human). Эта функция вызывает геттер от человека и отображает значения для пользователя программы. Является ли принятым стилем использование таких геттеров?

3 голоса | спросил Henry Weinert 3 FebruaryEurope/MoscowbSat, 03 Feb 2018 14:29:48 +0300000000pmSat, 03 Feb 2018 14:29:48 +030018 2018, 14:29:48

2 ответа


2

Имена, которые вы даете объектам программы, показывают, что вы думаете о них, и это не кажется прямым (если я правильно понимаю ваше описание):

  • Экземпляры Human представляют людей, и это хорошо.
  • Метод getHealth() возвращает список lifeCurrent и lifeMax подразумевает, что «здоровье» - пара lifeCurrent и lifeMax. Это странно. Для меня здоровье было бы числом , которое можно вычислить из lifeCurrent и lifeMax (если это предположение вашего модельного мира). Итак, getHealth() должен выполнить это вычисление и вернуть результат. [Если вы говорите «дайте мне машину» кому-то, вы не хотите получать комплект без инструкций, вы хотите конечный продукт].
  • Хорошо отделить бизнес-логику и пользовательский интерфейс, так как вы делаете это с помощью Human (бизнес-логика) и Display (пользовательский интерфейс).
  • Имя класса Display меня смущает. Имена классов должны быть существительными, поэтому я читал бы это, например. TFT-дисплей, который не то, что вы имели в виду. Лучшее имя будет Presenter. И разные экземпляры Presenter могут показывать результат на разных носителях или в разных форматах.
  • Имя метода health(Human) слишком неспецифично. Что это значит для здоровья? printHealth будет лучшим именем. И я ожидаю, что метод printHealth() примет параметр работоспособности (число) вместо Human. Я бы ожидал, что метод печати примет Human, чтобы распечатать всю информацию об этом Human.
ответил Ralf Kleberhoff 3 FebruaryEurope/MoscowbSat, 03 Feb 2018 15:54:29 +0300000000pmSat, 03 Feb 2018 15:54:29 +030018 2018, 15:54:29
1

Короткий ответ нет . Как только вы определите какой-либо метод, который возвращает переменную экземпляра в любой форме с единственной целью иметь эту информацию с другой стороны, вы размываете ответственность по всему вашему приложению, нарушая инкапсуляцию и всевозможные другие вещи.

Теперь возникает вопрос: есть ли у вас причина , чтобы пригласить все эти плохие вещи? Если да, то может быть и причина иметь геттеры тоже.

Одна из причин может заключаться в том, что у вас есть естественная граница (бизнес-домена), и вы не знаете (не можете!) знать, что происходит с другой стороны. Итак, если вы не знаете, как это будет отображаться некоторыми другими разработчиками, вам необходимо опубликовать все данные. Если вы do знаете, как это будет представлено, то это представление (абстрактная часть) принадлежит объекту (чтобы избежать геттеров).

Итак, вопрос в том, почему вы хотите изменить метод вывода. Действительно ли это требование, чтобы иметь возможность изменить его в любое время? Или он будет изменен один раз и, возможно, больше никогда?

ответил Robert Bräutigam 3 FebruaryEurope/MoscowbSat, 03 Feb 2018 21:49:33 +0300000000pmSat, 03 Feb 2018 21:49:33 +030018 2018, 21:49:33

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132