Инкапсуляция данных для доступа к БД: всегда ли мне приходится писать публичные c + частные методы? - PullRequest
0 голосов
/ 04 мая 2020

Мой коллега говорит, что это инкапсуляция данных, и это нужно делать при использовании доступа к базе данных:

public String foo(final int x) {
  return fooHidden(x);
}

private String fooHidden(final int x) {
  return db.lookFor(x);
}

Я упростил код, чтобы сделать его более читабельным, но он по-прежнему имеет ту же структуру. Поэтому, на мой взгляд, это не инкапсуляция данных, это ничего не скрывает, потому что возвращаемое значение и параметр передачи равны. Так что для меня было бы неважно написать:

public String fooHidden(final int x) {
  return db.lookFor(x);
}

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

Можете ли вы сказать мне, кто прав? Как бы вы достигли sh реальной инкапсуляции данных для этого случая?

1 Ответ

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

Реализация двух методов совершенно одинакова, то есть в вашем случае это не имеет значения, но с точки зрения семантики, было бы более разумно иметь:

public String foo(final int x) {
  return db.lookFor(x);
}

Обратите внимание на имя foo, а не fooHidden для ссылки на публично предоставленный метод ( скрытый в противном случае означал бы, что вы выставляете метод, который должен быть закрытым ).

Между тем, оба реализация все еще скрывает поле db, которое должно быть скрыто от вызывающих классов и private для класса обтекания , следовательно, инкапсулировано . Таким образом, инкапсуляция касается состояния поля, а не реализации метода .

Это означает, что структура класса в целом должна выглядеть следующим образом:

public class MyClass {

  private db; // must be private, otherwise you'll be violating the encapsulation rule

  public String foo(final int x) {
    return db.lookFor(x);
  }

}

Возвращение на вопрос ОП:

Всегда ли мне нужно писать публичные c методы + приватные методы?

Вопрос должен быть таким: Всегда ли мне нужно писать publi c + private fields ?

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

Инкапсуляция, в Java, составляет около Модификаторы доступа ; что означает поля / методы , которые вы делаете доступными таким образом для публики c.

Вот что говорит Мартин Фаулер о модификаторах доступа :

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

...