Frage

Ich bin nur fragen, wie andere Entwickler dieses Problem angehen zu bekommen 2 oder 3 Antworten von einem Verfahren.

1) liefern ein Objekt []
2) gibt eine benutzerdefinierte Klasse
3) verwenden, um ein oder Schlüsselwort ref auf mehreren Variablen
4) schreiben oder leihen (F #) ein einfaches Tuple <> generische Klasse
http://slideguitarist.blogspot.com/2008/02/whats- f-tuple.html

Ich arbeite jetzt auf einige Code, der tut Daten aktualisiert. Von der Methode, die die Refresh nicht Ich mag würde zurück (1) Aktualisieren Startzeit und (2) Aktualisieren Endzeit passieren.
Zu einem späteren Zeitpunkt möchte ich kann einen dritten Wert zu übergeben zurück.

Die Gedanken? Jedes gute Praktiken aus Open-Source-.NET-Projekten zu diesem Thema?

War es hilfreich?

Lösung

Ihre Frage verweist auf die Möglichkeit, dass Sie mehr Daten in der Zukunft zurückkommen, so würde ich empfehlen, Ihre eigene Klasse Umsetzung der Daten enthalten.

Was dies bedeutet, ist, dass Ihre Methodensignatur wird das gleiche, auch wenn die innere Darstellung des Objekts bleiben Sie um Änderungen vorbei sind mehr Daten aufzunehmen. Es ist auch eine gute Übung für die Lesbarkeit und Verkapselung Gründen.

Andere Tipps

Es hängt ganz davon ab, was die Ergebnisse sind. Wenn sie miteinander verwandt sind, würde ich in der Regel eine benutzerdefinierte Klasse erstellen.

Wenn sie nicht wirklich verwandt, würde ich entweder einen out-Parameter verwenden oder die Methode nach oben aufgespalten. Wenn eine Methode will drei unabhängige Einzelteile zurückbringen, ist es wahrscheinlich zu viel zu tun. Die Ausnahme ist, wenn Sie über eine Web-Service-Grenze oder etwas anderes zu sprechen, wo ein „reinere“ API zu gesprächig sein kann.

Für zwei, in der Regel 4)

Mehr als das, 2)

Code-Architeture weise würde ich immer mit einer benutzerdefinierten Klasse gehen, wenn etwas eine bestimmte Menge an Variablen geändert benötigen. Warum? Ganz einfach, weil eine Klasse ist eigentlich ein „Entwurf“ einen häufig verwendeten Datentypen, Ihren eigenen Datentyp zu schaffen, die in diesem Fall ist es, werden Sie helfen, eine gute Struktur bekommen und anderes Programm für Ihre Schnittstelle zu helfen.

Ich persönlich hasse out / ref params, also würde ich eher nicht, diesen Ansatz verwenden. Auch die meiste Zeit, wenn Sie mehr als ein Ergebnis zurückkommen müssen, werden Sie wahrscheinlich etwas falsch zu machen.

Wenn es wirklich unvermeidbar ist, werden Sie wahrscheinlich am glücklichsten auf lange Sicht sein, um eine eigene Klasse zu schreiben. Rückgabe eines Arrays ist verlockend es einfach und effektiv in der kurzen teerm ist, sondern eine Klasse mit gibt Ihnen die Möglichkeit, den Rückgabetyp in der Zukunft ändern, ohne zu viel kümmern Probleme auf Strom verursacht. Stellen Sie sich das Potential für einen Debug-Alptraum, wenn jemand die Reihenfolge der zwei Elemente in dem Array Swaps, die zurückgegeben wird ....

ich verwende, wenn es nur 1 oder 2 zusätzliche Variablen ist (zum Beispiel eine Funktion einen Bool zurückgibt, die die tatsächliche wichtiges Ergebnis ist, sondern auch eine lange out-Parameter zurückzukehren, wie lange die Funktion lief, zur Protokollierung) .

Für etwas komplizierter, ich in der Regel eine benutzerdefinierte Struktur / Klasse erstellen.

Ich denke, die häufigste Art und Weise ein C # -Programmierer dies die Elemente zu wickeln wäre würden Sie in einer separaten Klasse zurückkehren möchten. Dies würde Ihnen die größte Flexibilität für die Zukunft, IMHO bieten.

