Це питання про те, коли використовувати приватні та коли використовувати захищені в класах, змусило мене задуматися. (Я поширю це питання також на заключні класи та методи, оскільки це пов'язано. Я програмую на Java, але думаю, що це стосується кожної мови OOP)
Добре правило: зробити все максимально приватним.
- Зробіть усі класи остаточними, якщо вам не потрібно відразу підкласифікувати їх.
- Зробіть усі методи остаточними, якщо вам не потрібно відразу підкласифікувати їх і замінити.
- Зробіть усі параметри методу остаточними, якщо вам не потрібно їх змінювати в тілі методу, який у будь-якому разі є незручним у більшості випадків.
Це досить просто і зрозуміло, але що робити, якщо я в основному пишу бібліотеки (Open Source на GitHub) замість програм?
Я міг би назвати багато бібліотек та ситуацій, де
- Бібліотеку розширюють таким чином, про який розробники ніколи не думали б
- Це довелося робити з "магією завантажувача класу" та іншими хаками через обмеження видимості
- Бібліотеки звикли таким чином, щоб вони не були побудовані, і необхідний функціональний спосіб "зламався"
- Бібліотеки не можна було використовувати через невелику проблему (помилка, відсутність функціональності, "неправильна" поведінка), яку не вдалося змінити через зменшену видимість
- Проблема, яку не вдалося виправити, призвела до величезних, потворних і невдалих способів вирішення проблеми, коли переосмислення простої функції (приватної чи остаточної) могло б допомогти
І я насправді почав називати їх, поки питання не стало занадто довгим, і я вирішив їх усунути.
Мені подобається ідея не мати більше коду, ніж потрібно, більше видимості, ніж потрібно, більше абстракції, ніж потрібно. І це може спрацювати під час написання програми для кінцевого користувача, де кодом користуються лише ті, хто його пише. Але як це утримується, якщо код призначений для використання іншими розробниками, коли малоймовірно, що оригінальний розробник заздалегідь продумав усі можливі випадки використання, а зміни / рефактори важко / неможливо зробити?
Оскільки великі бібліотеки з відкритим кодом - це не нова річ, який найпоширеніший спосіб обробки видимості в таких проектах об'єктно-орієнтованими мовами?