Sobes.tech
Middle

PHP'de 'Strateji' tasarım desenini nasıl uyguluyorsunuz?

sobes.tech yapay zeka

AI'dan gelen yanıt

Strateji Deseni, farklı algoritmaları ayrı sınıflarda kapsüllemeye ve çalışma zamanında bunları değiştirilebilir hale getirmeye olanak tanır. Müşteri kodu, stratejilerin ortak arayüzüyle çalışır ve onların somut uygulamasını bilmez.

PHP'deki uygulama şunları içerir:

  1. Strateji Arayüzü: Tüm somut stratejilerin uygulayacağı ortak bir yöntemi tanımlar.
  2. Somut Stratejiler: Arayüzü uygulayan ve algoritmanın özgü mantığını içeren sınıflar.
  3. Bağlam: Bir strateji nesnesine referans içeren ve yöntemi bu nesneye devreden sınıf.

Örnek:

// 1. Strateji Arayüzü
interface SortStrategy
{
    public function sort(array $data): array;
}

// 2. Somut Strateji (balon sıralama)
class BubbleSortStrategy implements SortStrategy
{
    public function sort(array $data): array
    {
        $n = count($data);
        for ($i = 0; $i < $n; $i++) {
            for ($j = 0; $j < $n - 1 - $i; $j++) {
                if ($data[$j] > $data[$j + 1]) {
                    $temp = $data[$j];
                    $data[$j] = $data[$j + 1];
                    $data[$j + 1] = $temp;
                }
            }
        }
        return $data;
    }
}

// 2. Somut Strateji (hızlı sıralama)
class QuickSortStrategy implements SortStrategy
{
    public function sort(array $data): array
    {
        // Basit uygulama örneği, gerçek kodda rekürsif
        sort($data); // Dahili fonksiyon kullanımı
        return $data;
    }
}

// 3. Bağlam
class SortedList
{
    private SortStrategy $strategy;
    private array $data;

    public function __construct(array $data)
    {
        $this->data = $data;
    }

    public function setSortStrategy(SortStrategy $strategy): void
    {
        $this->strategy = $strategy;
    }

    public function sort(): array
    {
        if (!isset($this->strategy)) {
            throw new \RuntimeException("Sıralama stratejisi ayarlanmamış.");
        }
        return $this->strategy->sort($this->data);
    }
}

// Kullanım
$data = [5, 2, 8, 1, 9, 4];
$sortedList = new SortedList($data);

// Balon sıralama kullanımı
$sortedList->setSortStrategy(new BubbleSortStrategy());
$sortedDataBubble = $sortedList->sort();
print_r($sortedDataBubble);

// Hızlı sıralama kullanımı
$sortedList->setSortStrategy(new QuickSortStrategy());
$sortedDataQuick = $sortedList->sort();
print_r($sortedDataQuick);

Avantajlar:

  • Esneklik: Yeni sıralama algoritmaları, bağlamı değiştirmeden eklenebilir.
  • Genişletilebilirlik: Yeni stratejiler bağımsız olarak uygulanabilir.
  • Kodun temizliği: Bağlam, belirli algoritmaların mantığından ayrılmıştır.
  • Test edilebilirlik: Her strateji izole edilerek test edilebilir.