четверг, 25 мая 2017 г.

Сколько объектов инкапсулируется?

Какая строка вам нравится больше, первая или вторая:
new HTTP("http://www.google.com").read();
new HTTP().read("http://www.google.com");
В чем разница? Первый класс HTTP инкапсулирует URL-адрес, а второй ожидает его как аргумент метода read (). Технически оба объекта выполняют одно и то же: они читают содержимое домашней страницы Google. Какой из них правильный? Обычно я ненавижу говорить это, но в этом случае я должен - это зависит от точки зрения.

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

Что такое реальная сущность в примере выше? Каждый класс дает свой ответ. Ответ дается списком аргументов, принимаемых его конструкторами. Первый класс принимает один URL-адрес в качестве аргумента его конструктора. Это говорит о том, что объект этого класса, после его создания, будет представлять собой веб-страницу. Второй класс не принимает аргументов, что говорит о том, что объект будет представлять ... Вселенную.

Чтобы понять, что представляет реальный объект, рассмотрите его конструктор

Я думаю, что этот принцип применим ко всем классам в объектно-ориентированном программировании - чтобы понять, что представляет собой реальный объект, посмотрите на его конструктор. Все аргументы, переданные в конструктор и инкапсулированные объектом, идентифицируют реальный объект, к которому обращаются и которым управляет объект.

Конечно, я говорю о хороших объектах, которые являются неизменными и не имеют сеттеров и геттеров.

Обратите внимание, что я говорю об аргументах, инкапсулированных объектом. Следующий класс не представляет Вселенную, хотя у него есть конструктор без аргументов:
class Time {
  private final long msec;
  public Time() {
    this(System.currentTimeMillis());
  }
  public Time(long time) {
    this.msec = time;
  }
}
Этот класс имеет два конструктора. Один из них является основным, а другой - дополнительным. Нас интересует главный, который реализует инкапсуляцию аргументов.

Теперь вопрос в том, что лучше: представлять веб-страницу или Вселенную? Думаю, что в целом, чем меньше реальная сущность, которую мы представляем, тем более прочную и связнную конструкцию мы даем объекту.

С другой стороны, иногда мы должны иметь объект, который представляет Вселенную. Например, у нас может быть следующее:

class HTTP {
  public String read(String url) {
    // read via HTTP and return
  }
  public boolean online() {
    // check whether we're online
  }
}

Это не элегантный дизайн, но он демонстрирует, когда может потребоваться представлять всю Вселенную. Объект этого класса HTTP может читать любую веб-страницу со всей сети (она почти такая же большая, как и Вселенная, не так ли?), И она может проверить, доступен ли для нее весь Интернет. Очевидно, что в этом случае нам не нужно инкапсулировать что-либо.

Я считаю, что объекты, представляющие Вселенную, не являются хорошими объектами, главным образом потому, что существует только одна Вселенная; Зачем нам тогда еще один представитель этого? :)

Комментариев нет:

Отправить комментарий