Dopo aver letto alcune risposte il mio primo punto sarebbe che in questo contesto non credo che dovrebbe equivale a dire deve che non è lo stesso che dire devo , penso che tu stia forse sottolineando always .
-
dovrebbe implica che ci sia un consenso generalizzato sul fatto che questo è un approccio migliore o più appropriato
- tu dovresti dichiarare sempre i tuoi membri privati
-
deve implica che questo è il modo in cui è fatto
- tu devi dichiarare sempre i tuoi membri privati
-
devono non implica altre opzioni
- tu devi dichiarare sempre i tuoi membri privati
Effettivamente in tutti e tre gli esempi (in particolare data la circostanza da cui deriva questa domanda) si dovrebbe e IMO dovrebbe (anche se non deve o deve) interrogare qualsiasi istruzione posta loro, questo è il modo in cui si programma il miglior computer di tutti. Ad esempio se qualcuno dicesse che dovresti sempre fare qualcosa nonostante tu sappia che questa volta sarebbe dannoso se lo facessi senza mettere in discussione il loro razionale?
Immagino che in questo caso il tuo tutor (molto probabilmente per facilità) ti abbia ipotizzato, una pratica migliore che in effetti io (e forse molti altri) sarei d'accordo. La domanda che ritengo non dovrebbe mai essere la ragione per cui rendere un membro privato, ma in realtà l'inverso sul perché renderlo pubblico, prendendo come esempio facebook, le persone amano chiaramente divulgare informazioni su se stessi ma, anche allora, forse solo i miei amici possono vederlo la mia famiglia può vederlo, e tu che non conosco non puoi vedere nulla.
Riportando questo a OOP e in particolare a Java, una delle ragioni principali per i getter e setter è IMO (e potrei sbagliarmi) un caso di buona pratica semantica, tu obj.getState()
e obj.setState()
in contrapposizione a obj.state
e obj.state = 'foo'
, in entrambi i casi direi che il processo per farlo è imperativo. Mi piacerebbe pensare che l'orientamento all'oggetto non sia solo l'allontanamento da questo paradigma, ma tra l'altro incapsulare dati e funzioni in una componente riutilizzabile. Se non abbiamo nascosto nulla, ci ritroviamo con uno spazio dei nomi per la memorizzazione di dati e metodi?
Un altro punto chiave, credo, si riduce a scavalcare, le classi che ereditano da una classe super contenente variabili pubbliche sono ora bloccate da una variabile pubblica che a mio parere sembra possa portare a una diminuzione della riutilizzabilità. Usando getter e setter hai fornito un modo per le sottoclassi di sovrascrivere l'accesso alle tue variabili, magari aggiungendo quel bit di convalida che non ti sei mai preso la briga.
Per quanto sia noioso per quanto riguarda la scrittura di getter e setter questo è veramente nullo, perché penso che la maggior parte degli IDE farà molto di questo per te (e come ho appena trovato lombok che sembra piuttosto interessante e mi ricorda @property
ecc in obiettivo-c)
In breve sì dovresti usare sempre membri privati a meno che tu non abbia una buona ragione per non farlo (i DTO sarebbero, in una certa misura, un'eccezione ragionevole)