Frage

Gibt es eine gute Verwendung von Teilklassen außerhalb der Webformen/WinForms generierten Code -Szenarien? Oder ist diese Funktion im Grunde genommen, um das zu unterstützen?

War es hilfreich?

Lösung

Es ist teilweise die Unterstützung von Szenarien (Webformen, Winforms, Linq-to-SQL usw.), das generierten Code mit dem Programmiercode gemischt wird.

Es gibt mehr Gründe, es zu verwenden. Wenn Sie beispielsweise große Klassen in großen, unhandlichen Dateien haben, die Klassen jedoch Gruppen von logisch verwandten Methoden haben, sind Teilklassen möglicherweise eine Option, um Ihre Dateigrößen verwaltbarer zu gestalten.

Andere Tipps

Die Codegenerierung war die treibende Kraft hinter Teilklassen. Das Bedürfnis besteht darin, eine Code-generierte Klasse zu haben, die sich ständig ändert, aber es den Entwicklern ermöglichen, benutzerdefinierte Code als Teil der Klasse zu liefern, die nicht jedes Mal überschrieben wird, wenn Änderungen vorgenommen werden, die die Klasse zur Wiederherstellung erzwingen.

Nehmen Sie zum Beispiel (oder einen beliebigen Designer) WinForms oder Typeddatensätze. Jedes Mal, wenn Sie den Designer ändern, serialisiert er den entsprechenden Code in eine Datei. Nehmen wir an, Sie müssen einige zusätzliche Methoden bereitstellen, über die der Generator nichts weiß. Wenn Sie es der generierten Datei hinzugefügt haben, würden Ihre Änderungen beim nächsten Mal verloren gehen.

Ein Projekt, an dem ich derzeit arbeite, verwendet die Code-Generation für alle DAL-, BLL- und Geschäftseinheiten. Der Generator erhält uns jedoch nur 75% der Informationen. Der verbleibende Teil muss von Hand codiert werden (beispielsweise benutzerdefinierte Geschäftslogik). Ich kann annehmen, dass jede BLL -Klasse eine Selektenmethode hat. Das ist also leicht zu generieren. Mein Kunde BLL muss jedoch auch über eine SelectAllByLocation -Methode verfügen. Ich kann das nicht in meinen Generator einfügen, weil es nicht für alle BLL -Klassen generisch ist. Deshalb generiere ich alle meine Klassen als Teilklassen und definiere dann in einer separaten Datei meine benutzerdefinierten Methoden. Jetzt, wenn sich meine Struktur ändert oder ich mein BLL aus irgendeinem Grund regenerieren muss, wird mein benutzerdefinierter Code nicht ausgelöscht.

Ich verwende Teilklassen als Mittel, um die verschiedenen Subelemente benutzerdefinierter Steuerelemente zu trennen, die ich schreibe. Bei Verwendung mit der Entitätserstellungssoftware können Produkte wie LLBGGen generierte Versionen von Klassen sowie eine benutzerdefinierte, benutzerbearbeitete Version erstellt werden, die nicht ersetzt werden, wenn die Entitäten wiederhergestellt werden müssen.

Ich verwende oft Teilklassen, um jeder verschachtelten Klasse eine eigene Datei zu geben. Es gab einige Architekturen, an denen ich gearbeitet habe, wo der größte Teil der Implementierung nur von einer Klasse verlangt wurde, und so verschachtelten wir diese Klassen in dieser einen Klasse. Es war sinnvoll, die Dateien leichter zu pflegen, indem sie die teilweise Klassenfähigkeit nutzte und jede in eine eigene Datei aufteilte.

Wir haben sie auch für die Gruppierung von Aktienüberschreibungen oder zum Verstecken eines Aktiensatzes von Immobilien verwendet. Sachen wie diese. Es ist eine praktische Methode zum Mischen einer Aktienänderung (kopieren Sie einfach die Datei und ändern Sie den teilweisen Klassennamen in die Zielklasse - solange die Zielklasse natürlich auch teilweise gemacht wird).

Eine weitere mögliche Verwendung für Teilklassen wäre die Nutzung von Teilmethoden, um die Methoden selektiv mit einer bedingten Kompilierung verschwinden zu lassen. Dies wäre hervorragend für den debug -diagnostischen Code oder für Szenarien für Spezialentests.

Sie können eine partielle Methode wie eine abstrakte Methode deklarieren, und in der anderen Teilklasse können Sie das Keyword "Partial" eingeben, um die Intellisense zu nutzen, um die Implementierung dieser Methode zu erstellen.

