Nie znam PHP, ale pierwsza podoba mi się bardziej, ze względy na early return (performance). Obydwie nie podobają mi się ze względu na wyjątek z metody prywatnej, tu jednak bez szerszego kontekstu trudno ocenić czy ten wyjątek się broni, czy jest exception driven development. Gdzie jest obsługa tego wyjątku? W metodzie publicznej czy obsługuje ten, kto woła metodę publiczną?
Niby early return, ale to jest O(n*m)
, bo pętla est ma O(n)
a strPos()
ma O(m)
. Podobną ma array_diff()
.
Wyjątek jest interfejsem tej klasy, tzn on ma być rzucony. Co za różnica czy z prywatnej funkcji czy nie? ;| z resztą nie tego dotyczy wątek.
Jak testujesz te metody? Domyślam się, że w ramach testów jakiejś metody publicznej, ale tu ciekawe jestem kto obsługuje wyjątek.
Zapewniam Cię że są bardzo dobrze przetestowane.
Poza tym, nie tego w ogóle dotyczy pytanie.
Z ciekawości wrzuciłem do CzataGPT i wypluł coś co wygląda jak 3-cia droga z bieda optionalem, ale bez wyjątku. Wygląda jak dobry punkt wyjścia do wywalenia wyjątku i self::candidates
.
private function delimiter(string $pattern): array
{
$availableDelimiters = array_filter(self::$candidates, function($candidate) use ($pattern) {
return strpos($pattern, $candidate) === false;
});
if (empty($availableDelimiters)) {
return ['isPresent' => false];
}
return ['isPresent' => true, 'value' => current($availableDelimiters)];
}
Myślałem o tym, ale tutaj jest dodatkowa funkcja anonimowa, a w php takie funkcje są performance'owo drogie. Po drugie array_filter()
przejdzie wszystkie przypadki, nawet jeśli dałoby się zwrócić pierwszy early returnem. Po trzecie, ja chcę mieć prosty kod. Zwrócenie tablicy ze zmienną ilością elementów, z magicznymi nazwami, nie jest wcale prostsze. Skomplikuje to design.