Muszę zwrócić 2 wartości z metody. Moje podejście jest następujące:
- utwórz wewnętrzną klasę z 2 polami, które będą używane do zachowania tych 2 wartości
- umieść metodę w tej klasie
- utwórz instancję klasy i wywołaj metodę.
Jedyną rzeczą, która zostanie zmieniona w metodzie jest to, że ostatecznie przypisze te 2 wartości do pól instancji. Następnie mogę odnieść się do tych wartości, odwołując się do pól tego obiektu.
Czy to dobry projekt i dlaczego?
java
design-patterns
dhblah
źródło
źródło
BitInteger[] java.math.BigInteger.divideAndRemainder(BitInteger val)
. Zwraca 2 liczby całkowite jako wartości zwracane w tablicy.Odpowiedzi:
Argumentowałbym to w następujący sposób:
Podsumowując, chciałbym przekonać się, czy mogę przekształcić ten „obiekt danych” w rozwiniętą klasę z danymi i zachowaniem. Jako dodatkowy komentarz, możesz sprawić, by klasa była niezmienna, ponieważ jej stan jest ustawiany raz. Uczynienie go niezmiennym pomoże zapobiec niepoprawnemu ustawieniu lub modyfikacji w późniejszym czasie (powiedzmy, że ktoś ustawi jedno z pól na zero i przekaże je dalej).
Edycja: Jak słusznie zauważa Patkos Csaba, stosowana tutaj zasada to Zasada Jednej Odpowiedzialności ( SRP ) - klasa, którą próbujesz stworzyć, powinna mieć naprawdę jedną odpowiedzialność (zdefiniowaną jako powód zmiany ). Te wytyczne projektowe powinny pomóc ci dowiedzieć się, czy twoje dwa pola należą do jednej klasy, czy nie. Aby trzymać się przykładu z Wikipedii, twoja klasa może być postrzegana jako rodzaj raportu, w którym to przypadku jest zgodny z SRP, ale trudno jest skomentować bez dalszych informacji.
źródło
Pair<OneClass, AnotherClass>
. Niektórzy się nie zgodzą . W każdym raziePair
powinien być szczegółem implementacji i nigdy nie powinien pojawiać się w publicznej metodzie API.Istnieje koncepcja krotki, która występuje w innych językach, takich jak Python.
Można zwrócić instancję tej uogólnionej klasy, którą można łatwo ponownie wykorzystać:
źródło
create()
, aby uniknąć konieczności określania parametrów typu w konstruktorze. Również chciałbym wymienić tę klasęPair
zamiastTuple
, ponieważ może reprezentować tylko 2-krotki wartości.Wygląda na to, że ta klasa odbiera odpowiedzialność innej klasie, a to sprawia, że myślę, że ten projekt nie jest świetny.
W przypadku metody zwracającej wartości uniwersalne wolałbym
lub
Przykład dla drugiej opcji:
źródło
Wpisywanie wielu zwracanych wartości z metody do jej własnej klasy / struktury jest często stosowane w systemach opartych na komunikatach, które mają jedną klasę dla żądania i odpowiedzi . Przykładem tego jest protokół Simple Object Access Protocol (SOAP) .
Przynajmniej jest to dość powszechne. To, czy jest to dobre czy złe, zależy od twojego specjalnego przypadku użycia.
źródło
Krótka odpowiedź: możesz zwrócić tablicę lub listę z dwiema wartościami.
Osobiście napisałbym dwie różne metody
źródło