Se qualcuno scrive codice in modo che una variabile interna $ _fields sia accessibile senza usare i metodi getter / setter, viene usato un termine appropriato per descriverlo?
Qualcosa di abbastanza educato da usare con la gestione :)
Se qualcuno scrive codice in modo che una variabile interna $ _fields sia accessibile senza usare i metodi getter / setter, viene usato un termine appropriato per descriverlo?
Qualcosa di abbastanza educato da usare con la gestione :)
Risposte:
Esporre i membri privati non è mai una buona cosa nella società educata ...
Questa pratica è la mancanza / scarsa incapsulamento.
private
) ha ancora un'altra implementazione del concetto di incapsulamento.
__
per la modifica del nome). Anche altre lingue possono avere un'incapsulamento scadente, ad esempio la riflessione in Java e l'aritmetica del puntatore in C ++ per ottenere variabili private. Python semplicemente non rende la sintassi per farlo così ingombrante.
__
nome. Senza il __
, il design riflette ancora un buon incapsulamento. Affermare che "pubblico" significa "mancanza di / scarsa incapsulamento" è sbagliato. Il concetto è ancora presente. Il codice sorgente manca di decorazioni appropriate.
Oltre alla mancanza di incapsulamento già menzionato da Oded, a seconda del linguaggio di programmazione e dei suoi paradigmi potrebbe anche essere "semplici vecchi dati" (dove non è necessariamente un antipattern o un odore di codice).
Ho già sentito il termine "oggetto nudo".
Si chiama borsa di proprietà.
Di solito viene utilizzato per contenere un insieme di proprietà forse correlate (dove ognuna potrebbe essere potenzialmente un oggetto di classe con specificatori di accesso appropriati o meno). Ma la struttura circostante è solo una borsa di proprietà.
Si chiama "non seguire uno standard di codifica specifico".
L'OP ha scritto:
una variabile interna $ _fields è accessibile senza usare i metodi getter / setter
Ciò potrebbe essere in contrasto con il tuo standard e (quindi) potrebbe essere un odore di codice. Ma non è necessariamente un cattivo incapsulamento. Esporre una variabile interna (come in "solo per uso interno") su getter e setter al mondo esterno sarebbe ancora peggio.
La domanda è: dovrebbe $_fields
essere accessibile per il mondo esterno?
In tal caso, abbiamo un caso in cui dovresti aggiungere metodi getter / setter. Questi metodi non incapsulano nulla ma il fatto che $_fields
sia una variabile di qualche tipo (al contrario di qualcosa calcolato / recuperato / ecc. Al volo). A seconda della lingua, probabilmente perderai comunque il tipo (ovvero un dettaglio di implementazione) all'esterno. Sia che tu voglia sempre getter / setter, o solo quando "necessario" è un problema standard di codifica.
Se non$_fields
dovrebbe essere accessibile, allora, beh, non accedervi. Il fatto che si debba impedire ad altri di accedervi a livello linguistico (privato e amici) o meno (che potrebbe facilitare il debug in determinate circostanze) è, ancora una volta, un problema standard di codifica.
Il problema dell'incapsulamento è del tutto ortogonale a questo. La violazione dell'incapsulamento è assolutamente possibile con getter e setter. È ancora più facile infiltrarsi, perché la maggior parte delle campane d'allarme della gente non suona quando vedono un gruppo di getter e setter - codice che sembra seguire le migliori pratiche. Il codice, che potrebbe benissimo introdurre molte più dipendenze dai dettagli di implementazione interna rispetto a una variabile chiamata $_fields
che sembra non essere specificata come private
.
Sono un fan delle cattive analogie: chiamare quel cattivo incapsulamento è come chiamare qualcuno che detiene una pistola un assassino.
Vorrei chiamare tali variabili variabili membro pubblico .
se i tuoi metodi setter / getter non sono altro che
void setfoo(bar){foo=bar;}
foo getfoo{return foo;}
quindi semplicemente creare una variabile pubica significa semplicemente salvare un po 'di battitura al di fuori di alcuni casi limite in cui la differenza conta.