Esiste un termine usato quando le variabili interne sono dichiarate pubbliche e accessibili?


10

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 :)


9
Mancanza di incapsulamento?
Oded,

@Oded Penso che tu abbia ragione - la mancanza / scarsa incapsulamento lo descrive bene
PeterB,

Le due frasi a cui ho pensato mentre cercavo di rispondere a questa domanda erano "astrazione che perde" e "oscillazione libera" - a cosa si riferiscono ognuna di queste (fuori dalla mia testa)?
PeterB,

1
L'astrazione perdente si verifica quando si tenta di astrarre un concetto ma in realtà non funziona: i concetti sottostanti continuano a fuoriuscire (ORM su SQL e framework Web su HTTP / HTML tendono ad essere astrazioni che perdono).
Oded,

@PeterB - per aggiungere alla spiegazione di Oded, vedi questo: joelonsoftware.com/articles/LeakyAbstractions.html
Joris Timmermans il

Risposte:


30

Esporre i membri privati ​​non è mai una buona cosa nella società educata ...

Questa pratica è la mancanza / scarsa incapsulamento.


6
+1, beh, non porteresti i tuoi privati ​​in ufficio, vero?
StuperUser

6
-1: L'incapsulamento è realmente accaduto ed è successo bene. Ma non è stato documentato attraverso il codice sorgente nel modo comunemente accettato. Alcuni linguaggi (come Python) mancano di variabili veramente private, ma praticano ancora l'incapsulamento.
S.Lott

6
@Oded: l'incapsulamento è un concetto di design . Lingue diverse hanno diverse implementazioni del concetto. Una lingua con una dichiarazione privata consente una implementazione. Un linguaggio di programmazione funzionale con oggetti stateless potrebbe avere un'implementazione diversa. Python (che manca private) ha ancora un'altra implementazione del concetto di incapsulamento.
S.Lott

1
@S Lott; Oded - L'incapsulamento è buono e fare affidamento sul codice in cui le variabili private sono frequentemente accessibili direttamente da altre classi è un'incapsulamento scadente. In Python, lo fai accedendo alle variabili private distorte dal nome di un'altra classe o ignorando le convenzioni di un singolo prefisso di sottolineatura (anche se se il tuo getter sta facendo un altro comportamento, dovrebbe davvero usare __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.
dr jimbob,

2
@drjimbob: il codice Python usa raramente la modifica del __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.
S.Lott

10

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).



2

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à.


2

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 $_fieldsessere 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 $_fieldssia 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 $_fieldsche 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.



-2

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.


3
Solo perché questo è tutto ciò che fanno ora i tuoi getter e setter non significa che sarà sempre così. E se l'aggiunta della convalida a un setter richiede la ricerca di decine di migliaia di righe di codice per trovare ovunque si acceda a quella proprietà, si soffieranno istantaneamente la dozzina di secondi che hai salvato evitando volutamente l'incapsulamento la prima volta.
Plutor,

@Plutor: se è tutto ciò che l'oggetto potrà mai fare (ad es. Perché rappresenta un messaggio inviato a un altro processo o un record in un database), allora va bene; quelle sono cose che dovrebbero essere altamente conservate.
Donal Fellows,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.