Frage

ein Satz von Tupel Klassen in einer OOP-Sprache Gegeben:? Pair, Dreier- und Vierer, sollten Unterklassen Paar Triple und Quad Unterklasse Dreibettzimmer

Die Frage, wie ich es sehe, ist, ob ein Drei als Paar ersetzbar sein sollte, und ebenfalls Quad für Triple oder Paar. Ob Triple- ist auch ein Paar und Quad ist auch ein Dreibettzimmer und ein Paar.

In einem Kontext, eine solche Beziehung könnte für Erweiterbarkeit wertvoll sein - heute ist diese Sache gibt ein Paar Dinge, morgen ich brauche es einen Dreifach zurückzukehren, ohne bestehende Anrufer zu brechen, die nur die ersten beiden der drei verwenden <. / p>

Auf der anderen Seite sollte jeder sie unterschiedliche Typen sein? Ich kann Nutzen in stärker Typprüfung sehen -., Wo man nicht eine Drei ein Verfahren passieren kann, dass ein Paar erwartet

Ich bin Neigung in Richtung Vererbung, aber wirklich eine Eingabe von anderen schätzen würde?

PS: Falls es darauf ankommt, werden die Klassen (natürlich) sein generic

.

PPS:? Auf einem Weg, um mehr subjektive Seite, sollen die Namen sein Tuple2, Tuple3 und Tuple4


Edit: Ich denke an diesen mehr als lose gekoppelte Gruppen; insbesondere nicht für Dinge wie x / y x / y / z-Koordinaten, obwohl sie für eine solche verwendet werden kann. Es wäre Dinge wie eine allgemeine Lösung für mehrere Rückgabewerte von einem Verfahren benötigen, aber in einer Form mit sehr einfacher Semantik.

Das heißt, ich bin an allen Wegen andere tatsächlich Tupel verwendet haben.

War es hilfreich?

Lösung

Unterschiedliche Länge von Tupel ist eine andere Art. (Na ja, in vielen Systemen des Typs sowieso.) In einer stark typisierte Sprache, würde ich nicht glauben, dass sie eine Sammlung sein sollten.

Dies ist eine gute Sache, da es mehr Sicherheit gewährleistet. Orte, wo man Tupel in der Regel zurückgeben haben Informationen etwas gekoppelt zusammen mit ihm, das implizite Wissen von dem, was jeder Komponente ist. Es ist schlimmer, wenn Sie in mehr Werten in einem Tupel passieren als erwartet - was das bedeuten soll? Dabei spielt es keine Vererbung passen.

Ein weiteres mögliches Problem ist, wenn Sie sich entscheiden, eine Überlastung zu verwenden. Wenn Tupel voneinander erben, dann Auflösung überlasten wird fehlschlagen, wenn es nicht sollte. Aber das ist wahrscheinlich ein besseres Argument gegen Überlastung.

Natürlich nichts davon zählt, wenn Sie einen bestimmten Anwendungsfall haben und feststellen, dass bestimmte Verhaltensweisen Ihnen helfen.

Edit: Wenn Sie allgemeine Informationen wünschen, versuchen, ein bisschen von Haskell oder ML-Familie (OCaml / F #) durchlesen, um zu sehen, wie sie verwendet werden und dann Ihre eigenen Entscheidungen bilden

.

Andere Tipps

Es scheint mir, dass Sie eine generische Schnittstelle Tuple machen sollten (oder so etwas wie die Sammlung oben erwähnt verwenden), und haben Ihr Paar und 3-fach-Klassen, die Schnittstelle implementieren. Auf diese Weise können Sie die Vorteile von Polymorphismus nehmen, sondern auch einem Paar erlauben eine einfachere Implementierung als ein beliebige Größe Tupel zu verwenden. Sie würden wahrscheinlich wollen Ihre Tuple Schnittstelle umfasst .x und .y Accessoren als Abkürzung für die ersten beiden Elemente machen, und größere Tupel kann ihre eigenen Kürzel als geeignet für Produkte mit höheren Indizes implementieren.

Wie die meisten Design-Fragen, die Antwort ist -. Es hängt davon ab

Wenn Sie nach herkömmlichem Tuple Design suchen, Tuple2, Tuple3 etc ist der Weg zu gehen. Das Problem mit der Vererbung ist, dass zunächst alle Triplet nicht eine Art von Pair ist. Wie würden Sie die Methode equals für sie umzusetzen? Ist ein Triplet gleich ein Paar mit zwei ersten Elementen gleich? Wenn Sie eine Sammlung von Paaren haben, können Sie Triplett ihm oder umgekehrt hinzufügen? Wenn in Ihrer Domain dies in Ordnung ist, können Sie mit Vererbung gehen.

Jeder Fall lohnt es sich, eine Schnittstelle / abstrakte Klasse haben (vielleicht Tuple), die alle diese implementieren.

Es hängt von der Semantik, die Sie brauchen -

  • ein Gegensatzpaar ist nicht semantisch kompatibel mit einer 3-Tupel von ähnlichen Objekten
  • ein Paar von Koordinaten in Polar Raum ist nicht semantisch kompatibel mit einem 3-Tupel-Koordinaten im euklidischen Raum

Wenn Sie Ihre Semantik einfache Kompositionen sind, dann eine generische Klasse Tuple würde mehr Sinn machen

würde ich mit 0,1,2 oder unendlich gehen. z.B. null, 1 Objekt, Ihre Klasse Pair, oder dann eine Sammlung von einer Art.

Ihr Paar könnte sogar eine Collection-Schnittstelle implementieren.

Wenn es eine spezifische Beziehung zwischen drei oder vier Elementen, sollte es wohl genannt werden.

[Vielleicht fehle ich das Problem, aber ich kann mich einfach nicht von einem Fall, wo ich will speziell 3 Dinge in allgemeiner Weise verknüpfen]

Gilad Bracha gebloggt Tupeln , die ich interessante Lektüre gefunden.

Ein Punkt machte er (ob richtig oder nicht, kann ich noch nicht beurteilen) war:

  

Wörtliche Tupel wird am besten definiert als nur lesen. Ein Grund dafür ist, dass nur lesbar Tupel mehr polymorph ist. Lange Tupel sind Subtypen von Kurzen:

     

{S. T. U. V} <= {S. T. U} <= {S. T} <= {S}

     

[und] Nur-Lese-Tupel sind covariant:

     

T1 <= T2, S1 {S1. T1} <= {S2. T2}

Das scheint meine Neigung zur Verwendung von Vererbung vorzuschlagen korrekt sein kann, und amit.dev widerspräche, wenn er sagt, dass ein Triple-ist nicht ein Paar.

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