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 :)
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 :)
Antworten:
Private Mitglieder zu entlarven ist in einer höflichen Gesellschaft niemals eine gute Sache ...
Diese Praxis ist das Fehlen / schlechte Einkapselung.
private
) hat noch eine weitere Implementierung des Konzepts der Kapselung.
__
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.
__
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.
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).
Ich habe den Begriff "nacktes Objekt" schon einmal gehört.
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.
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 $_fields
fü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 $_fields
es 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 $_fields
sollte 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.
Ich würde solche Variablen als öffentliche Mitgliedsvariablen bezeichnen .
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.