Pregunta

Dado un conjunto de clases de tupla en un lenguaje de programación orientada a objetos: Par, triples y cuádruples, debería triplicar subclase Par, y Quad Triple subclase

El problema, como yo lo veo, es si un paquete debe ser sustituibles como un par, y del mismo modo Quad para Triple o Par. Ya sea Triple también un par y Quad también un triple y un par.

En un contexto, una relación de este tipo podría ser valiosa para la extensibilidad - hoy esto devuelve un par de cosas, mañana lo necesito para devolver un triple sin romper las llamadas existentes, que sólo utilizan los dos primeros de los tres <. / p>

Por otro lado, en caso de que cada ser tipos distintos? Puedo ver el beneficio en la comprobación de tipos más fuerte -., Donde no se puede pasar un triple a un método que espera un par

Me estoy inclinando hacia el uso de la herencia, pero realmente apreciaría las aportaciones de los demás?

PD: En caso de que importa, las clases (por supuesto) ser genéricos

.

PPS:? En una forma lado más subjetivo, deben ser los nombres Tuple2, Tuple3 y Tuple4


Edit: Estoy pensando en estos grupos más que débilmente acoplados; no específicamente para cosas como las coordenadas x / y x / y / z, aunque pueden ser utilizados para tales. Sería cosas como que necesitan una solución general para varios valores de retorno de un método, pero en una forma con la semántica muy simples.

Dicho esto, estoy interesado en todas las formas que otros realmente han utilizado tuplas.

¿Fue útil?

Solución

diferente longitud de tupla es un tipo diferente. (Bueno, en muchos sistemas de tipo de todos modos.) En un lenguaje fuertemente tipado, no me creo que deberían ser una colección.

Esta es una buena cosa, ya que garantiza una mayor seguridad. Lugares donde regresaremos tuplas por lo general han unido un poco de información junto con él, el conocimiento implícito de lo que cada componente es. Es peor si pasa más valores en una tupla de lo esperado - ¿Qué se supone que significa eso? No se ajusta a la herencia.

Otro posible problema es que si usted decide utilizar la sobrecarga. Si tuplas heredan entre sí, entonces sobrecargar resolución fallará donde no debe. Pero esto es probablemente una mejor argumento en contra sobrecargas.

Por supuesto, nada de esto importa si usted tiene un caso de uso específico y encontrar que ciertos comportamientos le ayudará.

Editar: Si desea información general, tratar hojeando un poco de Haskell o familiar ML (OCaml / F #) para ver cómo se usan y luego formar sus propias decisiones

.

Otros consejos

Me parece que se debe hacer una interfaz genérica de tupla (o usar algo como la Colección mencionado anteriormente), y tienen su par y 3-tupla clases implementan esa interfaz. De esta manera, usted puede tomar ventaja de polimorfismo, sino también permitir que un par de usar una implementación más simple que una tupla de tamaño arbitrario. Probablemente usted desea hacer su interfaz tupla incluye descriptores de acceso .xy .y como forma abreviada de los dos primeros elementos, y las tuplas más grandes pueden poner en práctica sus propias abreviaturas según sea apropiado para elementos con índices más altos.

Al igual que la mayoría de las preguntas relacionadas con el diseño, la respuesta es -. Depende

Si usted está buscando para el diseño Tupla convencional, Tuple2, etc Tuple3 es el camino a seguir. El problema con la herencia es que, en primer lugar trío no es un tipo de par. ¿Cómo te poner en práctica el método equals para ello? Es un trío igual a un par con dos primeros artículos de la misma? Si usted tiene una colección de pares, se puede añadir triplete a ella, o viceversa? Si en su dominio esto está muy bien, puede ir a la herencia.

Cualquier caso, vale la pena tener un / clase abstracta interfaz (tal vez Tupla), que todos estos implementan.

depende de la semántica que necesitas -

  • un par de opuestos no es semánticamente compatible con un 3-tupla de objetos similares
  • un par de coordenadas en el espacio polar no es semánticamente compatible con un 3-tupla de coordenadas en el espacio euclidiano

si su semántica son composiciones simples, a continuación, una clase genérica de tupla tendría más sentido

Me gustaría ir con 0,1,2 o infinito. p.ej. nula, 1 objeto, la clase Par, a continuación, o una colección de algún tipo.

Su pareja podría incluso poner en práctica una interfaz de colección.

Si hay una relación específica entre tres o cuatro artículos, que probablemente debería ser nombrado.

[Tal vez me falta el problema, pero simplemente no puedo pensar en un caso en el que quiero enlazar específicamente 3 cosas de un modo genérico]

blogs sobre tuplas , lo cual me pareció interesante lectura.

Uno de los puntos que hizo (ya sea correcta o no que todavía no puedo juzgar) fue la siguiente:

  

tuplas literales se definen mejor como sólo lectura. Una razón para esto es que las tuplas de sólo lectura son más polimórficos. tuplas largas son subtipos de los cortos:

     

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

     

[y] leen sólo tuplas son covariantes:

     

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

Esto parece sugerir mi inclinación a la utilización de la herencia puede ser correcta, y estaría en contradicción con amit.dev cuando dice que un triple es no un par.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top