¿Por qué usar tuplas en lugar de objetos?

La base de código donde trabajo tiene un objeto llamado Par, donde A y B son los tipos del primer y segundo valor del Par. Encuentro que este objeto es ofensivo, porque se usa en lugar de un objeto con miembros claramente nombrados. Entonces encuentro esto:

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 d

class ProductsOrdered {
  int productId;
  int quantityOrdered;
  // accessor methods, etc
}

List<ProductsOrderded> productsOrdered = blah();

Muchos otros usos del par en la base de código son igualmente malolientes.

Busqué en Google las tuplas y parecen ser a menudo mal entendidas o utilizadas de manera dudosa. ¿Existe un argumento convincente a favor o en contra de su uso? Puedo apreciar que no quiero crear enormes jerarquías de clases, pero ¿hay bases de código realistas donde la jerarquía de clases explotaría si no se usaran las tuplas?

Respuestas a la pregunta(10)

Su respuesta a la pregunta