0Pricing
PHP Academy · درس

السياقات المحددة ورسم خرائط السياق

قسّم النطاقات الكبيرة إلى سياقات محددة تتواصل بأمان.

السياقات المحددة ورسم خرائط السياق درس مجاني في PHP Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في PHP Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة PHP Academy 4 دروس في المجموع.

DDD الاستراتيجي

تُنمذج الأنماط التكتيكية الكائنات داخل مجال ما؛ أما DDD الاستراتيجي فيحدّد كيفية تقسيم نظام كبير إلى أجزاء يمكنها التطور باستقلالية. المفهوم المحوري هو السياق المحدود — وهو حد صريح يظل نموذج المجال ولغته متسقين داخله. وتصف خريطة السياق كيفية ارتباط هذه السياقات. وغالبًا ما يكون لهذا أثر أكبر من تصميم أي صنف منفرد.

اللغة المشتركة

داخل سياق محدود، يتشارك الفريق لغة مشتركة — وهي المصطلحات نفسها المستخدمة في الحوار والشيفرة والنموذج. لكن الكلمة قد تعني أشياء مختلفة في سياقات مختلفة. فـ Customer في قسم المبيعات (العملاء المحتملون والخصومات) ليس هو Customer في قسم الدعم (التذاكر واتفاقيات مستوى الخدمة). يجعل السياق المحدود هذا الحد صريحًا بدلًا من فرض نموذج مشترك متضخم.

الكلمة نفسها، نماذج مختلفة

يحصل المفهوم التجاري نفسه على نموذج خاص بسياقه. يهتم Product في الكتالوج بالأوصاف والوسائط؛ بينما يهتم به في المخزون من حيث الكمية والموقع. ويعرّف كل سياق ما يحتاج إليه فقط.

<?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;

لماذا لا نستخدم نموذجًا واحدًا كبيرًا

إن محاولة جعل Customer واحدًا وموحدًا يخدم كل فريق تنتج صنفًا متضخمًا ذا متطلبات متعارضة، وتنازعًا بين الفرق، وتغييرات هشة. تتيح السياقات المحدودة لكل فريق امتلاك نموذجه ولغته، والنشر باستقلالية، والترجمة عند الحدود. عند الحد تدفعون تكلفة تكامل صغيرة لتتجنبوا تكلفة اقتران كبيرة.

خرائط السياق

إن خريطة السياق صورة عالية المستوى لسياقاتكم المحدودة والعلاقات بينها. وهي تسجّل التكامل التقني وعلاقة الفريق/السياسة التنظيمية أيضًا (من يعتمد على من، ومن يستطيع فرض التغيير). يسمّي DDD عدة أنماط متكررة للعلاقات، وسنستعرضها الآن.

نمط Conformist في الشيفرة

غالبًا ما تكون العلاقات اتجاهية — إذ يؤثر سياق upstream في سياق downstream (Customer/Supplier وConformist وAnticorruption Layer). لا يملك سياق Conformist في جهة downstream أي نفوذ، لذلك يتبنى نموذج upstream كما هو ببساطة: ويستهلك البنية الأجنبية مباشرة، قابلًا بالاقتران.

<?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;

Anticorruption Layer

تترجم ACL نموذجًا خارجيًا أو قديمًا إلى نموذج سياقكم النظيف، بحيث لا تتسرب المفاهيم الأجنبية إلى الداخل. إنها نمط Adapter مطبّق عند حد السياق، وتحمي لغتكم المشتركة.

<?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;

Shared Kernel في الشيفرة

  • Shared Kernel: يشترك سياقان في مجموعة فرعية صغيرة مملوكة لهما معًا (نوع Money مشترك أدناه) — ولا يُغيَّر إلا بالاتفاق.
  • Partnership: ينجح فريقان معًا أو يفشلان معًا.
  • Separate Ways: لا يستحق التكامل تكلفته.
  • Open Host Service / Published Language: يوفّر upstream بروتوكولًا مستقرًا وموثقًا لعدد كبير من المستهلكين.
<?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

عمليًا، تتكامل السياقات عبر عقود محددة بوضوح: طريقة ترجمة، أو عميل API يغلّف Published Language، أو رسائل. ويحوّل الجانب المستقبِل DTO الأجنبي إلى نموذجه الخاص، بحيث يتوقف الاقتران عند الحد.

<?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

السياقات والبنية المعمارية

تتطابق السياقات المحدودة طبيعيًا مع وحدات النشر: أحاديّ كتلي معياري ذي حدود واضحة بين الوحدات، أو خدمات مصغّرة منفصلة. ينبغي رسم الحد حول القدرة التجارية لا حول الطبقات التقنية. تؤدي الخدمات المصغّرة التي تقسّم سياقًا واحدًا شديد الاقتران إلى أحاديّ كتلي موزّع؛ أما الحدود المتوافقة جيدًا بين السياقات فتنشئ خدمات تتغير باستقلالية.

الأحداث بوصفها نقطة الفصل

عمليًا، تتمثل إحدى الطرق النظيفة لتكامل السياقات دون مشاركة النماذج في تبادل الأحداث. ينشر upstream حدثًا صغيرًا ومستقرًا (Published Language)، ثم يشترك downstream فيه ويحوّله إلى نموذجه الخاص — ولا يستورد أصناف upstream مطلقًا.

<?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;

اختبار سريع

علاقات السياقات.

مراجعة

لقد انتقلتم من DDD التكتيكي إلى DDD الاستراتيجي. السياق المحدود هو الحد الذي يظل النموذج ولغته المشتركة متسقين داخله، مما يحرر الفرق من نموذج مشترك واحد متضخم. توثّق خريطة السياق العلاقات — Customer/Supplier وConformist وAnticorruption Layer وShared Kernel وPartnership وSeparate Ways وOpen Host Service/Published Language — وتسجّل التكامل التقني وديناميكيات الفرق معًا. ارسموا الحدود حول القدرات التجارية، وأجروا الترجمة عند الأطراف، وسيتمكن نظامكم من التطور في أجزاء يمكن نشرها باستقلالية.

الأسئلة الشائعة

هل درس «السياقات المحددة ورسم خرائط السياق» مجاني؟

نعم — نص درس «السياقات المحددة ورسم خرائط السياق» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة PHP Academy، انتقل إلى CoddyKit PRO. تتضمن دورة PHP Academy 4 دروس في المجموع.

ماذا ستتعلم في «السياقات المحددة ورسم خرائط السياق»؟

قسّم النطاقات الكبيرة إلى سياقات محددة تتواصل بأمان. تتمرن على PHP Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ PHP Academy؟

لا تُشترط خبرة سابقة. PHP Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «السياقات المحددة ورسم خرائط السياق»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس PHP Academy هذا؟

نعم. كل درس في PHP Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. لبنات DDD الأساسية: الكيانات وكائنات القيمة
  2. التجميعات والمستودعات والمصانع
  3. أحداث النطاق وخدمات النطاق
  4. السياقات المحددة ورسم خرائط السياق
← العودة إلى PHP Academy