Consentitemi di prefigurarlo dicendo che sto parlando principalmente dell'accesso al metodo qui e, in misura leggermente minore, che segna le classi come finali, non l' accesso dei membri.
La vecchia saggezza
"contrassegnalo come privato a meno che tu non abbia una buona ragione per non farlo"
aveva senso nei giorni in cui era stato scritto, prima che open source dominasse lo spazio della libreria per sviluppatori e VCS / dependency mgmt. divenne iper collaborativo grazie a Github, Maven, ecc. All'epoca c'erano anche soldi da fare limitando il modo (i) in cui una biblioteca poteva essere utilizzata. Ho trascorso probabilmente i primi 8 o 9 anni della mia carriera aderendo rigorosamente a questa "best practice".
Oggi credo che sia un cattivo consiglio. A volte c'è un'argomentazione ragionevole per contrassegnare un metodo come privato o un finale di classe ma è estremamente raro, e anche allora probabilmente non sta migliorando nulla.
Hai mai:
- Sei stato deluso, sorpreso o ferito da una libreria ecc. Che aveva un bug che avrebbe potuto essere risolto con ereditarietà e poche righe di codice, ma a causa di metodi e classi privati / finali sono stati costretti ad aspettare una patch ufficiale che potrebbe non arrivare mai? Io ho.
- Volevi usare una libreria per un caso d'uso leggermente diverso da quello immaginato dagli autori ma non sei stato in grado di farlo a causa di metodi e classi privati / finali? Io ho.
- Sei stato deluso, sorpreso o ferito da una biblioteca ecc. Che era troppo permissivo nella sua estensibilità? No.
Queste sono le tre maggiori razionalizzazioni che ho sentito per impostazione predefinita dei metodi di marcatura:
Razionalizzazione n. 1: non è sicuro e non c'è motivo di ignorare un metodo specifico
Non riesco a contare il numero di volte in cui ho sbagliato a stabilire se ci sarà o meno la necessità di sostituire un metodo specifico che ho scritto. Avendo lavorato su diverse popolari librerie open source, ho imparato a mie spese il vero costo di contrassegnare le cose come private. Spesso elimina l'unica soluzione pratica a problemi imprevisti o casi d'uso. Al contrario, non l'ho mai fatto rimpianto in oltre 16 anni di sviluppo professionale di contrassegnare un metodo protetto anziché privato per motivi legati alla sicurezza delle API. Quando uno sviluppatore sceglie di estendere una classe e sovrascrivere un metodo, stanno consapevolmente dicendo "So cosa sto facendo". e per motivi di produttività dovrebbe essere sufficiente. periodo. Se è pericoloso, annotalo nella classe / metodo Javadocs, non chiudere semplicemente alla cieca la porta.
I metodi di marcatura protetti per impostazione predefinita sono una mitigazione di uno dei principali problemi dello sviluppo del software moderno: fallimento dell'immaginazione.
Razionalizzazione n. 2: mantiene pulite le API pubbliche / Javadocs
Questo è più ragionevole e, a seconda del pubblico di destinazione, potrebbe anche essere la cosa giusta da fare, ma vale la pena considerare quale sia il costo di mantenere "pulito" l'API: estensibilità. Per i motivi sopra menzionati, probabilmente ha più senso contrassegnare le cose protette di default per ogni evenienza.
Razionalizzazione n. 3: il mio software è commerciale e devo limitarne l'uso.
Anche questo è ragionevole, ma come consumatore andrei con il concorrente meno restrittivo (supponendo che non esistano differenze significative di qualità) ogni volta.
Mai dire mai
Non sto dicendo di non contrassegnare mai i metodi come privati. Sto dicendo che la migliore regola empirica è "rendere i metodi protetti a meno che non ci sia una buona ragione per non farlo".
Questo consiglio è più adatto a coloro che lavorano su biblioteche o progetti su larga scala che sono stati suddivisi in moduli. Per progetti più piccoli o più monolitici non ha molta importanza poiché controlli comunque tutto il codice ed è facile cambiare il livello di accesso del tuo codice se / quando ne hai bisogno. Anche allora, darei comunque lo stesso consiglio :-)