Czyli masz metodę która może coś znaleźć, i wtedy chcesz coś zrobić z wynikiem, albo może czegoś nie znaleźć - i co wtedy chcesz zrobić?
Czyli w pseudokodzie, chcesz zrobić coś takiego:
Coś coś = Znajdz_nazwe(10);
if (...) { // jakieś sprawdzenie czy znalazło nazwę
return "Znalazłem nazwę " + coś;
} else {
return "Nie znalazłem nazwy";
}
Więc pytanie co może być tym "czymś"?
- Możesz zwrócić
null
, i wtedy musisz zrobić nullchecka: wtedy wartość znaleziona to string
, a null
oznacza "nie znaleziono". Możesz też zrobić parametr out
albo ref
, ale tak czy tak będziesz musiał coś do nich wstaw
- Możesz rzucić i złapać wyjątek: wtedy wartość znaleziona to jest to co zwróci funkcja, a wyjątek oznacza "nie znaleziono"
- Możesz zwrócić jakiś obiekt jak
Optional
/Result
, którego wartość present to jest wartość znaleziona, a pusty result oznacza "nie znaleziono",
- Możesz zrobić w obiektowym stylu swoją klasę, np
FoundName
z metodami isFound()
oraz name()
; i metoda isFound()
zwraca true
lub false
w zależności od tego czy coś jest znalezione, i jeśli tak to name()
zwraca to co jest znalezione
Dodatkowo, niektóre z tych opcji pozwalają skrócić ten zapis, np zamieniając go na ternary ?
/:
lub null coalesce ??
, ale tak czy tak ten if
tam będzie (tylko schowany).
Oprócz tego, możesz "zwrócić" wartość używając out
albo ref
, ale tak czy tak musisz zdecydować co tam "włożyć", albo null
, albo instancje klasy.
Bardziej hardcore'owe wyjście, to np przekazanie dwóch strategii do Znajdz_nazwe
, przekazując np dwie lambdy lub dwie implementacje jakiegoś interfejsu, np:
Podejście z lambdami
Znajdz_nazwe(10,
(name) => Console.Write("name found " + name),
() => Console.Write("name not found"));
Podejście z implementacją interfejsu
interface Listener {
void nameFound(string name);
void nameNotFound();
}
Znajdz_nazwe(10, new Listener {
void nameFound(string name) {
Console.Write("Name found " + name);
}
void nameNotFound() {
Console.Write("Name not found");
}
});
Te 6 wyjść to jest niestety wszystko co możesz zrobić, innej opcji oprócz nich chyba nie ma. Ja osobiście chyba wybrałbym opcje z Result
albo z własną klasą.