Domanda

Dato un insieme di classi di tuple in un linguaggio OOP:? Pair, triple e quadruple, dovrebbe triplicare sottoclasse Pair, e Quad sottoclasse Triple

Il problema, come la vedo io, è se un Triple dovrebbe essere sostituibili come una coppia, e similmente Quad per Triple o coppia. Sia Triple è anche una coppia e Quad è anche una tripla e una coppia.

In un contesto, un tale rapporto potrebbe essere prezioso per l'estensibilità - oggi questa cosa restituisce un paio di cose, domani ho bisogno di restituire una tripla senza rompere chiamanti esistenti, che sono solo utilizzando i primi due dei tre <. / p>

D'altra parte, dovrebbero essere ogni tipi distinti? Posso vedere beneficio in forte controllo del tipo -. In cui non è possibile passare una tripla a un metodo che prevede una coppia

sto appoggiato verso utilizzando l'ereditarietà, ma sarebbe davvero apprezzare input da altri?

PS: Nel caso in cui conta, le classi saranno (ovviamente) essere generico

.

PPS:? In un modo lato più soggettivo, devono essere i nomi Tuple2, Tuple3 e Tuple4


Edit: Sto pensando di questi gruppi più come debolmente accoppiati; non specificamente per cose come x / y x / y / z coordinate, anche se possono essere utilizzati per tali. Sarebbe cose come che necessitano di una soluzione generale per i valori di ritorno multipli da un metodo, ma in una forma molto semplice con la semantica.

Detto questo, mi interessa in tutti i modi che altri hanno effettivamente utilizzati tuple.

È stato utile?

Soluzione

di lunghezza diversa tupla è un tipo diverso. (Beh, in molti sistemi di tipo in ogni modo.) In un linguaggio fortemente tipizzato, non vorrei pensare che essi dovrebbero essere una collezione.

Questa è una buona cosa in quanto garantisce una maggiore sicurezza. Luoghi in cui si ritorna tuple di solito sono un po 'accoppiato informazioni insieme con essa, la conoscenza implicita di ciò che ogni componente è. E 'peggio se si passa a più valori in una tupla del previsto - quello che vorrebbe dire? Non si adatta eredità.

Un altro potenziale problema è che se si decide di utilizzare sovraccarico. Se tuple ereditano le une dalle altre, quindi sovraccaricare risoluzione fallirà dove non dovrebbe. Ma questo è probabilmente un argomento migliore contro i sovraccarichi.

Naturalmente, niente di tutto questo importa se si dispone di un caso d'uso specifico e trovare che certi comportamenti vi aiuteranno.

Edit: Se si desidera informazioni di carattere generale, provare sfogliando un po 'di Haskell o della famiglia ML (OCaml / F #) per vedere come vengono utilizzati e quindi formare le proprie decisioni

.

Altri suggerimenti

Mi sembra che si dovrebbe fare un'interfaccia Tuple generico (o usare qualcosa come la Collezione di cui sopra), ed avere la vostra coppia e 3-tupla classi implementano tale interfaccia. In questo modo, è possibile usufruire del polimorfismo, ma anche permettere un paio di usare un'implementazione più semplice di una tupla arbitrario dimensioni. si sarebbe probabilmente desidera rendere l'interfaccia di accesso includono Tuple .x .y e come scorciatoia per i primi due elementi, e tuple più grandi in grado di implementare le proprie abbreviazioni a seconda dei casi per gli elementi con indici più elevati.

Come la maggior parte domande relative progettazione, la risposta è -. Dipende

Se siete alla ricerca per la progettazione Tuple convenzionale, Tuple2, Tuple3 etc è la strada da percorrere. Il problema con l'ereditarietà è che, prima di tutto Triplet non è un tipo di accoppiamento. Come si implementa il metodo equals per questo? È una Triplet uguale a una coppia con i primi due elementi della stessa? Se si dispone di un insieme di coppie, si può aggiungere tripletta ad esso o viceversa? Se nel dominio questo va bene, si può andare con l'ereditarietà.

Ogni caso, si paga per avere una classe di interfaccia / astratta (forse Tuple), che tutte queste implementano.

dipende semantica che è necessario -

  • una coppia di opposti non è semanticamente compatibile con un 3-tupla di oggetti simili
  • una coppia di coordinate polari nello spazio non è semanticamente compatibile con un 3-upla di coordinate nello spazio euclideo

Se i vostri semantica sono composizioni semplici, quindi una classe generica Tuple avrebbe più senso

mi piacerebbe andare con 0,1,2 o infinito. per esempio. null, 1 oggetto, la classe coppia o poi una collezione di qualche tipo.

Il tuo coppia potrebbe anche implementare un'interfaccia Collection.

Se c'è una relazione specifica tra tre o quattro elementi, probabilmente dovrebbe essere nominato.

[Forse mi manca il problema, ma io proprio non riesco a pensare a un caso in cui voglio collegare specificamente 3 cose in modo generico]

bloggato su tuple , che ho trovato interessante la lettura.

Un punto ha fatto (se correttamente o meno non posso ancora giudicare) è stato:

  

tuple letterali sono meglio definiti come sola lettura. Una ragione di questo è che le tuple di sola lettura sono più polimorfico. tuple lunghi sono sottotipi di quelle corte:

     

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

     

[e] leggono solo le tuple sono covarianti:

     

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

Questo sembrerebbe suggerire la mia inclinazione a usare l'ereditarietà può essere corretto, e sarebbe in contraddizione con amit.dev quando dice che una tripla è non una coppia.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top