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?


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();

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.


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 {...} }
}
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.