Одной из основных концепций объектно-ориентированного программирования является инкапсуляция - то есть скрытие состояния объекта (например, данных в объекте) извне,и позволяя объекту обрабатывать свое собственное состояние.
Когда инкапсуляция выполнена хорошо, на состояние объекта можно воздействовать только из внешнего мира через интерфейсы, предоставляемые объектом, такие как методы, которыми обладает объект.
Я думаю, что ваш код уже начинает использовать инкапсуляцию.
Давайте посмотрим на код
Давайте посмотрим на метод beDamaged
.
public void beDamaged(double damage)
{
this.health -= damage;
if (this.health < 0)
{
this.health = 0;
}
}
Здесь мы видим, что этот метод будет вызываться внешним миром, и здоровье игрока будет затронуто.Он также содержит логику, поэтому здоровье не может быть отрицательным числом.Метод beDamaged
игрока, который вы написали, сохраняет состояние объекта в параметрах, которые вы определили как действительное состояние.
Давайте сделаем вывод об игроке
Теперь, исходя из вышесказанного, я думаю, что могу сделать вывод об объекте игрока:
* Игрок health
не может быть отрицательным числом.
Всегда ли то, что мы сделали, верно?
Давайте посмотрим, может ли это быть верным из предоставленного вами кода.
Ага!У нас есть небольшая проблема:
public double health;
С полем health
, равным public
, внешний мир может напрямую манипулировать полем, чтобы поместить состояние объекта игрока в то, что, вероятно, нежелательнос помощью некоторого кода, подобного следующему:
Player player = new Player();
player.health = -100
Я собираюсь предположить, что игрок не должен находиться в состоянии, где health
является отрицательным числом.
Что мы можем с этим сделать?
Как этого можно было избежать?- при наличии поля health
private
.
Теперь единственный способ повлиять на health
игрока - это методы beDamaged
и gainHealth
, и это, вероятно, правильный путь.для внешнего мира, чтобы повлиять на здоровье вашего игрока.
Что также означает это - когда вы делаете поле private
, это не означает автоматически, что вы должны делать геттеры и сеттеры для поля.
Приватные поля не требуют геттеров и сеттеров
Геттеры и сеттеры обычно являются способом прямого воздействия на поле, которое имеет объект, возможно, с некоторой проверкой, чтобы предотвратить неправильный ввод данныху вашего объекта есть состояние, которого не должно быть, но будут времена, когда сам объект должен отвечать за воздействие на данные, а не на внешнюю сущность.