Вам действительно нужна инкапсуляция, когда вы никому ничего не открываете? - PullRequest
2 голосов
/ 06 мая 2020

Пожалуйста, прочтите, прежде чем направлять меня в подобные сообщения, Я спрашиваю об очень конкретном c case :

Зачем использовать геттеры и сеттеры / аксессоры?

Какая польза от инкапсуляции, когда я могу изменять значения свойств с помощью методов установки?

Возьмем, например, приложение JAVA JEE , это в основном веб-сайты. Веб-сайт вашего банка, вероятно, представляет собой JAVA JEE-приложение.

В них мы, как правило, команда из 10-15 разработчиков, никто, кроме нас, не использует наш код, никто не импортирует наш пакет и не использует наши объекты.

Бэкэнд обычно имеет DAO для доступа к базе данных и объекты Value для передачи данных на уровень представления.

VO являются точными копиями сущностей, например:

publi c class UserVo {

private String name;
private String email;
private String password;

public UserVo(String name, String email, String password) {
    this.name = name;
    this.email = email;
    this.password = password;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}

}

Итак, вы получаете объект, вы конвертируете его в VO для «разделения слоев» (в чем я тоже не вижу смысла, потому что если вы измените объект, вы измените VO, затем вы измените код на уровне представления, который использует это VO, но что угодно)

Прежде всего, VO предполагается неизменяемым, но во всех проектах, над которыми я работал поскольку они изменчивы.

Мой вопрос: есть ли здесь преимущество иметь геттеры / сеттеры?

  • Внутри нет logi c, некоторые скажут вам, что сеттер может выполнить некоторую проверку, но это бесполезно, потому что весь наш код протестирован на модулях поэтому нет необходимости проверять что-либо в установщиках.

  • Поскольку все свойства имеют get / set, это точно так же, как если бы они были опубликованы c.

  • При изменении реализации геттер / сеттер также изменяются, и весь код, который использует старый геттер / сеттер, подвергается рефакторингу / модификации.

  • Я часто узнать о сокрытии данных, что пользователь не сможет получить доступ к частной собственности: что? пользователь просматривает веб-сайт.

Итак, почему все так привязаны к этим геттерам / сеттерам? если я использую свойства publi c вместо этих геттеров / сеттеров, меня будут высмеивать, все будут говорить что-то вроде «разве вы не знаете об инкапсуляции», «у вас НИКОГДА не должно быть полей publi c»

Я считаю, что это бесполезно, но все так делают, потому что так всегда делали, и никто никогда не спрашивает об этом.

Я ошибаюсь?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 06 мая 2020

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

Объекты скрывают свои данные за абстракциями и предоставляют функции, которые работают с этими данными (включая методы получения и установки). Структуры данных раскрывают свои данные и не имеют значимых функций. (Чистый код, Роберт Мартин)

Теперь в Java все является реальным объектом, и язык не поддерживает структуры данных. Но это не заставляет меня создавать объект, который действует как структура данных.

Я имею в виду, с какой стати я предпочту

public class Point {
 private double x;
 private double y;

 public double getX(){
  return x;
 }

 public double getY(){
  return y;
 }

 public void setX(double x){
  this.x = x;
 }

 public void setY(double y){
  this.y = y;
 }
}

этому?

1 голос
/ 07 мая 2020

Итак, почему все так привязаны к этим геттерам / сеттерам? если я использую свойства publi c вместо этих геттеров / сеттеров, меня будут высмеивать, все будут говорить что-то вроде «разве вы не знаете об инкапсуляции», «у вас НИКОГДА не должно быть publi c полей»

Я считаю, что это бесполезно, но все так делают, потому что так всегда делали, и никто никогда не спрашивает об этом.

Потому что это религия - что означает «Строгость и верность в соответствии с любой практикой, как если бы это было предписанным правилом поведения». - Вебстер

1 голос
/ 06 мая 2020

Java был разработан без какой-либо идеи реализации принципа универсального доступа (где вызывающий не различает guish, используют ли они поле или метод, они вызываются одинаково). Это означает, что вместо того, чтобы вводить геттер только тогда, когда он вам нужен, вы, как правило, помещаете его вперед, потому что позже будет сложно ввести его.

Так что люди, естественно, по умолчанию используют геттеры / сеттеры. Кроме того, естественно, что причины для этого основаны на страхе и туманно звучат, потому что все дело в непознаваемом будущем. . В таких случаях выбор не в ваших руках.

Во многих случаях проверки и преобразования лучше выполнять за пределами pojos (например, см. Валидаторы в spring mvc или конвертеры Jpa), но в других случаях нам нужны геттеры / сеттеры для проверки / преобразования (или боимся, что мы в конечном итоге это сделаем).

TL; DR: язык был разработан таким образом, что наказание за установку геттеров / сеттеров только тогда, когда это необходимо, поэтому у вас есть культура людей, настаивающих на них заранее во всех случаях.

Есть языки, в которых неизменность широко распространена, например clojure. Они прекрасно обходятся без инкапсуляции. Неизменяемость все еще незнакома многим программистам java, и лучшие практики предполагают изменяемое состояние. Для меня опубликованный объект значения был бы лучше, если бы он был неизменным, потому что в противном случае при чтении кода я не могу сбрасывать со счетов возможность что-то изменить его после его отправки.

...