Ви не можете написати хороший код без геттерів.
Причина цього не відбувається через те, що геттери не порушують інкапсуляцію, вони це роблять. Це не тому, що мешканці не спокушають людей не турбуватись за OOP, що дозволить їм поставити методи з даними, на які вони діють. Вони роблять. Ні, вам потрібні жителі через межі.
Ідеї інкапсуляції та збереження методів разом із даними, на які вони діють, просто не спрацьовують, коли ви стикаєтесь з межею, яка перешкоджає переміщенню методу і тим самим змушує вас переміщувати дані.
Це дійсно так просто. Якщо ви користуєтеся геттерами, коли немає меж, у вас виявляється відсутність реальних об'єктів. Все починає тяжіти до процесуального. Що працює так само добре, як і коли-небудь.
True OOP - це не те, що можна поширити скрізь. Це працює лише в тих межах.
Ці межі не є бритвою. У них є код. Цей код не може бути OOP. Він також не може бути функціональним. Жоден цей код не позбавлений наших ідеалів, щоб він міг боротися з суворою реальністю.
Майкл Феттерс назвав цей кодовий фасцією після білої сполучної тканини, яка містить ділянки апельсина разом.
Це чудовий спосіб подумати над цим. Це пояснює, чому нормально обидва види коду в одній базі коду. Без цієї перспективи багато нових програмістів важко чіпляються за свої ідеали, а потім розбивають серце і відмовляються від цих ідеалів, коли вони потрапляють на свою першу межу.
Ідеали працюють лише на своєму місці. Не здавайся на них лише тому, що вони працюють не скрізь. Використовуйте їх там, де вони працюють. Це місце - соковита частина, яку захищає фасція.
Простий приклад межі - колекція. Це щось тримає і поняття не має, що це таке. Як дизайнер колекції міг би перенести функцію поведінки утримуваного об'єкта в колекцію, коли вони не мають уявлення про те, що це буде? Ви не можете. Ти проти межі. Саме тому в колекціях є геттери.
Тепер, якщо б ви знали, ви можете змінити таку поведінку і уникнути переходу в стан. Коли ти це знаєш, ти повинен. Ви просто не завжди знаєте.
Деякі люди просто називають це прагматичним. І воно є. Але приємно знати, чому ми повинні бути прагматичними.
Ви висловили, що не хочете чути смислові аргументи і, схоже, виступаєте за те, щоб скрізь ставити "розумних". Ви просите оскаржити цю ідею. Я думаю, що я можу показати, що ідея має проблеми з тим, як ви її оформили. Але він також вважає, що я знаю, звідки ти родом, бо я був там.
Якщо ви хочете, щоб гетері були скрізь, подивіться на Python. Приватного ключового слова немає. Але Python робить OOP просто чудовим. Як? Вони використовують смисловий трюк. Вони називають все, що означало б бути приватним, з головним підкресленням. Вам навіть дозволяється читати з нього, якщо ви берете на себе відповідальність за це. «Ми всі тут дорослі», - часто кажуть вони.
Тож у чому різниця між цим і просто наділенням гетерів на все на Java або C #? Вибачте, але це семантика. Змова підкреслює пітони, чітко сигналізує вам про те, що ти кидаєшся лише за двері співробітників. Пощеплюйте все, і ви втратите цей сигнал. Замислившись, ви могли все-таки позбавитись приватного і все одно не втратили смисловий сигнал. Тут просто не має бути структурного аргументу.
Отже, нам залишається завдання вирішити, де повісити знак "лише працівникам". Що слід вважати приватним? Ви називаєте це "розумними геттерами". Як я вже говорив, найкращим виправданням для геттера є межа, яка відштовхує нас від наших ідеалів. Це не повинно спричинити за собою все. Коли це призведе до отримання геттера, вам слід подумати про те, щоб перенести поведінку далі в соковитий шматочок, де ви можете захистити це.
Цей поділ породив кілька термінів. Об'єкт передачі даних або DTO не має поведінки. Єдині методи - це геттери, а іноді і сетери, іноді конструктори. Це ім'я прикро, тому що це зовсім не справжній об’єкт. Геттери і сетери - це просто код налагодження, який дає вам місце для встановлення точки перерви. Якби не ця потреба, вони просто були б купою громадських полів. У C ++ ми називали їх структурами. Єдина відмінність, яку вони мали від класу C ++, полягала в тому, що вони були дефолтними для загального користування.
DTO є приємними, тому що ви можете перекинути їх через прикордонну стіну і зберегти ваші інші методи безпечно у приємному соковитому об'єкті поведінки. Справжній об’єкт. Не маючи порушників, це порушує його інкапсуляцію. Мої об'єкти поведінки можуть їсти DTO, використовуючи їх як об'єкти параметрів . Іноді мені доводиться робити захисну копію, щоб запобігти спільному зміненному стану . Я не поширюю змінні DTO навколо всередині соковитої частини в межах. Я їх інкапсулюю. Я їх приховую. І коли я нарешті зіткнувся з новою межею, я закрутив новий DTO і кидаю його через стіну, роблячи це чиєюсь проблемою.
Але ви хочете надати геттерам, які виражають особу. Добре вітаю, ви знайшли межу. Суб'єкти мають ідентичність, яка виходить за межі їхньої довідки. Тобто, поза їхньою адресою пам'яті. Тому його треба десь зберігати. І щось має бути в змозі посилатися на цю річ за її особистістю. Геттер, що виражає ідентичність, цілком розумний. Купа коду, яка використовує цей гетьер для прийняття рішень, які Організація могла прийняти сама, це не так.
Зрештою, не існування геттерів є неправильним. Вони набагато кращі, ніж громадські поля. Погано, коли вони використовуються для того, щоб робити вигляд, що ви орієнтовані на об'єкт, коли ви цього не робите. Геттери хороші. Орієнтованість на об’єкти - це добре. Геттери не об'єктно орієнтовані. Використовуйте геттери, щоб вирізати безпечне місце для орієнтування на об'єкт.