0Pricing
PHP Academy · Pelajaran

Konteks Terbatas dan Pemetaan Konteks

Pisahkan domain besar menjadi konteks terbatas yang dapat berkomunikasi dengan aman.

Konteks Terbatas dan Pemetaan Konteks adalah pelajaran PHP Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar PHP Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus PHP Academy mencakup 4 pelajaran total.

DDD Strategis

Pola taktis memodelkan objek di dalam suatu domain; DDD strategis menentukan cara membagi sistem besar menjadi bagian-bagian yang dapat berkembang secara mandiri. Konsep utamanya adalah Konteks Terbatas — batas eksplisit tempat model domain dan bahasanya konsisten. Pemetaan Konteks menjelaskan hubungan antarkonteks tersebut. Hal ini sering kali lebih berdampak daripada desain satu kelas apa pun.

Bahasa yang Digunakan Bersama

Di dalam konteks terbatas, tim menggunakan bahasa yang digunakan bersama — istilah yang sama dalam percakapan, kode, dan model. Namun, satu kata dapat memiliki arti berbeda dalam konteks yang berbeda. Customer di Penjualan (prospek, diskon) tidak sama dengan Customer di Dukungan (tiket, perjanjian tingkat layanan). Konteks terbatas membuat batas tersebut menjadi jelas, alih-alih memaksakan satu model bersama yang terlalu besar.

Kata yang Sama, Model yang Berbeda

Konsep bisnis yang sama mendapatkan model khusus konteks. Product di Katalog memperhatikan deskripsi dan media; di Inventaris, yang diperhatikan adalah stok dan lokasi. Setiap konteks hanya mendefinisikan hal-hal yang dibutuhkannya.

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

Mengapa Bukan Satu Model Besar

Upaya membuat satu Customer kanonis untuk melayani setiap tim menghasilkan kelas yang menangani terlalu banyak hal, persyaratan yang saling bertentangan, perebutan kendali antar tim, dan perubahan yang rapuh. Konteks terbatas memungkinkan setiap tim memiliki model dan bahasanya sendiri, menerapkannya secara mandiri, serta menerjemahkan data di batas konteks. Di batas itulah Anda membayar sedikit biaya integrasi untuk menghindari biaya keterikatan yang besar.

Peta Konteks

Peta Konteks adalah gambaran tingkat tinggi tentang konteks terbatas Anda dan hubungan di antaranya. Peta ini mencatat integrasi teknis sekaligus hubungan antartim/politik (siapa bergantung pada siapa, siapa yang dapat menentukan perubahan). DDD menamai beberapa pola hubungan yang sering muncul, yang akan kita bahas berikutnya.

Konformis dalam Kode

Hubungan sering bersifat berarah — konteks hulu memengaruhi konteks hilir (Customer/Pemasok, Konformis, Lapisan Antikorupsi). Konteks hilir yang Konformis tidak memiliki daya tawar, jadi cukup mengadopsi model hulu apa adanya: konteks tersebut menggunakan bentuk asing secara langsung dan menerima keterikatan itu.

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

Lapisan Antikorupsi

ACL menerjemahkan model eksternal/lama ke dalam model bersih milik konteks Anda, sehingga konsep asing tidak pernah merembes ke dalam. Ini adalah pola Adaptor yang diterapkan pada batas konteks untuk melindungi bahasa yang digunakan bersama.

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

Kernel Bersama dalam Kode

  • Kernel Bersama: dua konteks berbagi subset kecil yang dimiliki bersama (di bawah ini, tipe Money yang sama) — ubahlah hanya berdasarkan kesepakatan.
  • Kemitraan: dua tim berhasil atau gagal bersama.
  • Jalur Terpisah: integrasi tidak sebanding dengan biayanya.
  • Layanan Host Terbuka / Bahasa Terpublikasi: konteks hulu menawarkan protokol yang stabil dan terdokumentasi bagi banyak konsumen.
<?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'); }

Mengintegrasikan Konteks dalam PHP

Secara konkret, konteks berintegrasi melalui kontrak yang terdefinisi dengan baik: metode penerjemah, klien API yang membungkus Bahasa Terpublikasi, atau pesan. Sisi penerima memetakan objek transfer data asing ke dalam modelnya sendiri, sehingga keterikatan berhenti di batas konteks.

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

Konteks dan Arsitektur

Konteks terbatas secara alami dapat dipetakan ke unit penerapan: monolit modular dengan batas modul yang jelas, atau layanan mikro yang terpisah. Batas tersebut harus dibuat di sekitar kapabilitas (capability) bisnis, bukan lapisan teknis. Layanan mikro yang memisahkan satu konteks yang sangat saling terikat akan menghasilkan monolit terdistribusi; batas konteks yang selaras dengan baik menghasilkan layanan yang dapat berubah secara mandiri.

Peristiwa sebagai Batas Penghubung

Dalam praktiknya, cara yang bersih bagi konteks untuk berintegrasi tanpa berbagi model adalah dengan bertukar peristiwa. Konteks hulu menerbitkan peristiwa kecil dan stabil (Bahasa Terpublikasi); konteks hilir berlangganan dan memetakannya ke dalam modelnya sendiri — tidak pernah mengimpor kelas dari konteks hulu.

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

Pemeriksaan Cepat

Hubungan antarkonteks.

Rangkuman

Anda telah beralih dari DDD taktis ke DDD strategis. Konteks Terbatas adalah batas tempat suatu model dan bahasa yang digunakan bersamanya tetap konsisten, sehingga tim terbebas dari satu model bersama yang terlalu besar. Peta Konteks mendokumentasikan hubungan — Customer/Pemasok, Konformis, Lapisan Antikorupsi, Kernel Bersama, Kemitraan, Jalur Terpisah, Layanan Host Terbuka/Bahasa Terpublikasi — sekaligus mencatat integrasi teknis dan dinamika tim. Buat batas di sekitar kapabilitas bisnis, lakukan penerjemahan di batas konteks, dan sistem Anda dapat berkembang menjadi bagian-bagian yang dapat diterapkan secara mandiri.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Konteks Terbatas dan Pemetaan Konteks” gratis?

Ya — teks lengkap “Konteks Terbatas dan Pemetaan Konteks” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus PHP Academy, upgrade ke CoddyKit PRO. Kursus PHP Academy mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Konteks Terbatas dan Pemetaan Konteks”?

Pisahkan domain besar menjadi konteks terbatas yang dapat berkomunikasi dengan aman. Kamu berlatih PHP Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai PHP Academy?

Tidak diperlukan pengalaman sebelumnya. PHP Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.

Berapa lama pelajaran “Konteks Terbatas dan Pemetaan Konteks” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran PHP Academy ini?

Ya. Setiap pelajaran PHP Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Blok Bangunan DDD: Entitas dan Objek Nilai
  2. Agregat, Repositori, dan Factory
  3. Peristiwa Domain dan Layanan Domain
  4. Konteks Terbatas dan Pemetaan Konteks
← Kembali ke PHP Academy