Getter, Setter mit Access-Modifier und Anwendungsgebiete

  • Allgemein

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Getter, Setter mit Access-Modifier und Anwendungsgebiete

    Wieder was dazugelernt:

    VB.NET-Quellcode

    1. Private _Foo As Bar
    2. Public Property Foo As Bar
    3. Get
    4. Return _Foo
    5. End Get
    6. Friend Set(value As Bar)
    7. _Foo = value
    8. End Set
    9. End Property

    Man kann, wie in C#, einem Getter oder Setter eine andere Sichtbarkeit geben, als die der eigentlichen Property.

    Ich kann mich an keine Situation erinnern, bei der für mich ein Protected Setter für eine (z.B. Public) Property am meisten Sinn gemacht hätte.
    Meine Gedanken dazu hier vollständig zu erklären würde ewig dauern, dasshalb kurz: Protected Sub SetFoo(NewValue As Bar)

    In ein eigenes Topic ausgelagert. ~nikeee
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „nikeee13“ ()

    Da der Compiler aus Propertys ja sowieso ein get_Foo() bzw. set_Foo(value) macht, warum nicht?

    Ich glaube es gibt nur 2 Gründe, explizite Set- oder Get-Methoden zu machen: 1. Weil man vielleicht mehr Parameter braucht und 2. um zu verdeutlichen, dass der Aufruf gewisse Laufzeitkosten hat.
    Von meinem iPhone gesendet
    Ok, ein ganz vereinfachtes Beispiel:
    Jeder Punkt ist teil eines Raumes. Es kann keinen Punkt ohne einen Raum geben.

    VB.NET-Quellcode

    1. Class Point
    2. Public Property X As Double
    3. Public Property Y As Double
    4. Public? Property Owner As Space
    5. Public Sub New(NewOwner, NewX, NewY)
    6. End Class
    Warum auch immer der Punkt jetzt einen Raum benötigt. Es passiert in der Praxis öfter, dass Objekte gültige Verweise auf andere Objekte benötigen, damit sie korrekt funktionieren können.
    Die X- und Y-Eigenschaften des Punktes zu ändern sollte jedem logisch erscheinen. Der Punkt befindet sich dann halt einfach an einer anderen Stelle. Das ist ja der Sinn von Eigenschaften.
    Aber der Owner-Property einen öffentlichen Setter zu geben kann problematisch werden, denn das ist keine Eigenschaft wie X und Y, die man einfach so ändern wollen würde. Deshalb würde ich die ReadOnly machen und nur über den Konstruktor setzbar machen.
    Sollte man es jetzt aber trotzdem mal wirklich benötigen, zuerst ein Point-Objekt ohne Owner zu erstellen und den Owner später zu setzen, würde ich eine separate Methode à la SetOwner verwenden und diese entsprechend dokumentieren, weil man sonst das Gefühl bekommt, dass man die Owner-Property nach belieben verändern kann.

    Wie von nikeee13 angedeutet kann es durchaus gute Gründe haben, eine separate Methode zu verwenden.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    In Properties kannst du genauso eine ArgumentNullException schmeißen, wenn null nicht gestattet sein soll, Framework-Klassen machen das nicht anders. Setter-Funktionen sind bei einer vorhandenen Property obsolet und in den Guidelines steht das auch irgendwo.
    Es geht nicht nur darum, dass Point.Owner = Nothing oder Point.Owner = EinAndererRaum ungültig wäre, sondern es geht darum, dass man das im Normalfall gar nicht erst probieren sollte. Und der Property einen Setter zu geben verleitet eben ganz stark dazu.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Wer sich absichtlich über eine Dokumentation hinwegsetzen möchte den wird das auch nicht davon abhalten. Wenn derjenige weiß, was er tut, ists eh egal, und wer das nicht weiß, darf sich über unerwartetes Verhalten nicht wundern. Als API-Entwickler ist es nicht deine Aufgabe, die Benutzer der API zu bemuttern, sondern eine klare Dokumentation abzuliefern.
    Im Beispiel mit dem Raum würde man dem Raum wohl eine Public AddPoint - Methode geben, und den Raum-Setter des Points Friend machen, damit zwar innerhalb der Api der Raum sich als des Punktes Raum festlegen kann, aber von aussen nicht.

    Eine Property, deren Setter bei missliebigen Werten Fehler schmeißt, fände ich auch sehr ungewöhnlich. Plausibel eiglich nur etwa bei Progressbar etc, wo eine ausgewiesene Maximum-Property damit korrespondiert.
    Sonst fallen mir keine Beispiele ein.
    Oder bei DataRows, wenn in der DataTable AllowNull.False festgelegt ist.

    Also wir wollen sie ja nicht bemuttern, aber eine Api sollte halt alles dransetzen, möglichst niemals mit Überraschungen aufzuwarten - auch wenn's eiglich dokumentiert gewesen wären.