The following text is a partial translation of the original English article, performed by ChatGPT (gpt-3.5-turbo) and this Jekyll plugin:
Какая строчка вам нравится больше, первая или вторая:
В чем разница? Первый класс HTTP
инкапсулирует URL, в то время как второй ожидает его в качестве аргумента метода read()
. Технически, оба объекта делают одно и то же: они считывают содержимое домашней страницы Google. Какой из них является правильным дизайном? Обычно я не люблю это говорить, но в этом случае я должен — это зависит.
Как мы уже обсуждали ранее, хороший объект является представителем реальной сущности. Такая сущность существует вне среды жизни объекта. Объект знает, как к ней обращаться и как с ней взаимодействовать.
Какая реальная сущность в приведенном выше примере? Каждый класс дает свой собственный ответ. И ответ дается списком аргументов, которые принимает его конструктор. Первый класс принимает один URL в качестве аргумента своего конструктора. Это говорит нам о том, что объект этого класса после создания будет представлять веб-страницу. Второй класс не принимает аргументов, что говорит нам о том, что объект этого класса будет представлять… Вселенную.
Я думаю, что этот принцип применим ко всем классам в объектно-ориентированном программировании — чтобы понять, какую реальную сущность объект представляет, посмотрите на его конструктор. Все аргументы, переданные в конструктор и инкапсулированные объектом, идентифицируют реальную сущность, к которой объект обращается и которой управляет.
Конечно же, я говорю о хороших объектах, которые являются неизменяемыми и не имеют сеттеров и геттеров.
Обратите внимание, что я говорю о аргументах, инкапсулированных объектом. Следующий класс не представляет Вселенную, даже если у него есть конструктор без аргументов:
Этот класс имеет два конструктора. Один из них является основным, а другой дополнительным. Нас интересует основной конструктор, который реализует инкапсуляцию аргументов.
Теперь вопрос: что лучше представлять - веб-страницу или Вселенную? Это зависит, но я думаю, что в общем случае, чем меньше реальная сущность, которую мы представляем, тем более прочным и связанным является дизайн объекта.
С другой стороны, иногда нам необходим объект, который представляет Вселенную. Например, у нас может быть такое:
Это неэлегантное решение, но оно показывает, когда может потребоваться представить весь Вселенную. Объект класса HTTP
может считывать любую веб-страницу из всемирной паутины (она почти такая же большая, как Вселенная, не так ли?), и он может проверять доступность всей паутины по своим возможностям. Очевидно, в этом случае нам не нужно, чтобы он инкапсулировал что-либо.
Я считаю, что объекты, представляющие Вселенную, не являются хорошими объектами, в основном потому, что есть только одна Вселенная; зачем нам нужно много представителей её?
Translated by ChatGPT gpt-3.5-turbo/42 on 2023-11-17 at 16:57