Witam,
chciałem się dowiedzieć jak najlepiej rozwiązać taki dylemat.
Mamy taką przykładową metodę:
public MyItem GetSomething(int uniqueID, int page = 1, int pageSize = 10) {
// Zrób coś
return myItem;
}
public MyItem GetSomething(int commonID, int page = 1, int pageSize = 10) {
// Zrób coś podobnego
return myItem;
}
Zastosowanie przeciążenia w tym wypadku z takimi samymi typami argumentów nie jest możliwe, ale zastosowanie dwóch metod o różnych nazwach z kolei jest nieestetyczne, bo metoda zwraca coś z API, którego struktura ma jedną metodę, a ta może pobrać oba argumenty.
W tym wypadku dokładnie odzwierciedlająca strukturę API metoda miałaby taki wygląd:
public MyItem GetSomething(in uniqueID, int commonID, int page = 1, int pageSize = 10) {
// Zrób coś podobnego
return myItem;
}
Niby spoko, ale wymusza to na użytkowniku podanie obu parametrów, gdzie priorytet ma commonID i to na jego podstawie wyświetli się wynik. O ile API nie potrzebuje obu, o tyle metoda w C# już w tym wypadku tak.
Kolejna opcja jaka przyszła mi do głowy:
public MyItem GetSomething(int? uniqueID, int? commonID = null, int page = 1, int pageSize = 10) {
// Zrób coś podobnego
return myItem;
}
W powyższym wypadku null zostanie pominięty, a konieczne jest podanie jednego z argumentów. Tutaj jednak z kolei możliwe jest podanie obu null, więc techniczne też może to wprowadzać błąd i co gorsza trzeba w środku to gdzieś sprawdzić.
Czy jest jakiś magiczny myk, który pozwoliłby estetyczne wymusić na użytkowniku podanie poprawnego parametru uniqueID lub commonID, koniecznie jednego z nich, ale nie pozwalał na obie wartości null? Technicznie podanie obu poprawnych wartości też z punktu widzenia konstrukcji metody API jest dopuszczalne. Jak w takiej sytuacji postępować?