Допустим, мне поручено кодировать какую-то RPG. Это означает, что, например, я хочу отслеживать Character
GameCharacter
и их характеристики, такие как интеллект, бонусы за урон или хитпоинты.
Я очень боюсь, что к концу проекта я могу закончить обработкой с очень большим количеством полей - и для каждого мне придется убедиться, что они следуют очень похожему набору ограничений и поведения (для Например, я хочу, чтобы они были ограничены между минимальным и максимальным, я хочу иметь возможность различать «базовое значение» и «временный бонус», я хочу иметь возможность увеличивать и уменьшать оба без прохождения через сеттеры и добытчики). Неожиданно для каждого поля мне понадобится один (два?) Геттера и четыре сеттера, а может быть, и пара ретрансляторов тоже! Даже для 10 полей это означает, что множество методов одинаковы, eek.
Для DRYness я начал инкапсулировать логику работы с этими показателями в классах Field
, чтобы я мог написать такой код, как intelligence.applyBonus(10)
или hitpoints.get()
(который заботится о том, чтобы возвращаемое значение находилось в диапазоне) и т. Д. Я даже пошел на такую длину, чтобы создать классы для группировки этих полей вместе, но сейчас дело не в этом.
Теперь я столкнулся с этой проблемой при «подключении» Field
к GameCharacter
: в большинстве учебников по Java написано, что у каждого класса должны быть закрытые поля с открытыми методами получения и установки. Это хорошо звучит в теории, и я уже построил целый класс вокруг int
; однако идея звучит не так убедительно, когда вы вызываете геттер, чтобы получить ... геттер:
thisCharacter.getIntelligence().get() //eeek
Я бы предпочел получить доступ к полю напрямую. Может быть, это мой Python / VB [1] «фон», но для меня это чище, яснее и понятнее:
thisCharacter.intelligence.get()
(Теоретическая) проблема с открытыми полями состоит в том, что я отказываюсь от всего контроля над ним; например, в какой-то другой точке кодовой базы, по несчастью, может произойти следующее:
thisCharacter.intelligence = somethingThatReallyIsNull;
Звучит как небольшая ошибка ... но ... я имею в виду, я должен действительно беспокоиться об этом? Я, например, никогда не планирую назначать Field
напрямую [2], я задокументировал в Javadoc, что это не то, что должно быть сделано, но все же я новичок здесь, поэтому я немного разорван.
Так что я хотел бы услышать, что вы думаете по этой теме. Являются ли преимущества инкапсуляции настолько огромными, что я должен пойти дальше и получить геттеры, геттеры и так далее ... или я должен принять инкапсуляцию в здоровых показателях и оставить поле Field
как public
?
[1] Да, я знаю. Я пытался забыть. Но мы только недавно видели немного C # и человека, разве свойства не сладки. Ну хорошо.
[2] кроме конструкторов! И получатель не спасет меня от неисправного конструктора.