«Инкапсулируйте ваши поля», поэтому я научился создавать класс, давать ему несколько полей, создавать методы получения, установки
Python люди не делают этого. Тем не менее, они все еще занимаются ОО-программированием. Очевидно, что суетливые добытчики и сеттеры не нужны.
Они распространены из-за ограничений в C ++ и Java. Но они не кажутся необходимыми.
Люди Python используют properties
иногда для создания функций получения и установки, которые выглядят как простой атрибут.
Дело в том, что "Инкапсуляция" - это стратегия Design . Это не имеет ничего общего с реализацией. Вы можете иметь все общедоступные атрибуты и все же красиво оформленный дизайн.
Также обратите внимание, что многие люди беспокоятся о «чужом», который «нарушает» дизайн, напрямую обращаясь к атрибутам. Я полагаю, это может произойти, но тогда класс перестанет работать правильно.
В C ++ (и Java), где вы не видите исходный код, может быть сложно понять интерфейс, поэтому вам нужно много подсказок. частные методы, явные методы получения и установки и т. д.
В Python, где вы можете видеть весь исходный код, понять интерфейс довольно просто. Нам не нужно предоставлять так много подсказок. Как мы говорим: «Используй источник, Люк» и «Мы все здесь взрослые». Мы все можем видеть исходный код, нам не нужно суетиться по поводу накапливания геттеров и сеттеров, чтобы предоставить еще больше советов о том, как работает API.
Например, отображение / рендеринг объекта, который является классом «data» - скажем, Person, у которого есть имя и дата рождения. Должен ли класс иметь метод для отображения объекта, в котором некоторый Renderer будет передан в качестве аргумента?
Хорошая идея.
Не противоречит ли это принципу, согласно которому класс должен иметь только одну цель (в данном случае это состояние хранилища), поэтому он не должен заботиться о представлении этого объекта.
Вот почему объект Render является отдельным. Ваш дизайн довольно хорош.
Нет причин, по которым объект Person не может вызывать средство визуализации общего назначения и все же имеет узкий набор обязанностей. В конце концов, объект Person отвечает за атрибуты, и передача этих атрибутов в Renderer вполне входит в его обязанности.
Если это действительно проблема (и это может быть в некоторых приложениях), вы можете ввести Helper классы. Таким образом, класс PersonRenderer
выполняет рендеринг данных Person
. Таким образом, изменение Person также требует изменений PersonRenderer
- и ничего больше. Это объект доступа к данным шаблон проектирования.
Некоторые люди делают Render внутренним классом, содержащимся в Person, поэтому Person.PersonRenderer
требует более серьезного сдерживания.