La base de código donde trabajo tiene un objeto llamado Pair donde A y B son los tipos del primer y segundo valor en el Pair. Encuentro que este objeto es ofensivo, porque se usa en lugar de un objeto con miembros claramente nombrados. Así que me parece esto:¿Por qué usar tuplas en lugar de objetos?
List<Pair<Integer, Integer>> productIds = blah();
// snip many lines and method calls
void doSomething(Pair<Integer, Integer> id) {
Integer productId = id.first();
Integer quantity = id.second();
}
En lugar de
class ProductsOrdered {
int productId;
int quantityOrdered;
// accessor methods, etc
}
List<ProductsOrderded> productsOrdered = blah();
Muchos otros usos de la pareja en el código base son igualmente mal olor.
Busqué tuplas en Google y parece que a menudo se las malinterpreta o se las usa de forma dudosa. ¿Existe un argumento convincente a favor o en contra de su uso? Puedo apreciar que no quiero crear grandes jerarquías de clases, pero ¿hay bases de código realistas donde explotaría la jerarquía de clases si no se usaran las tuplas?
¿Está jugando al abogado del diablo aquí, pero hay realmente muchos casos en los que necesita un método que devuelve múltiples valores no relacionados? El único escenario que veo bastante a menudo es el método 'TryParse' para los tipos de datos incorporados en C#. Aquí, debe devolver un 'bool' (si el análisis fue exitoso) y, por ejemplo, un' int' (el valor si el análisis fue exitoso). Para permitir un segundo valor de retorno, se usa la palabra clave 'out'. Supongo que una tupla podría ser agradable aquí, pero no estoy seguro de si es mejor que declarar un tipo con un 'bool' llamado' ParseSuccessful' y una 'T' genérica llamada' Value'. – devuxer
@DanThMan: sí, aunque no están relacionados. Por ejemplo, el algoritmo de C++ 'equal_range' devuelve un par de iteradores. Los mapas en C++ son equivalentes a los conjuntos del 'par'. Hay otros casos, pero no puedo pensar en ellos ahora mismo. –
rlbond
DanThMan: viniendo de la dirección opuesta (un lenguaje que admite múltiples valores de retorno), uno podría preguntar lo mismo: ¿alguna vez necesita parámetros de "salida" si tiene múltiples valores devueltos? ¿Quieres * devolver * 2 cosas, entonces, ¿por qué una parece que la estoy pasando? :-) – Ken