Wird ein Begriff verwendet, wenn interne Variablen als öffentlich und zugänglich deklariert werden?

10

Wenn jemand Code schreibt, damit auf eine interne Variable $ _fields zugegriffen werden kann, ohne Getter / Setter-Methoden zu verwenden, gibt es einen geeigneten Begriff, um dies zu beschreiben?

Etwas Höfliches genug für das Management :)

PeterB
quelle
9
Fehlende Verkapselung?
Oded
@Oded Ich denke, Sie haben Recht - mangelnde / schlechte Kapselung beschreibt es gut
PeterB
Die beiden Sätze, an die ich dachte, als ich versuchte, diese Frage zu beantworten, waren "undichte Abstraktion" und "loses Scoping" - worauf bezieht sich jeder von ihnen (außerhalb meines Kopfes)?
PeterB
1
Eine undichte Abstraktion tritt auf, wenn Sie versuchen, ein Konzept zu abstrahieren, dies jedoch nicht wirklich funktioniert. Die zugrunde liegenden Konzepte lecken immer noch (ORMs über SQL und Web-Frameworks über HTTP / HTML sind in der Regel undichte Abstraktionen).
Oded
@ PeterB - um Odeds Erklärung hinzuzufügen, siehe dies: joelonsoftware.com/articles/LeakyAbstractions.html
Joris Timmermans

Antworten:

30

Private Mitglieder zu entlarven ist in einer höflichen Gesellschaft niemals eine gute Sache ...

Diese Praxis ist das Fehlen / schlechte Einkapselung.

Oded
quelle
6
+1, Nun, Sie würden Ihre Privaten nicht ins Büro bringen, oder?
StuperUser
6
-1: Die Kapselung ist wirklich passiert und gut passiert. Es wurde jedoch nicht in der allgemein akzeptierten Weise durch den Quellcode dokumentiert . Einige Sprachen (wie Python) haben keine wirklich privaten Variablen, üben jedoch die Kapselung.
S.Lott
6
@Oded: Kapselung ist ein Design - Konzept . Unterschiedliche Sprachen haben unterschiedliche Implementierungen des Konzepts. Eine Sprache mit einer privaten Deklaration erlaubt eine Implementierung. Eine funktionale Programmiersprache mit zustandslosen Objekten kann eine andere Implementierung haben. Python (das fehlt private) hat noch eine weitere Implementierung des Konzepts der Kapselung.
S.Lott
1
@ S Lott; Oded - Die Kapselung ist gut und das Verlassen auf Code, auf den häufig direkt von anderen Klassen direkt auf private Variablen zugegriffen wird, ist eine schlechte Kapselung. In Python tun Sie dies, indem Sie auf namenverfälschte private Variablen einer anderen Klasse zugreifen oder Konventionen eines einzelnen Unterstrichpräfixes ignorieren (obwohl Ihr Getter ein anderes Verhalten __ausführt ; sollte dies wirklich für die Namensverfälschung verwenden). Andere Sprachen können ebenfalls eine schlechte Kapselung aufweisen, z. B. Reflexion in Java und Zeigerarithmetik in C ++, um auf private Variablen zuzugreifen. Python macht die Syntax dafür einfach nicht so umständlich.
Dr. Jimbob
2
@drjimbob: Python-Code verwendet selten __Namensmangel. Ohne das __spiegelt das Design immer noch eine gute Kapselung wider. Die Behauptung, dass "öffentlich" "mangelnde / schlechte Kapselung" bedeutet, ist falsch. Das Konzept ist noch vorhanden. Dem Quellcode fehlt eine angemessene Dekoration.
S.Lott
10

Neben dem von Oded bereits erwähnten Mangel an Kapselung können es sich je nach Programmiersprache und ihren Paradigmen auch um "einfache alte Daten" handeln (bei denen es sich nicht unbedingt um einen Antimuster- oder Codegeruch handelt).

Joris Timmermans
quelle
4

Ich habe den Begriff "nacktes Objekt" schon einmal gehört.

Raku
quelle
1
Es ist sicherlich eine verwirrende Art, diejenigen zu benennen, die das Naked Objects Pattern
Matthieu
1
Ja, das hat mich auch verwirrt.
Raku
2

