myCSharp.de - DIE C# und .NET Community (https://www.mycsharp.de/wbb2/index.php)
- Knowledge Base (https://www.mycsharp.de/wbb2/board.php?boardid=68)
-- Artikel (https://www.mycsharp.de/wbb2/board.php?boardid=69)
--- [Artikel] C#: Richtlinien für die Namensvergabe (https://www.mycsharp.de/wbb2/thread.php?threadid=116597)


Geschrieben von LaTino am 17.02.2016 um 16:35:
  [Artikel] C#: Richtlinien für die Namensvergabe
C#: Richtlinien für die Namensvergabe

Motivation

Wie für jede Programmiersprache existieren auch für C# Vorschläge und Richtlinien, wie einzelne Sprachelemente zu benennen sind. Diese Richtlinien gestatten es anderen Entwicklern, euren Code schneller zu lesen und sich dabei auf das Wichtige zu konzentrieren: das Programm. Sie werden auch euch selbst helfen, den eigenen Code nach einigen Monaten Pause schneller zu verstehen.

Microsoft hat bei der Entwicklung von C# einige Namenskonventionen bereits vorgeschlagen. Einige davon sind so gut wie überall anerkannt, andere führen gern zu regen Diskussionen.
Die von Microsoft vorgeschlagenen Konventionen finden sich  zum Nachlesen in der MSDN, bei den  Framework-Design-Guidelines.

Es gibt hier kein "richtig" oder "falsch". Aber die vorgeschlagenen Konventionen sind in der Praxis erprobt und für gut befunden worden. Die Vorschläge sollen euch helfen, einen eigenen Programmierstil zu entwickeln, der von anderen Programmierern schneller verstanden wird.


Schreibweisen

Zu den Möglichkeiten, Sprachelemente zu benennen, gehören Groß- und Kleinschreibung,  Binnen-Majuskel, Präfixe und Suffixe (Postfixe).Für die gängigen Konventionen in C# sind lediglich PascalCase und camelCase von Bedeutung. Die ungarische Notation wird der Vollständigkeit halber erwähnt, sollte in C# aber nicht mehr verwendet werden - dieser Hinweis richtet sich insbesondere an die Umsteiger aus der C-Welt, wo die ungarische Notation recht verbreitet ist.


Richtlinien für die Schreibweise von Sprachelementen

camelCase

Lokale Variablen
Ausnahme: Zählvariablen in For()-Anweisungen dürfen einfach "i" oder "j" heißen. Solltet ihr irgendwann ein "k" brauchen, ist euer Code zu verschachtelt.
Benutzt einen Namen, der den Zweck der Variable deutlich beschreibt.

C#-Code:
for(var i = 0; i < 100; i++)
{
    ProductCategory productCategory = GetProductCategory(i);
}

Methodenparameter:

C#-Code:
protected abstract string GetProductName(int productCategoryId);

(Private) Membervariablen:
Private Klassenmember sind das Sprachelement, das am seltensten von anderen Entwicklern gesehen wird. Dem entsprechend existieren mehrere Möglichkeiten der Schreibweise - wichtig ist hier wie überall, dass man, wenn man sich für eine Variante entschieden hat, sie IMMER benutzen sollte.
Die Varianten mit einem Präfix (zB. dem Unterstrich) gehen oft mit der Konvention einher, gleichzeitig auf den this.-Qualifizierer zu verzichten, weil der Präfix die Variable bereits klar als Member kennzeichnet.
Konstante Membervariablen werden in einigen Stilen mit durchgehender Großschreibweise und Unterstrichen geschrieben, meistens aber nicht durch die Schreibweise zusätzlich unterschieden.

C#-Code:
public class Product
{
    private int productCategoryId;
    protected int _productCategoryId; //vorangestellter Unterstrich
    private int m_productCategoryId;  //vorangestellte m_
    private const int CATEGORY_ID_LIMIT = 5; //selten
}

PascalCase

Namespaces, Klassen, structs und Enums:
Benutzt ein Substantiv, oder ein Adjektiv als Namen. Abstrakte Klassen kann man, wenn es nötig ist, durch Anhängen von "Base" kennzeichnen.

C#-Code:
namespace NamingConventions.PascalCase
{
    public class Product
    {
    }

    public abstract class CustomerBase
    {
    }

    public struct Manufacturer
    {
    }

    public enum ProductType //Enums werden im Singular (Einzahl) benannt, ohne Prä- oder Postfix, in PascalCase.
    {
    }

    [Flags]
    public enum AllowedPaymentTypes //Ausnahme: Enums mit dem Flags-Attribut, die eine beliebige Kombination der Werte erlauben
    {
         Cash = 1,
         EuroCash = 2,
         VisaCard = 4,
         PayPal = 8
     }
}

Schnittstellen:
Schnittstellen werden immer mit einem großen "I" am Anfang des Namens gekennzeichnet, beginnen also mit zwei Großbuchstaben. Benutzt nach Möglichkeit ein Adjektiv als Namen, denn Schnittstellen "verleihen" den implementierenden Klassen bestimmte Eigenschaften. IDrivable ist besser als IVehicle.

C#-Code:
public interface ICategorizable
{
    ProductCategory Category { get; }
}

Methoden:
Da Methoden etwas tun, sollte man hier immer ein Verb als Namen benutzen. Der Name sollte beschreiben, was eine Methode tut, und nicht, wie sie es tut. Kürzt den Namen nach Möglichkeit nicht ab.

C#-Code:
public class Product
{
    private ProductCategory GetProductCategory(int categoryId)
    {
    }

    public abstract void Process();
}

Properties
Verwendet ein Substantiv für Properties. Der Name sollte präzise beschreiben, um was für eine Eigenschaft es sich handelt.

C#-Code:
public class Product
{
    private int _productCategoryId;

    public ProductCategory Category
    {
        get
        {
            return GetProductCategory(_productCategoryId);
        }
    }
}

Delegates und Events:

C#-Code:
public class Product
{
    public delegate void ProductInitEventHandler(int productCategoryId); //wird der Delegat für ein Event benutzt, kennzeichnet man ihn mit dem Postfix "EventHandler"

    public delegate bool ProductLoadCallback(int productCategoryId);     //ist der Delegat kein Eventhandler, kennzeichnet man ihn mit dem Postfix "Callback"

    public event ProductInitEventHandler Initializing;                  //kein Prä- oder Postfix, dafür ein Name, der das Ereignis gut beschreibt

    public event ProductInitEventHandler Initialized;                   //-ing meistens für Ereignisse, kurz bevor etwas passiert ist, -ed für Ereignisse, nachdem etwas passiert ist - hier gibt es keine Konvention, nur Vorschläge.
}

Weitere häufig verwendete Postfixe

C#-Code:
public class CategoryAttribute : Attribute { }                              //Attribute werden mit dem "Attribute"-Postfix gekennzeichnet

public class InvalidProductCategoryException : Exception { }                //Ausnahmen werden mit dem "Exception"-Postfix gekennzeichnet

public class ProductCollection : IEnumerable<Product> { }                 //Klassen, die von IEnumerable, IList, ICollection abgeleitet sind, werden mit dem "Collection"-Postfix gekennzeichnet

public class ProductDictionary : IDictionary<Product, int> { }              //Klassen, die von IDictionary abgeleitet sind, werden mit dem "Dictionary"-Postfix gekennzeichnet

Weitergehende Informationen

Auch für die Benennung von Namensräumen (namespaces), Projekten und Projektmappen gibt es natürlich Vorschläge. Da das zum Thema der Organisation einer kompletten Codebasis gehört und hier zu weit führen würde, sei nur auf die Hinweise von Microsoft verwiesen:  Namen von Assemblys und DLLs,  Namen von Namespaces.

Zu einem gut verständlichen Code gehört außerdem noch viel mehr als nur die Schreibweise. Einige gute Hinweise, was "sauberen" Code ausmacht, finden sich u.a.:Mit Dank an die beteiligten Poweruser für die hilfreichen Hinweise und Anmerkungen!


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 27.02.2020 21:03