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:
Kopiuj
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
Kopiuj
Znajdz_nazwe(10,
(name) => Console.Write("name found " + name),
() => Console.Write("name not found"));
Podejście z implementacją interfejsu
Kopiuj
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ą.