Baza kodu, w której pracuję, ma obiekt o nazwie Para, gdzie A i B są typami pierwszej i drugiej wartości w Pary. Uważam ten obiekt za obraźliwy, ponieważ zostaje użyty zamiast obiektu z wyraźnie nazwanymi członkami. Więc uważam to:Dlaczego używać krotek zamiast obiektów?
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();
}
Zamiast
class ProductsOrdered {
int productId;
int quantityOrdered;
// accessor methods, etc
}
List<ProductsOrderded> productsOrdered = blah();
wiele innych zastosowań Pair w kodzie są podobnie źle pachnące.
I Googled krotki i wydają się być często źle rozumiane lub używane w wątpliwych sposobów. Czy istnieje przekonujący argument za lub przeciw ich użyciu? Mogę docenić brak chęci tworzenia olbrzymich hierarchii klas, ale czy istnieją realistyczne bazy kodów, w których hierarchia klas wybuchałaby, gdyby nie użyto krotek?
Po prostu grając tutaj adwokata diabła, ale czy naprawdę istnieje wiele przypadków, w których potrzebna jest metoda zwracająca wiele niepowiązanych wartości? Scenariusz, który widzę dość często, to metoda "TryParse" dla wbudowanych typów danych w języku C#. Tutaj musisz zwrócić 'bool' (bez względu na to, czy analizowanie zakończyło się powodzeniem) i, powiedzmy,' int' (wartość, jeśli analizowanie zakończyło się powodzeniem). Aby umożliwić drugą wartość zwracaną, używane jest słowo kluczowe "out". Myślę, że krotka może być tutaj fajna, ale nie jestem pewna, czy jest lepsza od deklarowania typu z 'bool' nazwanym' ParseSupcess' i typowym 'T' nazwanym' Value'. – devuxer
@DanThMan: tak, chociaż nie są bez związku. Na przykład algorytm C++ 'equal_range' zwraca parę iteratorów. Mapy w C++ są równoważne zestawom 'pair'. Są inne przypadki, ale nie mogę o nich teraz myśleć. –
rlbond
DanThMan: Pochodząc z przeciwnego kierunku (język, który obsługuje wiele wartości zwracanych), można zapytać o to samo: czy kiedykolwiek potrzebujesz parametrów "out", jeśli masz wiele wartości zwracanych? Chcesz * zwrócić * 2 rzeczy, więc dlaczego wygląda tak, jakbym to przekazał? :-) – Ken