Por que usar tuplas em vez de objetos?

A base de código em que trabalho possui um objeto chamado Par, em que A e B são os tipos do primeiro e do segundo valores do Par. Acho esse objeto ofensivo, porque é usado em vez de um objeto com membros claramente nomeados. Então eu acho isso:

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();
}

Ao invés d

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

List<ProductsOrderded> productsOrdered = blah();

Muitos outros usos do Par na base de código são igualmente mal cheiroso

Eu pesquisei tuplas no Google e elas parecem ser muitas vezes incompreendidas ou usadas de maneira dúbia. Existe um argumento convincente a favor ou contra seu uso? Compreendo não querer criar enormes hierarquias de classe, mas existem bases de código realistas em que a hierarquia de classes explodiria se as tuplas não fossem usadas?

questionAnswers(10)

yourAnswerToTheQuestion