Es hängt davon ab. Für eine interne nur API, werde ich in der Regel die einfachste Option wählen. das ist im Allgemeinen aus.

Für eine öffentliche API, eine benutzerdefinierte Klasse macht in der Regel mehr Sinn - aber wenn es etwas ziemlich primitiv, oder das natürliche Ergebnis der Funktion ist ein boolean (wie * .TryParse) Ich werde mit einem aus param bleiben. Sie können mit einem impliziten Guss eine benutzerdefinierte Klasse tun als auch in bool, aber das ist in der Regel einfach seltsam.

Für Ihre besondere Situation eine einfache unveränderliche Daterange-Klasse scheint mir am besten geeignet. Sie können diesen neuen Wert leicht hinzugefügt werden, ohne bestehenden Benutzer zu stören.

Wenn Sie wollen die Refresh-Start- und Endzeiten zurück zu senden, die eine mögliche Klasse oder Struktur vermuten lässt, vielleicht DataRefreshResults genannt. Wenn Ihr möglicher dritte Wert auch auf die Refresh-bezogen ist, dann könnte es hinzugefügt werden. Denken Sie daran, eine Struktur immer von Wert übergeben, so wird es auf dem Heap zugewiesen braucht nicht Garbage Collection zu sein.

Einige Leute benutzen KeyValuePair für zwei Werte. Es ist allerdings nicht groß, weil es nur die beiden Dinge wie Key und Value Etiketten. Nicht sehr aussagekräftig. Auch wäre es ernsthaft profitieren von mit dieser hinzugefügt:

public static class KeyValuePair
{
    public static KeyValuePair<K, V> Make(K k, V v) 
    { 
        return new KeyValuePair<K, V>(k, v); 
    }
}

erspart Sie, die Typen zu spezifizieren, wenn Sie eine erstellen. Gattungsgemäße Verfahren können Typen ableiten, generische Klasse Bauer nicht.

Für Ihr Szenario möchten Sie können generischen Bereich {T} Klasse definieren (mit Kontrollen für den Bereich Gültigkeit).

Wenn Methode privat ist, dann in der Regel ich Tupel von mein Helfer Bibliothek . Öffentliche oder geschützte Methoden verdienen im Allgemeinen immer getrennt.

Gibt einen benutzerdefinierten Typ, aber keine Klasse verwenden, verwenden Sie eine Struktur -. Keine Speicherzuweisung / Garbage Collection Overhead bedeutet keine Nachteile

Wenn 2, ein Paar.

Wenn mehr als 2 eine Klasse.

Eine andere Lösung ist ein Wörterbuch mit dem Namen Objektreferenzen zurückzukehren. Für mich ist dies ziemlich gleichwertig eine benutzerdefinierte Rückkehr Klasse verwenden, aber ohne Kabelgewirr. (Und mit RTTI und Reflexion es ist genauso wie jede andere typsichere Lösung, wenn auch dynamisch so.)

Es hängt von der Art und Bedeutung der Ergebnisse, sowie, ob die Methode privat ist oder nicht.

Für private Methoden, ich in der Regel nur ein Tuple verwenden, aus meiner Klassenbibliothek.

Für öffentliche / protected / interne Methoden (dh. Nicht privat), verwende ich entweder out-Parameter oder eine benutzerdefinierte Klasse.

Zum Beispiel, wenn ich das TryXYZ Muster bin Umsetzung, in dem Sie eine XYZ-Methode haben, die eine Ausnahme bei einem Fehler und einer TryXYZ Methode wirft die Boolesche zurückgibt, TryXYZ wird eine Out-Parameter verwenden.

Wenn die Ergebnisse sind sequenzorientierte (dh. 3 zurückzukehren Kunden, die verarbeitet werden sollen), dann werde ich in der Regel eine Art von Sammlung zurück.

Anders als das ich in der Regel nur eine benutzerdefinierte Klasse verwenden.

Wenn eine Methode gibt zwei vor drei verwandter Wert, würde ich gruppiert sie in einer Art. Wenn die Werte nicht verwandt sind, ist das Verfahren sehr wahrscheinlich viel zu viel zu tun und ich würde es in eine Reihe von einfacheren Methoden Refactoring.

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