Es wird eine Eigenschaftstasche genannt.

Normalerweise wird es verwendet, um eine Reihe von möglicherweise verwandten Eigenschaften zu speichern (wobei jedes möglicherweise ein Klassenobjekt ist, das über geeignete Zugriffsspezifizierer verfügt oder nicht). Aber die umgebende Struktur ist nur eine Tasche von Eigenschaften.

Martin York
quelle
2

Es heißt "nicht einem bestimmten Codierungsstandard folgen".

Das OP schrieb:

Auf eine interne Variable $ _fields kann ohne Verwendung von Getter / Setter-Methoden zugegriffen werden

Das könnte gegen Ihren Standard verstoßen, und (daher) könnte es Code-Geruch sein. Aber es ist nicht unbedingt eine schlechte Verkapselung. Noch schlimmer wäre es, eine interne Variable (wie in "nur für den internen Gebrauch") über Getter und Setter der Außenwelt auszusetzen.

Die Frage ist: sollte $_fieldsfür die Außenwelt zugänglich sein?

Wenn ja, haben wir einen Fall, in dem Sie Getter / Setter-Methoden hinzufügen würden. Diese Methoden kapseln nichts anderes als die Tatsache, dass $_fieldses sich um eine Variable handelt (im Gegensatz zu etwas, das im laufenden Betrieb berechnet / abgerufen / usw. Wird). Abhängig von der Sprache wird der Typ (auch als Implementierungsdetail bezeichnet) wahrscheinlich immer noch nach außen übertragen. Ob Sie immer Getter / Setter wollen oder nur, wenn "benötigt", ist ein Standardproblem bei der Codierung.

Wenn $_fieldssollte nicht erreichbar sein, dann, na ja, greift es nicht. Ob Sie andere davon abhalten sollten, auf Sprachebene (privat und mit Freunden) darauf zuzugreifen oder nicht (was unter bestimmten Umständen das Debuggen erleichtern könnte), ist wiederum ein Standardproblem bei der Codierung.

Das Problem der Einkapselung ist dazu völlig orthogonal. Eine Verletzung der Kapselung ist mit Gettern und Setzern absolut möglich. Es ist noch einfacher , sich darauf einzulassen, da die Alarmglocken der meisten Menschen nicht läuten, wenn sie eine Reihe von Gettern und Setzern sehen - Code, der anscheinend den Best Practices folgt. Code, der sehr wohl viel mehr Abhängigkeiten von internen Implementierungsdetails mit sich bringt als eine Variable namens $_fields, die zufällig nicht als angegeben wird private.

Ich bin ein Fan von schlechten Analogien: Diese schlechte Verkapselung zu nennen, ist wie jemanden, der eine Waffe in der Hand hält, als Mörder zu bezeichnen.

rwos
quelle
1

Ich würde solche Variablen als öffentliche Mitgliedsvariablen bezeichnen .

Olivier Jacot-Descombes
quelle
-2

wenn Ihre Setter / Getter-Methoden nichts anderes sind als

void setfoo(bar){foo=bar;}
foo getfoo{return foo;}

Wenn Sie dann nur eine öffentliche Variable erstellen, sparen Sie nur einige Eingaben außerhalb einiger Randfälle, in denen der Unterschied von Bedeutung ist.

Ryathal
quelle
3
Nur weil das alles ist, was Ihre Getter und Setter jetzt tun, heißt das nicht, dass es immer so sein wird. Und wenn das Hinzufügen einer Validierung zu einem Setter das Durchkämmen von Zehntausenden von Codezeilen erfordert, um überall dort zu finden, wo auf die Eigenschaft zugegriffen wird, werden Sie sofort das Dutzend Sekunden verlieren, das Sie sich selbst gespart haben, indem Sie die Kapselung beim ersten Mal absichtlich vermeiden.
Plutor
@Plutor: Wenn das alles ist, was das Objekt jemals tun wird (z. B. weil es eine Nachricht darstellt, die an einen anderen Prozess oder einen Datensatz in einer Datenbank gesendet wurde), ist es in Ordnung. das sind Dinge , die sollte hoch konserviert werden.
Donal Fellows