Інкапсуляція, імплементація, індоктринація: де висить замок
Інкапсуляція, імплементація й індоктринація стоять у словнику поруч і вдають, що незнайомі. Два слова з ООП, третє з політичних суперечок, де воно означає плюс-мінус «ти дурний, а я ні». Зводити їх варто з однієї причини: третє є першим, застосованим до людини, і з коду це видно краще, ніж із соціології.
Інкапсуляція. Межа, за якою лежить «як», а назовні стирчить «що»: сигнатура, контракт, обіцянка. Тримається вона не на замку, а на домовленості (у Python приватність — це підкреслення перед ім'ям і чесне слово), і викликачеві вихід коштує рівно нуль: захотів — відкрив сорс. Її продукт — право не знати.
Імплементація. Те, чим контракт наповнили: конкретний алгоритм, структура даних, порядок побічних ефектів. Замінна за визначенням (якщо підміна ламає викликачів, межу провели не там) і єдина, хто не бреше про «як». Про «чому» вона мовчить: причина живе в коміт-меседжі, в ADR або в голові того, хто вже звільнився.
Індоктринація. Встановлення поведінки без передачі підстав, з однією добавкою: питання про підстави оголошене дефектом того, хто питає. Ховає вона не «як», а «чому», і не від викликача, а від носія.
Перші два слова — пара, і пара ця тече. Варто комусь зав'язатись на поведінку, якої ніхто не обіцяв (порядок ключів, час відповіді, текст помилки), і імплементація стає контрактом без чийогось рішення. Далі люди залежать від нутра, якого не читали. Звідси cargo cult: рядок у конфігу, який ніхто не чіпає, бо «без нього падало». Це індоктринація без індоктринатора (і саме тому слово погано працює як звинувачення — винного може не бути взагалі, є тільки коробка, яку давно не відкривали, і автор, якого вже не спитаєш).
Друга асиметрія сидить у ціні виходу. Відкрити інкапсульоване коштує часу. Замінити імплементацію коштує рефакторингу. Вийти з індоктринації коштує стосунків: з командою, з родиною, із собою вчорашнім. Тому тест «чи можна відкрити» нічого не міряє, формально відкрити можна майже завжди. Міряє інше: що станеться з тим, хто відкрив.
Замок висить не на коробці.
Ребус розв'язується етимологією. Усі три слова — латинські дієслова про «покласти всередину»: encapsulate кладе в capsula, коробочку; implement походить від implere, наповнити; indoctrinate вкладає doctrina, вчення. Три способи щось кудись помістити, і різняться вони двома речами: що кладуть і хто коробка.
Інкапсуляція кладе механізм у коробку й віддає тобі контракт. Імплементація і є той механізм, яким контракт наповнили. Індоктринація кладе контракт у тебе, без механізму й без причини — і тоді коробка ти, а заразом і реалізація чужого інтерфейсу, яку не кликали на рев'ю специфікації.