Verwenden eines öffentlichen Eigentums UND eines öffentlichen Feldes


8

Wo ich arbeite, wird von der Verwendung von Eigenschaften abgeraten. Wir haben Tools zur Codegenerierung, um "Dinge zu beschleunigen". Alle Objektdaten sind öffentliche Felder. Wenn Sie trotzdem Eigenschaften anfordern, erhalten Sie ungefähr Folgendes:

Public sFoo as String

Public Property Foo as String
  Get
    Return sFoo
  End Get
  Set(ByVal value as String)
    sFoo = value
  End Set
End Property

Ich kann mir kein vernünftiges Argument dafür vorstellen. Gibt es gute Gründe, sowohl ein öffentliches Eigentum als auch ein öffentliches Feld zu nutzen?


2
Nein. Ändern Sie den Codegenerator, um eine öffentliche Zeichenfolge zu generieren. Foo {get; einstellen; } stattdessen
Steven A. Lowe

1
Gibt es Hinweise darauf, dass es die Dinge beschleunigt? Gibt es Hinweise darauf, dass der Code bei der Ausführung anders ist? Warum fragst du das; Sie wissen eindeutig bereits, dass dies dumm ist. Die Beweislast sollte bei der Person liegen, die diese Praxis durchführt. Wenn sie es nicht rechtfertigen können und Sie sie nicht dazu bringen können, sich zu ändern, würde ich einen neuen Job empfehlen!
Dave Hillier

4
Warum eine Ablehnung? Es ist die Schuld des Autors, dass es in seiner Firma dumme Richtlinien gibt.
Arseni Mourzenko

Möglicherweise sollte das Feld privat sein und von der Liegenschaft zurückgegeben werden. Vielleicht kannte jemand das Konzept irgendwie, hat aber viel durcheinander gebracht. Die Verwendung von privatem Feld als öffentliches Eigentum ist eine gute Codierungspraxis und wird auch dann verwendet, wenn Sie es nicht sehen.
Piotr Kula

Antworten:


28

Nein.

Dafür gibt es keinen guten Grund. Es:

  1. Verwirrt andere Programmierer, indem sie etwas tun, das keinen Sinn ergibt.
  2. Enthüllt die Innereien Ihrer Klasse unnötig,
  3. Bietet zwei Einstiegspunkte für dasselbe,
  4. ??

Verwenden Sie stattdessen automatisch implementierte Eigenschaften .


5
Befürwortet der Downvoter ernsthaft die gleichzeitige Nutzung öffentlicher Grundstücke UND Felder? Ich bin es ein bisschen leid, für jede Antwort, die ich poste, eine einzige Ablehnung zu haben ... Wenn Sie genug Zeit haben, mir zu folgen, um meine Antworten herunterzustimmen, brauchen Sie ein neues Hobby.
Robert Harvey

Jemand verfolgt dich, Robert. Nicht ich, denn dies ist definitiv die richtige Antwort und die Frage des OP hat mich verblüfft. Jahre des Lernens und Schreibens kamen mir nie in den Sinn, so etwas zu tun.
Piotr Kula

Ich habe auch gehört, dass einige argumentierten, dass die Verwendung von Eigenschaften eine Leistungseinbuße für den direkten Zugriff auf Felder mit sich bringt, aber im Allgemeinen ist dies nicht der Fall. In jeder Version der CLR, auf die ich jemals gestoßen bin, werden einfache Eigenschaften wie diese fast immer vom Optimierer eingefügt, sodass selbst das kein realistisches Problem darstellt.
Cole Campbell

2

Eines der grundlegenden objektorientierten Prinzipien heißt Encapsulation. Es heißt, dass jedes Objekt seine Daten vor Änderungen von außen schützen sollte.

Dies geschieht, indem alle Felder privat gemacht werden und wenn möglich auch alle Eigenschaftssetter privat gemacht werden. Stattdessen müssen Sie Verhalten einführen, indem Sie Methoden hinzufügen, mit denen der Status geändert wird.

Was Sie tun, ist sehr falsch. Im Wesentlichen handelt es sich nur um funktionale Programmierung, bei der alle Klassen nur Datencontainer oder eine Möglichkeit zur Gruppierung von Methoden sind. Ersteres ist ein Anti-Muster namens Anemic Domain Model .

Das Problem dabei ist, dass die Geschäftslogik für jedes Domänenmodell auf mehrere Stellen in Ihrer Anwendung verteilt ist (dh auf jede Stelle, an der das Objekt geändert wird). Daher ist es schwierig, Fehler im Zusammenhang mit Ihren Geschäftsregeln zu finden, da Sie jeden Ort analysieren müssen, an dem das Objekt verwendet wird, anstatt nur das Objekt selbst zu analysieren.

Ich habe darüber hier gebloggt : http://blog.gauffin.org/2012/06/protect-your-data/


1

Gibt es gute Gründe, sowohl ein öffentliches Eigentum als auch ein öffentliches Feld zu nutzen?

Kurzum: Nein , dafür gibt es keine Rechtfertigung. Die öffentlichen Immobilien haben mehr geschäftliche Nutzungen als öffentliche Felder.

Einige der vielen Verwendungszwecke von Eigenschaften sind:

  • Eigenschaften können Daten validieren, bevor eine Änderung zugelassen wird
  • Es kann Daten in einer Klasse transparent verfügbar machen, in der diese Daten tatsächlich aus einer anderen Quelle wie einer Datenbank abgerufen werden
  • Es kann eine Aktion ausführen, wenn Daten geändert werden, z. B. ein Ereignis auslösen oder den Wert anderer Felder ändern

Wie bereits vorgeschlagen, ist die Verwendung von Auto-Eigenschaften eine weitere clevere Methode.

Weitere Details finden Sie in den Eigenschaften von MSDN - VB.NET

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.