Klassen auslagern und design by contract



  • Hallo zusammen,
    habe hauptsächlich in C++ gearbeitet. Nun arbeitet mein Arbeitgeber mit C# und ich muss mich darauf umstellen.

    Ich habe folgende Probleme:

    Wenn man große Projekte hat, möchte man ja nicht eine Datei mit x-millionen Zeilen Code. In C++ lagert man also komplette Klassen in andere Dateien auf, die man in die main wieder included via Preprozessor.
    Ich habe trotz stunden googlen nur partial-classes gefunden und glaube nicht, dass es das ist, was ich suche. Ich möchte eine Klasse ja nicht aufteilen. Ich möchte sie komplett irgendwo anders deklarieren und definieren.

    Mein zweites Problem ist:

    Ich möchte gerne Contracts benutzen um Funktionsparameter zu überprüfen. In C++ konnte man dies durch Makros machen, aber da es in C# wieder keine Makros gibt, weiß ich nicht wie ich das realisieren soll. Ich habe eine methode für assertions gefunden, die aber todes-lange Fehler ausgeben. Ich möchte während der Runtime einfach nur eine Fehlerzeile in der Konsole ausgeben lassen und die Funktion soll abbrechen.
    Microsoft bietet wohl ein Add-in an für Code-Contracts, welches aber bei mir nicht funktionier. Zwar kann ich die Klasse Contract mit der Methode Require aufrufen, aber es wird kein Fehler ausgegeben. Ich benutze VS2013 Express. Anscheindend scheint es nicht unter den Express versionen oder Version 2013 zu laufen.

    Mein Beispielcode, der kein Fehlerausgibt.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Diagnostics.Contracts;
    
    namespace c_sharp_übung
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine(_rechner.div(5, 0));
                Console.ReadLine();
            }
        }
        class _rechner
        {
            public static double div(int a, int b)
            {
                Contract.Requires(b != 0, "Fehler!");
                return (double)a / (double)b;
            }
        }
    }
    

    hat jemand eine Ahnung woran das liegt? Oder kennt jemand eine andere Lösung? Klar kann ich auch immer eine if-Abfrage machen, aber ich möchte das gerne elegant in einer Zeile lösen.

    mfg Jan



  • Hallo,

    das Modulsystem von C# (bzw. aller .NET-Sprachen) ist besser als das von C bzw. C++, denn es werden automatisch alle Klassen im Projekt (bzw. über die Verweise) erkannt. Einzig um Schreibarbeit zu sparen werden die "using namespace"-Deklarationen verwendet.
    Also einfach im VS "Add new item" bzw. "Add class" aufrufen und in einer neuen Datei eine neue Klasse anlegen - und diese kannst du dann direkt in deiner Main-Methode (oder anderswo) benutzen.

    Und ja, die Code Contracts funktionieren nur in den käuflichen VS Versionen (also nicht der Express, da diese keine Extensions unterstützt).

    Alternativ kannst du (zumindestens für die Debug-Version) eine der Debug.Assert-Methoden benutzen (auch mit eigener Meldung).



  • ist besser als das von C bzw. C++, denn es werden automatisch alle Klassen im Projekt

    Bitte keine Wertung. C++ oder C# kennen kein "Projekt". Es uebernimmt die IDE.

    Ich möchte während der Runtime einfach nur eine Fehlerzeile in der Konsole ausgeben lassen und die Funktion soll abbrechen.

    if (test(...)) return ...; // throw or whatever
    

Anmelden zum Antworten