Wenn Sie einen Teil mit bedingten Build-Anweisungen umgeben, können Sie den Debug-Codes oder den Testcode problemlos abschneiden. Im folgenden Beispiel wird im Debug -Modus die Logsomethethingdebugonly -Methode aufgerufen, aber im Release -Build gibt es so, als ob die Methode überhaupt nicht existiert - eine gute Möglichkeit, den Diagnosecode ohne eine Reihe von Verzweigungen oder eine Reihe von Verzweigungen oder Abzweigung fernzuhalten oder zu halten oder ohne eine Reihe von Verzweigungen oder Mehrere bedingte Kompilierungsblöcke.

// Main Part
public partial class Class1
{
    private partial void LogSomethingDebugOnly();

    public void SomeMethod()
    {
        LogSomethingDebugOnly();
        // do the real work
    }
}

// Debug Part - probably in a different file
public partial class Class1
{

    #if DEBUG

    private partial void LogSomethingDebugOnly()
    {
        // Do the logging or diagnostic work
    }

    #endif
}

LINQ to SQL nutzt Teilklassen, um den Designer generierten Code zu erweitern. Ich denke, Sie werden dieses Muster von Teilklassen in der Regel von Designer-Code verwendet.

Ich finde Teilklassen äußerst hilfreich. Normalerweise werden sie verwendet, um autogenerierte Klassen zu erweitern. Ich habe sie in einem Projekt mit schweren Unit -Tests verwendet. Meine UT -Klassen hatten komplexe Abhängigkeiten und es war nicht sehr praktisch, den Code über mehrere Klassen hinweg zu trennen. Kurs ist es besser, die Vererbung Komposition zu verwenden, aber in einigen Fällen können Teilklassen hilfreich sein.

Wie bereits erwähnt, denke ich auch, dass dies ein Codegeruch ist.

Wenn eine Klasse so groß ist, dass sie in mehr Dateien aufgeteilt werden muss, bedeutet sie, dass sie das Prinzip der einzelnen Verantwortung durchbricht und zu viele Dinge tut. Die große Klasse könnte in kleinere Klassen unterteilt werden, die miteinander kooperieren.

Wenn Sie Teilklassen oder Regionen verwenden müssen, um Code zu organisieren, sollten Sie in Betracht ziehen, wenn sie sich in ihren eigenen Klassen befinden sollten. Es erhöht die Lesbarkeit und Sie würden mehr Code -Wiederverwendung erhalten.

Vielleicht ist es zu spät, aber bitte lassen Sie mich auch meine 2 Cent hinzufügen:

*Mit der Arbeit an großen Projekten können mehrere Programmierer gleichzeitig eine Klasse über separate Dateien verteilt.

*. Sie können Ihren Code (für erweiterte Funktionen) einfach für eine Vs.NET -generierte Klasse schreiben. Auf diese Weise können Sie den Code Ihres eigenen Bedarfs schreiben, ohne mit dem von System generierten Code zu spielen

Wo ich bin, habe wir ein Programm, das eingehende Dateien von Clients übernimmt. Es ist so eingerichtet, dass der Code jedes Kunden in seinem eigenen Klassenbibliotheksprojekt befindet und weiß, wie man das Format, das der Client verwendet, umgeht.

Der Hauptcode verwendet die Bibliotheken, indem er eine ziemlich umfangreiche Schnittstelle definiert, die eine Klasse in der Bibliothek implementieren muss (wahrscheinlich einige unterschiedliche Schnittstellen sein sollten, aber es ist zu spät, um ihn jetzt zu ändern). Manchmal beinhaltet das viel mehr Code in derselben Klasse, als wir normalerweise umsichtig denken. Teilkurse ermöglichen es uns, sie etwas aufzubrechen.

Bei UserControls, die relativ kompliziert sind, habe ich die Event -Handhabung in eine Datei und die Malerei und Eigenschaften in einer anderen Datei eingebaut. Teilkurse eignen sich hervorragend dafür. Normalerweise sind diese Teile der Klasse relativ unabhängig und es ist schön, in der Lage zu sein, Gemälde und Event -Handhabung nebeneinander zu bearbeiten.

Ich habe vor ein paar Jahren an einem Projekt gearbeitet, bei dem wir eine typisierte Datensatzklasse hatten, die eine Menge Code enthielt: Methoden in den Datatabellen, Methoden in den Tableadaptern, Erklärungen von Tableadapter -Instanzen, Sie nennen es. Es war ein massiver zentraler Punkt des Projekts, an dem jeder oft arbeiten musste, und es gab viele Quellenkontrollverkäufe über die Teilklassencodedatei.

