DDD Yapı Taşları: Varlıklar ve Değer Nesneleri
Zengin varlıklar ve değişmez değer nesneleriyle alanı modelleyin.
DDD Yapı Taşları: Varlıklar ve Değer Nesneleri, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, PHP Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. PHP Academy kursu toplamda 4 dersten oluşur.
Taktik çekirdek
Alan Odaklı Tasarım'ın taktik kalıpları, iş kavramlarını kodda modellemek için size bir söz dağarcığı sunar. İki temel yapı taşı Varlıklar (zaman içindeki kimlikleriyle tanımlanan nesneler) ve Değer Nesneleri (öznitelikleriyle tanımlanan ve değişmez kabul edilen nesneler)dir. Bu ayrımı doğru yapmak, alan katmanınızdaki diğer her şeyi şekillendirir.
Kimlik ve değer
Bir varlık, nitelikleri değişse bile varlığını sürdüren sabit bir kimliğe sahiptir: Bir Customer, taşındıktan sonra da aynı müşteridir. Bir değer nesnesinin kimliği yoktur; nitelikleri eşit olan iki değer nesnesi, 5 dolarlık iki banknot gibi, birbirinin yerine kullanılabilir. Şunu sorun: "her alan değişirse hâlâ aynı şey midir?" Yanıt evetse bu bir varlıktır.
Bir değer nesnesi
Değer nesneleri değişmez ve kendi kendini doğrular. PHP 8.1 readonly özellikleri değişmezliği zorunlu kılar; kurucu, değişmezleri korur ve böylece geçersiz bir örneğin var olması mümkün olmaz.
<?php
final class Email {
public function __construct(public readonly string $value) {
if (!filter_var($value, FILTER_VALIDATE_EMAIL)) {
throw new InvalidArgumentException("Invalid email: $value");
}
}
public function equals(Email $other): bool {
return strtolower($this->value) === strtolower($other->value);
}
}
$a = new Email('Jane@Example.com');
var_dump($a->equals(new Email('jane@example.com'))); // true
Değere göre eşitlik
Değer nesneleri, başvuruya göre değil yapısal eşitliğe göre karşılaştırılır. == kullanmaya güvenmek yerine açık bir equals() yöntemi sağlayın; çünkü PHP'nin gevşek karşılaştırmasının şaşırtıcı kuralları vardır. Bir Money değer nesnesi hem tutarı hem de para birimini dikkate almalıdır.
<?php
final class Money {
public function __construct(
public readonly int $cents,
public readonly string $currency
) {}
public function equals(Money $o): bool {
return $this->cents === $o->cents && $this->currency === $o->currency;
}
public function add(Money $o): self {
if ($this->currency !== $o->currency) {
throw new DomainException('Currency mismatch');
}
return new self($this->cents + $o->cents, $this->currency);
}
}
$sum = (new Money(500, 'USD'))->add(new Money(250, 'USD'));
echo $sum->cents, PHP_EOL; // 750
Değişmezlik ve yeni örnek üreten yöntemler
Değer nesneleri değişmez olduğundan, birini "değiştirmek" yeni bir örnek döndürmek anlamına gelir. add() veya withAmount() gibi yöntemler hiçbir zaman mevcut nesneyi değiştirmez; yeni bir değer üretir. Bu yaklaşım, aynı nesneye birden çok başvurudan kaynaklanan hataları ortadan kaldırır ve değer nesnelerinin alan genelinde güvenle paylaşılmasını sağlar.
<?php
final class DateRange {
public function __construct(
public readonly DateTimeImmutable $start,
public readonly DateTimeImmutable $end
) {
if ($end < $start) { throw new InvalidArgumentException('end before start'); }
}
public function withEnd(DateTimeImmutable $end): self {
return new self($this->start, $end);
}
}
$r = new DateRange(new DateTimeImmutable('2026-01-01'), new DateTimeImmutable('2026-01-10'));
$r2 = $r->withEnd(new DateTimeImmutable('2026-02-01'));
echo $r->end->format('Y-m-d'), ' / ', $r2->end->format('Y-m-d'), PHP_EOL;
Bir varlık
Bir varlık, genellikle veritabanının otomatik artırdığı bir değerle değil, alan tarafından üretilen bir kimlikle tanımlanır. Eşitlik, kimlikleri karşılaştırır. Nitelikleri, değişmezleri koruyan ve davranış açısından zengin yöntemlerle değiştirilebilir.
<?php
final class Customer {
private Email $email;
public function __construct(
public readonly string $id,
Email $email
) { $this->email = $email; }
public function changeEmail(Email $new): void { $this->email = $new; }
public function email(): Email { return $this->email; }
public function sameIdentityAs(Customer $o): bool { return $this->id === $o->id; }
}
$c = new Customer('cus_1', new Email('a@b.com'));
$c->changeEmail(new Email('c@d.com'));
echo $c->email()->value, PHP_EOL; // c@d.com
Kimlik üretimi
Kimliği kalıcılaştırmadan önce veritabanını beklemek yerine alan içinde (örneğin bir UUID) üretmeyi tercih edin. Bu, bellekte tamamen geçerli bir varlık oluşturmanıza, topluluklar arasında ona başvurmanıza ve veritabanı olmadan sınama yapmanıza olanak tanır. Kimlik, modelin bir parçasıdır; depolama ayrıntısı değildir.
Zengin davranış, anemik veri değil
Yaygın bir karşı örüntü anemik alan modelidir: varlıklar genel alıcı ve ayarlayıcı yöntemlerden oluşan veri yığınlarıdır; tüm mantık ise "hizmet" sınıflarında bulunur. DDD, davranışı varlığın içine taşır. $order->cancel(), çağıran kodun bir durum alanını doğrudan değiştirmesine izin vermek yerine iptal kurallarını kapsüller.
<?php
final class Order {
private string $status = 'open';
public function __construct(public readonly string $id) {}
public function cancel(): void {
if ($this->status === 'shipped') {
throw new DomainException('Cannot cancel a shipped order');
}
$this->status = 'cancelled';
}
public function status(): string { return $this->status; }
}
$o = new Order('o1');
$o->cancel();
echo $o->status(), PHP_EOL; // cancelled
Her yerde değer nesneleri
İlkel tür takıntısını değer nesneleriyle değiştirin. string $email, int $cents ve string $currency değerlerini her yerde geçirmek yerine bunları Email ve Money içinde sarmalayın. Faydaları:
- Doğrulama, oluşturma sırasında bir kez yapılır.
- Alan kuralları (para birimlerinin eşleşmesi) verilerle birlikte bulunur.
- Tür imzaları amacı açıkça belirtir ve değerlerin karıştırılmasını önler.
Kalıcılık eşleme notu
Değer nesneleri çoğu zaman kendi tabloları yerine gömülü sütunlara eşlenir (Doctrine #[Embeddable]). Varlıklar, kimlikleriyle anahtarlanmış satırlara eşlenir. Kalıcılıkla ilgili kaygıları alan nesnelerinin dışında tutun: model, MySQL üzerinde saklandığını bilmemelidir. Bir nesne-ilişkisel eşleme aracı veya elle yazılmış bir eşleyici, zengin alan ile veritabanı arasındaki dönüşümü gerçekleştirir.
Bileşik değer nesneleri
Değer nesneleri bir araya getirilebilir. Bir Address, birkaç ilkel türü kendi eşitlik ve biçimlendirme kurallarına sahip, bütünlüklü tek bir kavramda toplar. Böylece varlık, birbirinden kopuk beş dize yerine tek bir zengin tür barındırır ve adres kuralları tek bir yerde bulunur.
<?php
final class Address {
public function __construct(
public readonly string $street,
public readonly string $city,
public readonly string $postcode
) {
if ($postcode === '') { throw new InvalidArgumentException('postcode required'); }
}
public function equals(Address $o): bool {
return $this->street === $o->street
&& $this->city === $o->city
&& $this->postcode === $o->postcode;
}
public function oneLine(): string {
return "{$this->street}, {$this->city} {$this->postcode}";
}
}
echo (new Address('1 Main St', 'Ankara', '06000'))->oneLine(), PHP_EOL;
Hızlı kontrol
Varlık mı, değer nesnesi mi?
Özet
DDD'nin iki temel yapı taşını öğrendiniz. Varlıklar sabit kimlikleriyle tanımlanır, zengin davranış taşır ve değişmezlerini yöntemler aracılığıyla korur. Değer nesneleri değişmezdir, kendi kendini doğrular ve nitelik eşitliğine göre karşılaştırılır; böylece ilkel tür takıntısının yerini alır. Bunları doğru modellemek ve mantığı anemik veri yığınları yerine nesnelerin içine yerleştirmek; toplulukların, depoların ve alan katmanının geri kalanının temelini oluşturur.
Sıkça Sorulan Sorular
“DDD Yapı Taşları: Varlıklar ve Değer Nesneleri” dersi ücretsiz mi?
Evet — “DDD Yapı Taşları: Varlıklar ve Değer Nesneleri” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve PHP Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. PHP Academy kursu toplamda 4 dersten oluşur.
“DDD Yapı Taşları: Varlıklar ve Değer Nesneleri” dersinde ne öğreneceğim?
Zengin varlıklar ve değişmez değer nesneleriyle alanı modelleyin. PHP Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
PHP Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te PHP Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“DDD Yapı Taşları: Varlıklar ve Değer Nesneleri” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu PHP Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her PHP Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- DDD Yapı Taşları: Varlıklar ve Değer Nesneleri
- Bütünlükler, Depolar ve Fabrikalar
- Alan Olayları ve Alan Hizmetleri
- Sınırlı Bağlamlar ve Bağlam Eşleme