«инкапсулировать поля», так что я научился создавать класс дать ему несколько полей, создать добытчик, сеттер
Python люди не делают этого. Тем не менее, они все еще выполняют OO-программирование. Ясно, что суетливые геттеры и сеттеры не являются существенными.
Они распространены из-за ограничений в C++ и Java. Но они не кажутся существенными.
Пользователи Python используют properties
для создания функций getter и setter, которые выглядят как простой атрибут.
Дело в том, что «Инкапсуляция» - это Дизайн. Это мало или ничего общего с реализацией. Вы можете иметь все публичные атрибуты и все еще красиво инкапсулированный дизайн.
Также обратите внимание, что многие люди беспокоятся о «чужой», который «нарушает» дизайн, напрямую обращаясь к атрибутам. Я предполагаю, что это может произойти, но тогда класс перестанет работать правильно.
В C++ (и Java), где вы не видите источник, это может быть трудно понять интерфейс, поэтому вам нужно много советов. частные методы, явные геттеры и сеттеры и т. д.
В Python, где вы можете увидеть весь источник, тривиально понять интерфейс. Нам не нужно давать так много намеков. Как мы говорим «Используйте источник, Люк» и «Мы все взрослые здесь». Мы все можем видеть источник, нам не нужно быть суетливым в том, чтобы накладывать на геттеры и сеттеры, чтобы дать еще больше подсказок о том, как работает API.
Например, объект отображения/рендеринга, который является классом данных, допустим, человек, имеющий имя и дату рождения. Должен ли класс иметь метод отображения объекта, в котором какой-либо Renderer будет передан в качестве аргумента?
Хорошая идея.
Не нарушал бы принцип, согласно которому класс должен иметь только одну цель (в данном случае состояние хранилища), поэтому он не должен заботиться о представлении этого объекта.
Именно поэтому объект Render является отдельным. Ваш дизайн довольно приятный.
Нет причин, по которым объект Person не может называть универсальный рендер и по-прежнему иметь узкий набор обязанностей.Ведь объект Person ответственен за атрибуты, и передача этих атрибутов в Renderer полностью отвечает его обязанностям.
Если это действительно проблема (и это может быть в некоторых приложениях), вы можете ввести классы Helper. Таким образом класс делает рендеринг Person
данных. Таким образом, изменение личности также требует изменений в PersonRenderer
- и ничего больше. Это объект дизайна Data Access Object.
Некоторые люди сделают рендеринг внутренним классом, содержащимся в Лице, так что это Person.PersonRenderer
для обеспечения более серьезного сдерживания.
Вы должны найти лучший источник материала для чтения, мой друг. Не все, что вы читаете на межтрубках, верно. Getters/Setters - это противоположность злу. Если бы вы разместили источник этой жемчужины мудрости, мы могли бы разобрать ее, но, увы, ссылки не было. уже критиковал. Нооп. –
@Sky Все зависит от контекста, некоторые использования Getters/Setters хороши, а другие - «злые» (хотя я бы не использовал это слово). Я стараюсь не быть таким догматичным. –
@ Andreas - понятный. Неправильное использование любой конструкции может быть злым, но охарактеризовать геттеры/сеттеры как зло в том же контексте, что, например, eval просто глупо, ИМО. –