Laden...

Wie finde ich passende Namen für Klassen und Namespaces, vor allem für kleine Helfermethoden?

Letzter Beitrag vor 4 Jahren 3 Posts 839 Views
Wie finde ich passende Namen für Klassen und Namespaces, vor allem für kleine Helfermethoden?

Moin,
ich verschwende sehr viel Zeit damit passende Namen für Namespaces und Klassen zu finden. Habt ihr einen "Trick", mit dem man sich das einfacher machen kann?

Vor allem bei kleinen Methoden, wie die Folgenden, fällt mir nichts ein:

public static int GenerateID()
        {
            var now = DateTime.Now;
            var date = DateTime.MinValue.AddHours(now.Hour).AddMinutes(now.Minute).AddSeconds(now.Second).AddMilliseconds(now.Millisecond);
            return (int)(date.Ticks / 10000);
        }

... oder...

public static bool IsNumeric(string str)
        {
            // wird benütigt, da TryParse eine Referenz verlangt
            float output;

            // versucht den String in ein Float zu parsen und gibt zurück ob der Versuch erfolgreich war
            return float.TryParse(str, out output);
        }

In welche Klasse packt ihr solche Methoden, die quasi von überall her angesprochen werden können? Aus Ratlosigkeit habe ich meine Klasse "Helpers" genannt und da alles reingetan.

Hoffe, ihr könnt mir weiterhelfen, denn für die ganze Namensfinderei gehen bei mir Stunden drauf.

Das hängt von der Situation ab.

Wenn Du zig Methoden hast, die z.B. mit Strings arbeiten, dann könnte das eine StringUtils-Klasse sein.
Ich hab aber die Erfahrung gemacht, dass der Wunsch, so allgemeine Methoden auszulagern, schnell nach hinten losgehen kann, dann hast Du ein Haufen solcher Methoden und die werden am Ende nur an einer Stelle genutzt.

Oder wenn Du eine Methode in vielen Klassen brauchst, die alle die selbe Basis-Klasse haben, dann leg das doch in die Basis-Klasse?

Bei deinen beiden Beispielen würde ich aber sagen:

Lass das die Datenbank machen, oder nutze Guids, die sind genau dafür gemacht.
Oder Du nutzt ein eigenes Objekt, das sich die jeweils vorherige Id merkt:

public class IDProvider
{
    private int _lastId;

    public int GetId() => ++_lastId;
}

Und die zweite Methode würde ich mir komplett sparen.

Mit einer neuen C#-Version tut's auch das:

var isFloat = float.TryParse(str, out _);

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

Letzten Endes kannst Du da einfach von den Großen lernen:

Für Erweiterungen wie Du sie hier hast (Deine IsNumeric Methode ist quasi eine Erweiterung für String) ist der meist verwendete Name, den man so findet und verwendet, einfach: Extensions.

Ob man nun für die Extensions einen eigenen Namensbereich schafft oder nicht: das kommt drauf an.
Der Mechanismus von Namespaces in .NET ist sehr mächtig; und ich finde das ist eines der wichtigsten Mittel im gesamten Code-Bereich von .NET, den leider die aller wenigsten .NET Entwickler verstanden haben - aber ausschlaggebend für die Software Architektur ist.

Weit verbreitet ist:

  • MyCompany.MyProduct.Extensions als Namespace sowie als Assembly Name

und

  • MyCompany.MyProduct.Extensions als Assembly Name
  • MyCompany.MyProduct als Namespace

Letzteres ist streng genommen eher im Sinne des Namespace Mechanismus; ersteres sieht man in den Projekten jedoch öfters.

Die Klasse würde dann einfach StringExtensions heissen.
Auf die Schnelle ein großes, bekanntes Projekt, das es genau so macht: https://github.com/Humanizr/Humanizer/tree/master/src/Humanizer

Aufpassen basierend auf dem Anwendungsfall:
Client-seitige Generierung von Ids auf Basis von Integer skaliert nicht.
D.h. wenn mehrere Instanzen eindeutige Ids generieren sollen, dann kommt man an Guid nicht vorbei.
Die Alternative wäre sonst server-seitiges Generieren