Deshalb habe ich die Codedatei in Fix oder sechs teilweise Klassendateien geteilt, die nach Funktion gruppiert sind, damit wir an kleineren Teilen arbeiten und nicht jedes Mal die gesamte Datei sperren müssen, wenn wir etwas kleines ändern mussten.

(Natürlich hätten wir das Problem auch gelöst haben, indem wir kein ausschließlich gespeichertes Quellkontrollsystem verwendet haben, aber das ist ein weiteres Problem.)

Im Allgemeinen halte ich es für einen Codegeruch.

Wenn Ihre Klasse so kompliziert ist, kann sie wahrscheinlich in kleinere wiederverwendbare Komponenten unterteilt werden.

Oder es bedeutet, dass es keine Erbhierarchie gibt, in der es eine geben sollte.

Für Szenarien zur Codegenerierung ist es gut, aber ich denke, Codegenerierung ist ein weiterer Codegeruch.

Ich bin spät im Spiel ... aber nur meine 2 Cent ...

Eine Verwendung könnte darin bestehen, eine bestehende Gottklasse in einer vorhandenen Legacy -Code -Basis in mehrere Teilklassen neu zu gestalten. Es könnte die Entdeckbarkeit des Codes verbessern - wenn für die Dateinamen mit den Teilklassen eine ordnungsgemäße Benennungskonvention befolgt wird. Dies könnte auch das Quellcode -Repository reduzieren - aufschlüsseln und verschmelzen.

Idealerweise sollte eine Gottklasse in mehrere kleine Klassen unterteilt werden - jeweils eine einzelne Verantwortung. Manchmal ist es störend, mittel bis große Refaktorings auszuführen. In solchen Fällen könnten Teilklassen eine vorübergehende Erleichterung liefern.

Die Korrektur, wie Matt betonte, müssen beide Seiten der teilweisen Anordnung in derselben Baugruppe sein. mein Fehler.

Ich verwende es in einer Datenzugriffsschicht. Die generierten Klassen wie der Mapper und fragten sich teilweise. Wenn ich beispielsweise eine Mapper -Methode hinzufügen muss, um eine ausgefallene Last durchzuführen, die nicht generiert wird, füge ich sie der benutzerdefinierten Klasse hinzu.

Am Ende sieht der Programmierer, der die Datenebene in der Geschäftsschicht verwendet, nur eine Klasse mit all der Funktionalität, die er benötigt. Und wenn die Datenquelle ändert, können die generischen Teile leicht generiert werden, ohne benutzerdefinierte Dinge zu überschreiben.

Ich habe gerade eine Verwendung für Teilklassen gefunden. Ich habe eine [DataContract] -Klasse, die ich verwende, um Daten an den Client weiterzugeben. Ich wollte, dass der Client die Klasse auf eine bestimmte Weise anzeigen kann (Textausgabe). Deshalb habe ich eine Teilklasse erstellt und die TOString -Methode überschrieben.

Manchmal finden Sie vielleicht einen schrecklich alten Code bei der Arbeit, der es unmöglich macht, in verschiedene Elemente umzusetzen, ohne den vorhandenen Code zu brechen.

Wenn Sie nicht die Option oder die Zeit haben, eine echte Architektur zu erstellen, machen Teilklassen es unglaublich einfach, die Logik dort zu trennen, wo sie benötigt wird. Auf diese Weise kann der vorhandene Code weiterhin die gleiche Architektur verwenden, während Sie einer konkreten Architektur einen Schritt näher kommen.

Überall, wo Sie verwendet hätten #region Abschnitte zuvor sind wahrscheinlich sinnvoller als separate Dateien in Teilklassen.

Ich persönlich verwende Teilklassen für große Klassen, in denen statische Mitglieder in eine Datei gehen, und Instanzmitglieder in die andere.

Bearbeiten: DSL -Tools für Visual Studio verwendet Teilklassen.

Somit ist es eine Funktion, die viele automatisch generierte Code verwenden. Anstatt #region zu verwenden, geht der automatisch generierte Code in eine Datei und der Benutzercode (auch benutzerdefinierter Code genannt) zu einer anderen und sogar in verschiedenen Verzeichnissen, so dass der Entwickler nicht mit so vielen bedeutungslosen Dateien verwechselt wird.

Es ist gut, diese Wahl zu haben, die Sie kombinieren können - aber nicht gezwungen, mit Erbschaft zu verwenden,

Außerdem kann es praktisch sein, die Logik einiger Klassen zwischen mehreren Verzeichnissen zu trennen. Natürlich ist es für Maschinen gleich, aber es verbessert die Lesbarkeitserfahrung der Benutzer.

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