Frage

Ich hasse es, Code zu schreiben, der meine Software solide macht. Dies hätte der Rahmen hätte tun sollen! Kennt man sich also eines Code, der den Code verfestigt?

Wenn ich so etwas selbst erstellen müsste, würde es wie folgt funktionieren: Wenn Sie Ihren Code mit einem Debug-Flag kompilieren, würde er für jede Methode automatisch "verfestigen" Code hinzufügen:

Warpe den Code mit einem Versuch und stecke ein Debugg.

Protokollieren Sie die Eingabe jeder Methode, drucken "toString ()" -Werte von Argumenten, damit ich nachverfolgen kann, was los ist.

Überprüfen Sie jedes Argument für NULL.

Verwenden Sie ein "isvalid" -Rahmen, um das Objekt selbst und jedes Argument zu überprüfen, in dem isvalid () die Art und Weise des Objekts ist, zu erklären, dass seine Erwartungen wahr sind () und auf eine Seite zu verweisen, die isvalid () ist.

Also warum nicht?

War es hilfreich?

Lösung

Wenn Sie Methodenaufrufe protokollieren möchten, können Sie ein AOP -Framework wie verwenden Postsharp. Dinge wie die Durchsetzung der Methode vor/nach der Nachschläge werden am besten mit Design-by-Contract-Mechanismen wie dem neuen erreicht Codeverträge Bibliothek, die mit .net4.0 versendet wird. Es ist sicherlich nicht sinnvoll, Argumente für NULL zu überprüfen, da dies je nach Methode ein gültiger Wert sein kann. Das Injektieren von Debug.asserts in Code kann problematisch sein, da Sie möglicherweise keine Ausnahmen in der Quellfunktion verarbeiten möchten. Ich denke, es wäre unpraktisch, wenn nicht unmöglich, einen generischen Rahmen für solche Dinge zu schaffen, da die Anforderungen zwischen Projekten so stark unterschiedlich sein werden.

Bearbeiten: Um meinen Kommentar zum Hinzufügen von Debug -Behauptungen in Methoden zu verdeutlichen - ich habe Ihren Vorschlag gelesen, um einen Methodenkörper in so etwas umzuwandeln:

public void SomeMethod(args)
{
    try
    {
        //original method body
    }
    catch(Exception ex)
    {
        Debug.Assert(false);
        throw;
    }
}

Das Problem dabei ist, dass Asserts Dinge angeben, die niemals falsch sein sollten - daher bedeutet dieses Konstrukt, dass die Methode niemals werfen kann, was im Allgemeinen nicht wahr ist. Das Problem ist nun, dass die Behauptung, wenn die Methode wirft, auch dann fehlschlägt, wenn die Aufrufmethode die Ausnahme angemessen behandelt. Aus Ihrem Kommentar scheint es, dass Sie so etwas tun:

public void SomeMethod(object arg)
{
    Debug.Assert(arg != null);
    if(arg == null) throw new ArgumentNullException("arg");

    //rest of method
}

Dies ist eine nützliche Praxis, und ich glaube, dass die Code Contracts -Bibliothek in ihrer statischen Analyse die Voraussetzungsprüfung der Vorkonditionsprüfung (Ausnahmen) unterstützt.

Andere Tipps

Es ist schön zu sehen, dass mein Buch angeschlossen ist! Das große Problem für mich ist, dass ich denke, dass die Codegenerierung darauf abzielt, "neben" dem Entwicklercode "neben" zu sein-idealerweise würde der generierte Code nicht mit dem Code des Entwicklers gemischt werden. Ich frage mich, ob es eine Möglichkeit gibt, diesen "soliden" Code als Teilklasse oder als Proxy hinzuzufügen, der zwischen der Klasse und dem Client festgelegt würde, der ihn anrief. Natürlich ist es sicherlich möglich, den Code zu generieren und ihn in den Code des Entwicklers einzufügen, aber Sie möchten eine Art Konvention erstellen, damit das Tool, wenn der Entwickler eine Änderung des "Saufen" -Codes vornimmt und sich regeneriert, den alten Löschen des alten Löschens des alten Löschens des alten Löschens des alten Codes könnte das alte Löschen löschen und sich regeneriert. Code und generieren Sie neuen Code basierend auf der neuesten Version des Entwicklercode.

Ich würde etwas lieben, das Ihren Stapel nicht verliert, wenn Sie etwas an einen Arbeiter -Thread weitergeben. Ich weiß nicht einmal eine Problemumgehung dafür (C#). Es wäre großartig, den Stapel des übergeordneten Threads bis zu dem Punkt zu kennen, an dem der Arbeiter -Thread erstellt wurde.

Im Allgemeinen denke ich, dass viele der wirklich nützlichen Dinge in eine Sprache eingebaut werden müssten und nicht wirklich durch eine Bibliothek oder einen Framework sauber erreicht werden. Ich erinnere mich an die High School, dass sie bei den Kommentaren in den Kommentaren für eine Funktion immer unter/post -Bedingungen geschrieben haben, aber ich würde es wirklich gerne sehen, ist, vor/post -Bedingungen zu schreiben, die bei der Kompilierungszeit, wenn nicht Laufzeit. Sie würden irgendeine Weise markiert, sodass ein Editor ihn optional anzeigen oder verbergen kann, sodass er den realen Code nicht im Wege steht.

Ich bezweifle, dass es so etwas gibt und wenn es sicher ist, dass es nicht so verwendbar ist. Es hängt von Ihren Regelndefinitionen ab, verschiedene Personen denken, die unterschiedliche Bedürfnisse und Frameworks haben ... die Dinge, die Sie beschrieben haben, könnten durch Metaprogrammierung oder ein Makrosystem erreicht werden. In Java gibt es einige Projekte, die dazu beitragen könnten, einen solchen Ansatznotierungen zu implementieren. Ich weiß nicht, ob es einige gleichwertig im C# -Universum gibt. Die Isvalid () -Funktionalität sieht jedoch dem Design von Contract IDEA ziemlich ähnlich aus, vielleicht gibt es dafür einige Frameworks.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top