Вы не можете написать хороший код без получателей.
Причина не в том, что геттеры не нарушают инкапсуляцию, а делают. Это не потому, что геттеры не соблазняют людей не беспокоиться об ООП, что заставило бы их размещать методы с данными, на которые они воздействуют. Они делают. Нет, вам нужны добытчики из-за границ.
Идеи инкапсуляции и хранения методов вместе с данными, с которыми они работают, просто не работают, когда вы сталкиваетесь с границей, которая удерживает вас от перемещения метода и, таким образом, вынуждает перемещать данные.
Это действительно так просто. Если вы используете геттеры, когда нет границ, у вас не будет реальных объектов. Все начинает стремиться к процессуальному. Который работает так же хорошо, как и когда-либо.
Настоящий ООП - это не то, что вы можете распространять повсюду Это работает только в этих границах.
Эти границы не тонкие как бритва. У них есть код в них. Этот код не может быть ООП. Это также не может быть функциональным. Нет, этот код не лишил нас наших идеалов, чтобы он мог справиться с суровой реальностью.
Майкл Феттерс назвал этот код фасции в честь этой белой соединительной ткани, которая скрепляет участки апельсина.
Это прекрасный способ думать об этом. Это объясняет, почему нормально иметь оба вида кода в одной кодовой базе. Без этой перспективы многие новые программисты сильно цепляются за свои идеалы, а затем разбивают им сердца и отказываются от этих идеалов, когда достигают своей первой границы.
Идеалы работают только на своем месте. Не отказывайтесь от них только потому, что они не работают везде. Используйте их там, где они работают. Это самое сочное место, которое защищает фасция.
Простой пример границы - это коллекция. Это что-то держит и понятия не имеет, что это такое. Как дизайнер коллекции мог бы перемещать поведенческую функциональность удерживаемого объекта в коллекцию, когда он не знает, что он будет держать? Ты не можешь Ты против границы. Именно поэтому в коллекциях есть геттеры.
Теперь, если бы вы знали, вы могли бы изменить это поведение и избежать изменения состояния. Когда вы знаете, вы должны. Ты просто не всегда знаешь.
Некоторые люди просто называют это прагматичным. И это. Но приятно знать, почему мы должны быть прагматичными.
Вы заявили, что не хотите слышать семантические аргументы и, похоже, отстаиваете повсеместное использование «разумных добытчиков». Вы просите, чтобы эта идея была оспорена. Я думаю, что могу показать, что у идеи есть проблемы с тем, как вы ее сформулировали. Но мне кажется, я знаю, откуда ты, потому что я был там.
Если вы хотите, чтобы получатели везде смотрели на Python. Частного ключевого слова нет. Тем не менее, Python прекрасно работает. Как? Они используют смысловой трюк. Они называют все, что должно быть частным, с ведущим подчеркиванием. Вам даже разрешают читать, если вы берете на себя ответственность за это. «Мы все здесь взрослые», - часто говорят они.
Так в чем же разница и просто помещать геттеры на все в Java или C #? Извините, но это семантика. Согласие Питона подчеркивает, что вы ясно видите, что вы ковыряетесь за дверью сотрудников. Хлопайте добытчики на все, и вы теряете этот сигнал. С отражением вы могли бы в любом случае лишиться частного и все же не потерять смысловой сигнал. Здесь просто нет структурного аргумента.
Так что нам остается решить, куда повесить табличку «только для сотрудников». Что следует считать приватным? Вы называете это "разумными добытчиками". Как я уже сказал, лучшее оправдание для добытчика - это граница, которая отталкивает нас от наших идеалов. Это не должно привести к получению на все. Когда это приводит к получению, вы должны подумать о том, чтобы продвинуть поведение дальше в область, где вы можете его защитить.
Это разделение породило несколько условий. Объект передачи данных или DTO не содержит поведения. Единственными методами являются методы получения, а иногда и установки, иногда конструктора. Это имя неудачное, потому что это совсем не настоящий объект. Получатели и установщики на самом деле являются просто отладочным кодом, который дает вам возможность установить точку останова. Если бы не было этой необходимости, они были бы просто кучей публичных полей. В C ++ мы называли их структурами. Единственное отличие, которое они имели от класса C ++, заключалось в том, что они по умолчанию были общедоступными.
DTO хороши тем, что вы можете перебросить их через граничную стену и сохранить другие ваши методы безопасно в приятном сочном объекте поведения. Настоящий объект. Без получателей, чтобы нарушить его инкапсуляцию. Мои объекты поведения могут есть DTO, используя их в качестве объектов параметров . Иногда мне приходится делать защитную копию, чтобы предотвратить общее изменяемое состояние . Я не распространяю изменяемые DTO внутри сочной части внутри границы. Я заключаю их в капсулу. Я их скрываю И когда я, наконец, сталкиваюсь с новой границей, я раскручиваю новый DTO и бросаю его через стену, создавая, таким образом, чужую проблему.
Но вы хотите предоставить получателям, которые выражают личность. Ну поздравляю, вы нашли границу. У сущностей есть идентичность, которая выходит за рамки их ссылок. То есть за пределами их памяти. Так что это должно где-то храниться. И что-то должно иметь возможность ссылаться на эту вещь по своей идентичности. Получатель, который выражает идентичность, совершенно разумен. Куча кода, который использует этот геттер для принятия решений, которые сущность могла бы принять сама, не является таковой.
В конце концов, это не существование добытчиков, что неправильно. Они намного лучше, чем публичные поля. Что плохо, когда они используются, чтобы притворяться, что вы объектно-ориентированы, а вы нет. Геттерс это хорошо. Быть объектно-ориентированным - это хорошо. Получатели не являются объектно-ориентированными. Используйте добытчики, чтобы вырезать безопасное место, чтобы быть объектно-ориентированным.