One of the first things I do when I subclass a class is to change a
bunch of private methods to protected
Alcuni ragionamenti su private
rispetto a protected
metodi :
I metodi
private
impediscono il riutilizzo del codice. Una sottoclasse non può utilizzare il codice nel metodo privato e potrebbe doverlo implementare di nuovo o implementare nuovamente i metodi che originariamente dipendono dal metodo privato & c;
D'altra parte, qualsiasi metodo che sia non private
può essere visto come un'API fornita dalla classe a "il mondo esterno", nel senso che le sottoclassi di terze parti sono considerate "mondo esterno", come già suggerito da qualcun altro nella sua risposta.
È una cosa brutta? - Io non la penso così
Naturalmente, un'API (pseudo) pubblica blocca il programmatore originale e ostacola il refactoring di tali interfacce. Ma visto il contrario, perché un programmatore non dovrebbe progettare i propri "dettagli di implementazione" in un modo tanto pulito e stabile quanto la sua API pubblica? Dovrebbe usare private
in modo che possa essere trascurato nel strutturare il suo codice "privato"? Pensando forse che potrebbe ripulirlo più tardi, perché nessuno se ne accorgerà? - No.
Il programmatore dovrebbe anche mettere un po 'di pensiero nel suo codice "privato", per strutturarlo in un modo che consenta o addirittura promuova il riutilizzo di quanto più possibile in primo luogo. Quindi le parti non private potrebbero non diventare tanto pesanti in futuro quanto alcuni temono.
Un sacco di codice (framework) che vedo adotta un uso incoerente di private
: protected
, metodi non definitivi che a malapena fanno qualcosa di più della delega a un metodo privato si trovano comunemente. protected
, metodi non finalizzati il cui contratto può essere soddisfatto solo tramite l'accesso diretto ai campi privati.
Questi metodi non possono essere sovrascritti / migliorati logicamente, sebbene tecnicamente non ci sia nulla da fare per renderlo (compilatore) ovvio.
Vuoi estendere ed ereditare? Non rendere i tuoi metodi private
.
Non vuoi alterare certi comportamenti della tua classe? Crea i tuoi metodi final
.
Davvero non puoi avere il tuo metodo chiamato al di fuori di un certo contesto ben definito? Rendi il tuo metodo private
e / o pensa a come puoi rendere disponibile il contesto richiesto ben definito per riutilizzarlo attraverso un altro metodo di wrapping protected
.
Ecco perché sostengo di usare private
con parsimonia. E per non confondere private
con final
. - Se l'implementazione di un metodo è vitale per il contratto generale della classe e quindi non deve essere sostituita / sostituita, rendila final
!
Per i campi, private
non è davvero male. Finché i campi possono essere ragionevolmente "utilizzati" con metodi appropriati (cioè non getXX()
o setXX()
!).