Wyszukiwanie wartości z użyciem technik programowania obiektowego (wzorce projektowe)
Założenie: Stworzymy elastyczny system wyszukiwania, który pozwoli na łatwe dodawanie nowych algorytmów bez modyfikacji istniejącego kodu.
Krok po kroku:
- Definicja interfejsu wyszukiwania: Tworzymy interfejs, który zdefiniuje metodę wyszukiwania.
- Implementacja strategii liniowej: Tworzymy klasę implementującą interfejs
SearchStrategy
dla wyszukiwania liniowego. - Implementacja strategii binarnej (dla tablic posortowanych): Dodajemy klasę dla wyszukiwania binarnego (wymaga posortowanej tablicy).
- Użycie strategii: Wybieramy strategię w zależności od potrzeb.
interface SearchStrategy {
public function search(array $data, $value): ?int;
}
Ten interfejs wymusza implementację metody search
, która przyjmuje tablicę danych i wartość do wyszukania, zwracając indeks znalezionej wartości lub null
.
class LinearSearch implements SearchStrategy {
public function search(array $data, $value): ?int {
foreach ($data as $key => $item) {
if ($item === $value) {
return $key;
}
}
return null;
}
}
Klasa LinearSearch
implementuje prostą iterację po tablicy.
class BinarySearch implements SearchStrategy {
public function search(array $data, $value): ?int {
sort($data); // Upewniamy się, że tablica jest posortowana
$low = 0;
$high = count($data) - 1;
while ($low <= $high) {
$mid = floor(($low + $high) / 2);
if ($data[$mid] == $value) {
return $mid;
} elseif ($data[$mid] < $value) {
$low = $mid + 1;
} else {
$high = $mid - 1;
}
}
return null;
}
}
Klasa BinarySearch
implementuje algorytm wyszukiwania binarnego.
$data = [1, 5, 2, 8, 3];
$valueToFind = 8;
$linearSearch = new LinearSearch();
$binarySearch = new BinarySearch();
$indexLinear = $linearSearch->search($data, $valueToFind);
$dataSorted = $data;
sort($dataSorted);
$indexBinary = $binarySearch->search($dataSorted, $valueToFind);
echo "Wyszukiwanie liniowe: " . ($indexLinear !== null ? $indexLinear : "Nie znaleziono") . PHP_EOL;
echo "Wyszukiwanie binarne: " . ($indexBinary !== null ? $indexBinary : "Nie znaleziono") . PHP_EOL;
Ten kod demonstruje użycie obu strategii.
Podsumowanie: Ten przykład pokazuje, jak wzorce projektowe, takie jak Strategia, mogą uczynić kod bardziej elastycznym i łatwym w utrzymaniu. Zachęcamy do dalszego zgłębiania tematu wzorców projektowych w PHP!