Дозвольте мені передмовити це, кажучи, що я говорю насамперед про доступ до методів, і дещо меншою мірою, про маркування класів остаточним, а не для доступу до членів.
Стара мудрість
"позначати його приватним, якщо у вас немає вагомих причин не"
це мало сенс у дні, коли це було написано, перш ніж відкритий код домінував у бібліотечному просторі розробників та VCS / mgmt залежності. Завдяки Гитубу, Мейвіну та ін. вони стали гіпер спільними зусиллями. Тоді також можна було заробляти гроші, обмежуючи способи використання бібліотеки. Я провів, мабуть, перші 8 чи 9 років своєї кар’єри, чітко дотримуючись цієї «найкращої практики».
Сьогодні я вважаю це поганою порадою. Іноді є розумний аргумент для позначення методу приватним або остаточним класом, але він надзвичайно рідкісний, і навіть тоді він, мабуть, нічого не покращує.
Ти коли-небудь:
- Був розчарований, здивований чи пошкоджений бібліотекою тощо, який мав помилку, яку можна було виправити за допомогою спадкування та кількох рядків коду, але через приватні / остаточні методи та заняття змушені були чекати офіційного виправлення, яке може ніколи не настати? У мене є.
- Хотіли використати бібліотеку для дещо іншого випадку використання, ніж уявляли автори, але не змогли це зробити через приватні / заключні методи та класи? У мене є.
- Ви були розчаровані, здивовані чи пошкоджені бібліотекою тощо, що надмірно вседозволено в своїй розширюваності? Я не маю.
Це три найбільші раціоналізації, які я чув для методів маркування за замовчуванням:
Раціоналізація №1: Це небезпечно і немає жодних причин перекривати конкретний метод
Я не можу підрахувати, скільки разів я помилявся щодо того, чи виникне потреба у відміні певного способу, який я написав. Попрацювавши над кількома популярними відкритими джерелами, я навчився важко розуміти справжню вартість маркування речей. Це часто виключає єдине практичне рішення небачених проблем або випадків використання. І навпаки, я ніколи за 16+ років професійного розвитку не шкодував, щоб позначити метод, захищений замість приватного, з причин, пов’язаних із безпекою API. Коли розробник вирішує розширити клас і замінити метод, вони свідомо говорять "Я знаю, що роблю". і заради продуктивності, якої має бути достатньо. періоду. Якщо це небезпечно, відзначте це у класі / методі Javadocs, не просто сліпо заплющуйте двері.
Методи маркування, захищені за замовчуванням, є пом’якшенням для однієї з найважливіших проблем сучасного розвитку ПЗ: провал уяви.
Раціоналізація №2: Він підтримує чистоту публічного API / Javadocs
Цей варіант є більш розумним, і залежно від цільової аудиторії це навіть може бути правильним, але варто подумати про те, якою насправді є підтримка API "чистого": розширюваність. З причин, згаданих вище, напевно, має сенс позначити речі, захищені за замовчуванням, про всяк випадок.
Раціоналізація №3: Моє програмне забезпечення є комерційним, і мені потрібно обмежити його використання.
Це теж розумно, але, як споживач, я щоразу йду з менш обмежуючим конкурентом (припускаючи, що не існує значних відмінностей у якості).
Ніколи не кажи ніколи
Я не кажу, що ніколи не позначайте методи приватними. Я кажу, що найкращим правилом є "зробити методи захищеними, якщо немає вагомих причин цього не робити".
Ця порада найкраще підходить для тих, хто працює над бібліотеками або більш масштабними проектами, які були розбиті на модулі. Для менших або більше монолітних проектів це не має великого значення, оскільки ви так чи інакше керуєте всім кодом, і легко змінити рівень доступу до свого коду, якщо / коли вам це потрібно. Навіть тоді, я все одно дав би ту саму пораду :-)