Nel codice ci sono dichiarazioni private e pubbliche. Perché non dovrei rendere tutto privato o rendere tutto pubblico?
Nota che i modificatori di accesso esistono in alcune lingue, ma non in tutte le lingue. Python, per esempio, non ha modificatori di accesso, ma i programmatori Python usano ancora una convenzione di denominazione (nomi che iniziano con un carattere di sottolineatura) per marcare alcuni metodi come non adatti per essere chiamati da altre classi.
Le classi comunicano con gli altri attraverso interfacce . Un'interfaccia è un contratto attraverso il quale una classe dice al mondo cosa possono fare le altre classi: quali metodi chiamare, con quali parametri, ecc.
Se hai una classe molto semplice, è facile stipare tutto in pochi metodi pubblici di base. Col passare del tempo, la classe crescerà. Da questo momento, hai una scelta:
O per continuare a inserire sempre più codice in alcuni metodi che avevi inizialmente,
O crea metodi aggiuntivi.
Nel primo caso, sei fregato: la manutenzione del codice scenderà rapidamente e nel tempo ti troverai incapace di modificare ulteriormente il codice.
Nel secondo caso, i tuoi metodi rimangono abbastanza piccoli da poter essere mantenuti, ma ce ne sono sempre di più. La tua interfaccia con il mondo cresce, il che diventa molto problematico: altri sviluppatori che hanno bisogno di chiamare il tuo metodo semplicemente si perdono in centinaia di metodi che possono chiamare. Ancora peggio, alcuni metodi potrebbero essere rischiosi da chiamare, perché mettono la classe in uno stato incoerente: sai che hai bisogno, per esempio, di chiamare un altro metodo prima o dopo quello problematico, ma il mondo non lo sa.
In questo caso, li cambierai come privati. Alcuni metodi che consentono al mondo di interagire con la classe resteranno pubblici; i metodi che non aiutano le altre classi rimarranno nascosti.
Immagina una classe Lamp
che può essere trasformata in on()
e off()
attraverso uno smartphone. Fin qui tutto bene, entrambi i metodi sono pubblici.
Tuttavia, è una lampada intelligente. Se non c'è la lampadina, la lampada dovrebbe emettere un suono e rifiutarsi di accendersi (perché questo sarebbe rischioso: cosa succede se un bambino scollega la lampadina e sta giocando con i contatti?)
Puoi estendere on()
di:
Alcune modifiche del genere e il tuo on()
diventerà impossibile da mantenere. Quindi, invece, creerai metodi aggiuntivi:
detectBulb()
determina se il bulbo è lì, beep()
emette un suono. Ora la tua classe fornisce quattro metodi. Tuttavia, non ci sono motivi per renderli disponibili agli altri: perché ogni altra classe beep()
della tua lampada o perché dovrebbe preoccuparsi se la lampadina è lì o no?
Quindi li rendi privati.
Come già spiegato da JacquesB ed EJoshuaS, rendere tutto privato in una classe non ha senso: sarai in grado di inizializzare una nuova istanza della classe (a meno che tu non abbia reso privato anche il suo costruttore), e niente altro, che ... non ti aiuterà troppo a creare applicazioni sorprendenti.
Mentre i metodi privati potevano ancora essere accessibili tramite Reflection, non riesco a immaginare alcun caso valido in cui ti piacerebbe farlo.
Ovviamente puoi creare un programma che ha solo una classe in cui tutto (tranne il costruttore) è privato. Ancora una volta, ci sono alcuni casi validi in cui vorrai farlo in una vera applicazione.
Nota che c'è molto più di public
e private
. Esistono metodi che possono essere chiamati dai bambini, ma non da altre classi: questo è chiamato protected
.
Se il tuo linguaggio di programmazione ha spazi dei nomi (Java e C # do), ci sono possibilità che esista anche un modificatore di accesso internal
che agisce come private
ma nell'ambito di uno spazio dei nomi. Solitamente verrà combinato con altri modificatori di accesso che formano public internal
o protected internal
.
Prova a rendere tutto privato. Noterai rapidamente che nulla funzionerà, dal momento che nessuna classe è in grado di accedere a qualsiasi altra classe.
Ovviamente, non puoi rendere tutto privato (a meno che non intendi provare a eseguire tutte le tue chiamate di metodo sull'oggetto tramite la riflessione, il che ucciderebbe il punto) - ciò significherebbe che la tua classe non esporrà alcuna funzionalità a altre classi, il che renderebbe piuttosto inutile.
Sicuramente non vuoi rendere tutto pubblico, dal momento che molti dei tuoi metodi / campi / proprietà non stanno esponendo funzionalità pubbliche, sono solo lì per implementarlo.
Leggi altre domande sui tag object-oriented c# java