Sınırlı Bağlamlar ve Bağlam Eşleme
Büyük alanları güvenli biçimde iletişim kuran sınırlı bağlamlara ayırın.
Sınırlı Bağlamlar ve Bağlam Eşleme, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 4. 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.
Stratejik DDD
Taktik kalıplar bir alan içindeki nesneleri modeller; stratejik DDD ise büyük bir sistemi bağımsız olarak gelişebilecek parçalara nasıl ayıracağını belirler. Temel kavram Sınırlı Bağlamdır — bir alan modelinin ve dilinin tutarlı olduğu açık bir sınır. Bağlam Haritalama, bu bağlamların nasıl ilişkilendiğini açıklar. Bu, çoğu zaman tek bir sınıf tasarımından daha etkili olur.
Her Yerde Kullanılan Dil
Bir sınırlı bağlamın içinde ekip, her yerde kullanılan bir dil paylaşır — konuşmada, kodda ve modelde kullanılan aynı terimler. Ancak bir sözcük, farklı bağlamlarda farklı anlamlara gelir. Satış bölümündeki (potansiyel müşteriler, indirimler) bir Customer, Destek bölümündeki (destek talepleri, hizmet düzeyi anlaşmaları) Customer ile aynı değildir. Sınırlı bağlam, tek ve şişkin bir ortak modeli zorlamak yerine bu sınırı açıkça ortaya koyar.
Aynı Sözcük, Farklı Modeller
Aynı iş kavramı, bağlama özgü bir model kazanır. Katalogdaki bir Product için açıklamalar ve medya önemlidir; Envanterde ise stok ve konum önemlidir. Her bağlam yalnızca ihtiyaç duyduğu şeyleri tanımlar.
<?php
namespace Catalog;
final class Product {
public function __construct(
public readonly string $sku,
public readonly string $description
) {}
}
namespace Inventory;
final class Product {
public function __construct(
public readonly string $sku,
public readonly int $onHand
) {}
}
namespace App;
$c = new \Catalog\Product('A1', 'Blue mug');
$i = new \Inventory\Product('A1', 42);
echo $c->description, ' / ', $i->onHand, PHP_EOL;
Neden Tek Bir Büyük Model Kullanılmamalı
Her ekibe hizmet edecek tek ve esas bir Customer oluşturmaya çalışmak; çelişen gereksinimlere, ekipler arası çekişmeye ve değişikliklerin kırılganlaşmasına sahip bir tanrı sınıf üretir. Sınırlı bağlamlar, her ekibin kendi modelinin ve dilinin sahibi olmasına, bağımsız dağıtım yapmasına ve sınır noktalarında çeviri yapmasına izin verir. Büyük bir bağımlılık maliyetinden kaçınmak için sınırda küçük bir tümleştirme maliyeti ödersiniz.
Bağlam Haritaları
Bağlam Haritası, sınırlı bağlamlarınızın ve aralarındaki ilişkilerin üst düzey bir görünümüdür. Hem teknik tümleştirmeyi hem de ekip/siyasi ilişkiyi kaydeder (kimin kime bağlı olduğu, kimin değişikliği dayatabildiği). DDD, tekrar tekrar görülen çeşitli ilişki kalıplarını adlandırır; şimdi bunları inceleyeceğiz.
Kodda Uyumcu
İlişkiler çoğu zaman yönlüdür — bir üst akış bağlamı, bir alt akış bağlamını etkiler (Customer/Tedarikçi, Uyumcu, Yolsuzluk Önleme Katmanı). Uyumcu alt akışın herhangi bir etkisi yoktur; bu nedenle üst akışın modelini olduğu gibi benimser: yabancı yapıyı doğrudan tüketir ve bağımlılığı kabul eder.
<?php
// Upstream's shape, used verbatim downstream (Conformist)
final class UpstreamUser {
public function __construct(public readonly int $userId, public readonly string $login) {}
}
final class Greeter { // conforms: depends directly on upstream type
public function greet(UpstreamUser $u): string {
return "Hello {$u->login} (#{$u->userId})";
}
}
echo (new Greeter())->greet(new UpstreamUser(7, 'jane')), PHP_EOL;
Yolsuzluk Önleme Katmanı
Bir ACL, harici/eski bir modeli bağlamınızın temiz modeline çevirir; böylece yabancı kavramların içeri sızması önlenir. Bu, bağlam sınırında uygulanan Uyarlayıcı kalıbıdır ve her yerde kullanılan dilinizi korur.
<?php
// Our clean domain model
final class Customer {
public function __construct(public readonly string $id, public readonly string $name) {}
}
// Legacy/external shape we must not let leak in
$legacy = ['CUST_NO' => '0042', 'FULL_NM' => 'Jane Doe'];
final class LegacyCustomerAcl {
public function toDomain(array $row): Customer {
return new Customer($row['CUST_NO'], $row['FULL_NM']);
}
}
$customer = (new LegacyCustomerAcl())->toDomain($legacy);
echo $customer->id, ' ', $customer->name, PHP_EOL;
Kodda Paylaşılan Çekirdek
- Paylaşılan Çekirdek: iki bağlam, ortaklaşa sahip olunan küçük bir alt kümeyi (aşağıda ortak bir
Moneytürünü) paylaşır — yalnızca anlaşmayla değiştirin. - Ortaklık: iki ekip birlikte başarılı olur veya birlikte başarısız olur.
- Ayrı Yollar: tümleştirme maliyetine değmez.
- Açık Sunucu Hizmeti / Yayınlanmış Dil: üst akış, birçok tüketici için kararlı ve belgelenmiş bir iletişim protokolü sunar.
<?php
namespace Shared; // small, jointly-owned kernel
final class Money {
public function __construct(public readonly int $cents, public readonly string $cur) {}
public function format(): string { return number_format($this->cents / 100, 2) . ' ' . $this->cur; }
}
namespace Billing; // depends on the shared kernel
use Shared\Money;
function invoiceTotal(): Money { return new Money(4999, 'USD'); }
namespace Payroll; // also depends on the SAME shared kernel
use Shared\Money;
function salary(): Money { return new Money(500000, 'USD'); }
PHP'de Bağlamları Tümleştirme
Somut olarak bağlamlar, iyi tanımlanmış sözleşmeler aracılığıyla tümleşir: çeviri yapan bir yöntem, Yayınlanmış Dil'i saran bir API istemcisi veya iletiler. Alıcı taraf, yabancı veri aktarım nesnesini kendi modeline eşler; böylece bağımlılık sınırda sona erer.
<?php
// Published Language DTO from an upstream Open Host Service
final class PricingDto {
public function __construct(public readonly string $sku, public readonly int $cents) {}
}
// Our downstream model
final class CatalogPrice {
public function __construct(public readonly string $sku, public readonly float $amount) {}
}
final class PricingTranslator {
public function translate(PricingDto $dto): CatalogPrice {
return new CatalogPrice($dto->sku, $dto->cents / 100);
}
}
$p = (new PricingTranslator())->translate(new PricingDto('A1', 1599));
echo $p->amount, PHP_EOL; // 15.99
Bağlamlar ve Mimari
Sınırlı bağlamlar, dağıtım birimlerine doğal biçimde eşlenir: açık modül sınırlarına sahip modüler bir monolit veya ayrı mikro hizmetler. Sınır, teknik katmanların değil, iş capability'sinin çevresinde çizilmelidir. Tek bir sıkı bağımlı bağlamı bölen mikro hizmetler dağıtık bir monolit oluşturur; iyi hizalanmış bağlam sınırları ise bağımsız olarak değişen hizmetler ortaya çıkarır.
Birleşme Noktası Olarak Olaylar
Uygulamada, bağlamların modelleri paylaşmadan tümleşmesinin temiz bir yolu olayları değiş tokuş etmektir. Üst akış küçük ve kararlı bir olay yayımlar (Yayınlanmış Dil); alt akış buna abone olur ve olayı kendi modeline eşler — üst akışın sınıflarını hiçbir zaman içe aktarmadan.
<?php
// Published Language: a minimal stable contract
final class OrderPlacedEvent {
public function __construct(public readonly string $orderId, public readonly int $cents) {}
}
// Downstream (Shipping context) maps it to its own model
final class Shipment {
public function __construct(public readonly string $forOrder) {}
}
final class ShippingListener {
public function on(OrderPlacedEvent $e): Shipment {
return new Shipment($e->orderId); // ignores fields it doesn't need
}
}
$shipment = (new ShippingListener())->on(new OrderPlacedEvent('o1', 1300));
echo 'shipment for ', $shipment->forOrder, PHP_EOL;
Hızlı Kontrol
Bağlam ilişkileri.
Özet
Taktik DDD'den stratejik DDD'ye geçtiniz. Sınırlı Bağlam, bir modelin ve her yerde kullanılan dilinin tutarlı kaldığı sınırdır; ekipleri tek ve şişkin bir ortak modelden kurtarır. Bağlam Haritası, Customer/Tedarikçi, Uyumcu, Yolsuzluk Önleme Katmanı, Paylaşılan Çekirdek, Ortaklık, Ayrı Yollar ve Açık Sunucu Hizmeti/Yayınlanmış Dil ilişkilerini belgeler; hem teknik tümleştirmeyi hem de ekip dinamiklerini kaydeder. Sınırları iş capability'lerinin çevresinde çizin, sınır noktalarında çeviri yapın; sisteminiz bağımsız olarak dağıtılabilen parçalara ayrılarak gelişebilsin.
Sıkça Sorulan Sorular
“Sınırlı Bağlamlar ve Bağlam Eşleme” dersi ücretsiz mi?
Evet — “Sınırlı Bağlamlar ve Bağlam Eşleme” 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.
“Sınırlı Bağlamlar ve Bağlam Eşleme” dersinde ne öğreneceğim?
Büyük alanları güvenli biçimde iletişim kuran sınırlı bağlamlara ayırın. 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 4. dersidir.
“Sınırlı Bağlamlar ve Bağlam Eşleme” 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