Ist es eine schlechte Praxis, eine Eigenschaft / ein Element mit dem deklarierenden Typ in C # zu benennen?

25

Zum Beispiel eine Klasse wie:

class Dog { } //never mind that there's nothing in it...

und dann eine Eigenschaft wie:

Dog Dog { get; set; }

Mir wurde gesagt, wenn ich keinen einfallsreicheren Namen dafür finden kann, muss ich Folgendes verwenden:

Dog DogObject { get; set; }

Irgendwelche Gedanken darüber, wie man diese besser benennt?

Sturm Kiernan
quelle
2
Diese Anforderung, von der Ihnen berichtet wurde, scheint hirntot zu sein, möglicherweise weil eine gute Richtlinie zu stark durchgesetzt wurde (verwenden Sie nicht nur den Typnamen, wenn es einen besseren Namen gibt).
2
Dies wird nicht einmal in C # kompiliert, da Mitgliedsnamen nicht mit dem einschließenden Typ identisch sein können.
Lee
3
@Lee: Ich denke der Kontext ist, dass die Eigenschaft in einem anderen Typ ist. ZB eine PersonKlasse mit einer DogEigenschaft namensDog
goric
3
Ich meine, wenn sie wirklich eine Hündin ist, kennzeichnen Sie sie als solche.
Thomas Eding
1
Die Syntaxhervorhebung Ihrer IDE sollte den Typ und die Eigenschaft unterscheiden. Wenn Sie keine IDE verwenden, können Sie immer den Kontext betrachten.
Cyanfish

Antworten:

22

Es könnte eine schlechte Praxis sein, wenn nicht klar ist, wovon Sie in Ihrem Code sprechen, basierend auf dem Kontext.

Dog = new Dog();

Welches ist der Typkonstruktor? Welches ist das Objekt? Nicht verwirrt? OK, wie wäre es

Dog = Dog.Create()?

Welches ist das Objekt? Welches ist die statische Fabrikmethode für den Typ? Immer noch nicht verwirrt? Das habe ich nicht gedacht.

Das einzige Mal, dass ich gesehen habe, dass dies ein potenzielles Problem ist, wenn der Namespace-Baum ziemlich umfangreich wird und der Compiler die Mehrdeutigkeit nicht herausfinden kann

Dog = new Some.Namespace.Dog();

In jedem Fall sollte dies nur mit automatischen Eigenschaften (und möglicherweise Aufzählungen) geschehen, da lokale Variablennamen immer in CamelCased-Form vorliegen, wodurch die Mehrdeutigkeit vollständig vermieden wird.

dog = new Dog();
Robert Harvey
quelle
7
+1. Und die Alternativen sind alle schlechter: "TheDog", "AnyDog", "MyDog" usw. Wenn nichts hinzuzufügen ist, ist es am besten, nichts hinzuzufügen.
Kevin Cline
Ich nehme an, dass das zweite verwirrend werden könnte, wenn aus irgendeinem Grund Dogeine Instanzmethode aufgerufen würde Create, aber Sie würden an diesem Punkt in einige ziemlich schreckliche Codierungspraktiken eintauchen.
KDiTraglia
40

Dies ist nicht nur eine vernünftige Praxis, sondern die Sprache wurde speziell dafür entwickelt. Durchsuchen Sie die C # -Spezifikation nach "Color Color" nach den Regeln und einer Begründung und suchen Sie nach

http://blogs.msdn.com/b/ericlippert/archive/2009/07/06/color-color.aspx

für einige interessante Eckfälle, die sich aus dieser Entscheidung ergeben.

Nennen Sie eine Eigenschaft unter keinen Umständen "DogObject", um zu vermeiden, dass sie den gleichen Namen wie ihr Typ hat. Dies steht in direktem Widerspruch zu den Rahmenkonstruktionsrichtlinien.

Eric Lippert
quelle
Wenn es sich bei dem Eigenschaftstyp um einen Typ handelt, dessen Instanzen keine Identität haben (z. B. Color), erscheint eine solche Verwendung angemessen. Ich mag es jedoch nicht so sehr mit veränderlichen oder IDisposableTypen. Bezieht sich "ein Steuerelement Font" auf die Aspekte des Zustands, die von der Eigenschaft eingekapselt werden, oder auf die Instanz, Fontdie vom Eigenschafts-Getter identifiziert wurde?
Supercat
7

Es ist völlig in Ordnung, es so zu nennen, Dogund genau das empfiehlt Microsoft in den Framework-Benennungsrichtlinien :

BEACHTEN SIE, dass eine Eigenschaft denselben Namen wie ihr Typ hat.

Mit der folgenden Eigenschaft wird beispielsweise ein Aufzählungswert mit dem Namen "Color" richtig abgerufen und festgelegt, sodass die Eigenschaft den Namen "Color" hat.

Und hier ist das Beispiel, das sie in der obigen Anleitung verwenden:

public enum Color {...}
public class Control {
    public Color Color { get {...} set {...} }
}
Isak Savo
quelle