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:

  1. Definicja interfejsu wyszukiwania: Tworzymy interfejs, który zdefiniuje metodę wyszukiwania.
  2. 
    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.

  3. Implementacja strategii liniowej: Tworzymy klasę implementującą interfejs SearchStrategy dla wyszukiwania liniowego.
  4. 
    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.

  5. Implementacja strategii binarnej (dla tablic posortowanych): Dodajemy klasę dla wyszukiwania binarnego (wymaga posortowanej tablicy).
  6. 
    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.

  7. Użycie strategii: Wybieramy strategię w zależności od potrzeb.
  8. 
    $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!

Dodaj komentarz 0

Your email address will not be published. Required fields are marked *