Uygulamada, e-ticaret sistemlerindeki siparişler genellikle zamanla evrim geçirir ve bu da onları Builder Pattern için mükemmel bir aday haline getirir.
Bir e-ticaret uygulamasında sipariş oluşturmak genellikle ilk başta basit görünür: bir müşteri ürünleri seçer, bunları bir sepete ekler ve ödeme yapar. Ancak, uygulamanız büyüdükçe, Sipariş sınıfı hızla karmaşık hale gelebilir. Opsiyonel indirimler, gönderim seçenekleri, hediye paketi seçeneği, farklı ödeme yöntemleri gibi durumları yönetmek gerekebilir. Kısa süre içinde, yapıcı fonksiyon şu şekilde görünür:
$order = new Order(
$customerId,
$items,
$paymentMethod,
$shippingAddress,
$discountCode,
$giftWrap = true,
$specialInstructions = null
);
Bu durum hem okunması zor hem de sipariş oluştururken hata yapmayı kolaylaştırır. Bu nedenle, Builder Pattern doğal bir çözüm haline gelir. Bu yöntem, nesneleri adım adım inşa etmenizi sağlar, opsiyonel parametreleri şık bir şekilde yönetir ve kodunuzun okunabilir ve sürdürülebilir olmasını sağlar.
Bu makalede, PHP/Laravel’daki Sipariş sınıfına Builder Pattern nasıl uygulanır, okunabilirliği, test edilebilirliği ve esnekliği nasıl artırır, keşfedeceğiz.
Builder Pattern Neden Siparişler İçin Kullanışlıdır?
Builder Pattern Neden Siparişler İçin Kullanışlıdır?
Builder Pattern, özellikle aşağıdaki durumlarda faydalıdır:
- Sınıfın birçok opsiyonel parametreye sahip olması
- Sınıfın karmaşık kurulum veya doğrulama gerektirmesi
- Uzun yapıcıları önlemek istemeniz
- Açık, okunabilir, akıcı kod istiyorsanız
E-ticarette, siparişlerin çoğu bu kriterleri karşılar. Bir yapılandırıcı kullanarak, sınıfın işlevselliği ile yapılandırma mantığını ayırabilir ve bakımını daha kolay hale getirebiliriz.
Adım 1: Sipariş Sınıfını Tasarlamak
Adım 1: Sipariş Sınıfını Tasarlamak
İlk olarak, nihai bir siparişi temsil eden basit bir Sipariş sınıfı ile başlayalım. Bir sipariş oluşturulduğunda değişmez olduğunu varsayalım:
class Order
{
public function __construct(
public int $customerId,
public array $items,
public string $paymentMethod,
public string $shippingAddress,
public ?string $discountCode = null,
public bool $giftWrap = false,
public ?string $specialInstructions = null
) {}
}
Ancak, yapıcı hâlâ çok sayıda parametre alıyor, bunların bazıları opsiyonel. Bu çalışsa da, gelecekte daha fazla seçenek eklenirse ölçeklenebilirliği zor hale gelir.
Adım 2: Sipariş Yapıcısını Oluşturmak
Adım 2: Sipariş Yapıcısını Oluşturmak
Olayları adım adım yönetmek için bir SiparişYapıcısı sınıfı oluşturabiliriz:
class OrderBuilder
{
private int $customerId;
private array $items = [];
private string $paymentMethod = 'credit_card';
private string $shippingAddress = "";
private ?string $discountCode = null;
private bool $giftWrap = false;
private ?string $specialInstructions = null;
public static function create(): self
{
return new self();
}
public function customerId(int $customerId): self
{
$this->customerId = $customerId;
return $this;
}
public function addItem(array $item): self
{
$this->items[] = $item;
return $this;
}
public function paymentMethod(string $method): self
{
$this->paymentMethod = $method;
return $this;
}
public function shippingAddress(string $address): self
{
$this->shippingAddress = $address;
return $this;
}
public function discountCode(string $code): self
{
$this->discountCode = $code;
return $this;
}
public function giftWrap(bool $flag): self
{
$this->giftWrap = $flag;
return $this;
}
public function specialInstructions(string $instructions): self
{
$this->specialInstructions = $instructions;
return $this;
}
public function build(): Order
{
if (empty($this->customerId)) {
throw new \InvalidArgumentException('Müşteri ID\'si gereklidir.');
}
if (empty($this->items)) {
throw new \InvalidArgumentException('En az bir ürün gereklidir.');
}
if (empty($this->shippingAddress)) {
throw new \InvalidArgumentException('Gönderim adresi gereklidir.');
}
return new Order(
$this->customerId,
$this->items,
$this->paymentMethod,
$this->shippingAddress,
$this->discountCode,
$this->giftWrap,
$this->specialInstructions
);
}
}
Önemli birkaç noktayı fark edin:
- Açık arayüz: Her ayarlayıcı $this döner ve zincirleme çağrılara izin verir.
- build() içinde doğrulama: Zorunlu alanlar, Order oluşturmadan önce kontrol edilir.
- Aşamalı inşaat: Öğeler eklenebilir veya seçenekler birer birer ayarlanabilir.
Adım 3: Yapıcıyı Kullanmak
Adım 3: Yapıcıyı Kullanmak
Bir sipariş oluşturma durumu yapıcı olmadan şu şekilde görünür:
$order = new Order(
123,
[['product_id' => 1, 'quantity' => 2], ['product_id' => 5, 'quantity' => 1]],
'paypal',
'123 Ana Cadde, Şehir, Ülke',
'DISCOUNT10',
true,
'Kapıda bırakın'
);
Sonuç olarak, okunması zor ve hata yapmaya eğilimlidir.
Yapıcı ile bu daha sade hale gelir:
$order = OrderBuilder::create()
->customerId(123)
->addItem(['product_id' => 1, 'quantity' => 2])
->addItem(['product_id' => 5, 'quantity' => 1])
->paymentMethod('paypal')
->shippingAddress('123 Ana Cadde, Şehir, Ülke')
->discountCode('DISCOUNT10')
->giftWrap(true)
->specialInstructions('Kapıda bırakın')
->build();
- Çok daha temiz ve okunabilir.
- Opsiyonel alanları atlamak ya da daha fazla ürün eklemek kolaydır.
- Doğrulama, tüm zorunlu alanların ayarlandığından emin olur.
Adım 4: Laravel Görevleri veya Hizmetleri ile Entegre Etme
Adım 4: Laravel Görevleri veya Hizmetleri ile Entegre Etme
Laravel’de, siparişler genellikle asenkron olarak İşler veya Hizmetler kullanılarak işlenir. Yapıcılar bunu daha kolay hale getirir:
$order = OrderBuilder::create()
->customerId($user->id)
->addItem(['product_id' => $product->id, 'quantity' => 1])
->shippingAddress($user->address)
->build();
dispatch(new ProcessOrderJob($order));
Ayrıca, yaygın sipariş kurulumları için tekrar kullanılabilir şablonlar oluşturabilirsiniz:
class OrderBuilderFactory
{
public static function giftOrder(int $customerId, array $items, string $address): OrderBuilder
{
return OrderBuilder::create()
->customerId($customerId)
->shippingAddress($address)
->giftWrap(true)
->paymentMethod('credit_card')
->addItem(...$items);
}
}
$order = OrderBuilderFactory::giftOrder($user->id, $items, $user->address)->build();
Bu desen, standartlaştırılmış sipariş türleri olan durumlar için mükemmeldir, örneğin hediyeler veya toplu siparişler gibi.
Adım 5: Builder Pattern Kullanmanın Avantajları
Adım 5: Builder Pattern Kullanmanın Avantajları
Okunabilirlik: Siparişlerin oluşturulması, bir dizi talimat gibi okunur.
Doğrulama: Tüm zorunlu alanlar bir yerde kontrol edilir.
Esneklik: Opsiyonel alanlar, geri kalanını etkilemeden atlanabilir.
Test edilebilirlik: Yapıcılar, Sipariş sınıfından bağımsız olarak test edilebilir.
Genişletilebilirlik: Yeni opsiyonel özelliklerin (ör. hediye paketi, promosyon kodları) eklenmesi mevcut kodu bozmaz.
Adım 6: Ne Zaman Yapıcı Kullanılmamalı
Adım 6: Ne Zaman Yapıcı Kullanılmamalı
Her zaman yapıcılar gerekli değildir. Aşağıdaki durumlarda kullanmaktan kaçının:
- Sınıfın yalnızca 2–3 parametreye sahip olması.
- Nesneler, opsiyonel parametreleri olmayan basit DTO’lar ise.
- Açık API’ler gereksiz karmaşıklık ekliyorsa.
Küçük nesneler için basit bir yapıcı veya isimlendirilmiş yapıcılar yeterli olabilir.
Adım 7: Özet
Adım 7: Özet
Builder Pattern, PHP ve Laravel’de karmaşık nesne yaratımını yönetmek için basit ama güçlü bir yöntemdir. Yapıyı nesneden ayırarak, kodunuzun okunabilir, sürdürülebilir ve test edilebilir olmasını sağlar.
Sipariş sınıfı gibi birçok opsiyonel özelliğe sahip bir yapıcı kullanımı, uzun, karmaşık yapıcılarla uğraşmadan örnekleri oluşturmanın şu anda basit, adım adım bir yolunu sağlar.
Anahtar çıkarımlar:
- Builder kullanın, karmaşık veya opsiyonel-hafif nesneler için.
- build() metodunda doğrulama tutun.
- Okunabilirlik için açık arayüzleri kullanın.
- Tekrar kullanılabilir şablonlar için fabrika metodunu düşünün.
Builder Pattern ile sipariş oluşturma kodunuz uygulamanızla birlikte büyüyebilir—parametreler ve karmaşadan oluşan bir karmaşaya dönüşmeden.
Kaynak: Orijinal Makale
- Builder Pattern Neden Siparişler İçin Kullanışlıdır?
- Adım 1: Sipariş Sınıfını Tasarlamak
- Adım 2: Sipariş Yapıcısını Oluşturmak
- Adım 3: Yapıcıyı Kullanmak
- Adım 4: Laravel Görevleri veya Hizmetleri ile Entegre Etme
- Adım 5: Builder Pattern Kullanmanın Avantajları
- Adım 6: Ne Zaman Yapıcı Kullanılmamalı
- Adım 7: Özet


