Apa, mengacu pada DDD, konteks terbatas?

40

Ketika mengerjakan buku "Implementing Domain Driven Design" oleh Vaughn Vernon, saya tidak dapat memahami dengan baik apa sebenarnya konteks yang dibatasi itu.

Buku ini mendefinisikan konteks terikat sebagai "batas konseptual di mana model domain berlaku. Ini menyediakan Bahasa yang Dapat Ditebak yang diucapkan oleh tim dan dinyatakan dalam model perangkat lunak yang dirancang dengan cermat" (bagian prefacing "Panduan untuk Buku ini"). Definisi ini akan membuatnya terdengar seolah-olah konteks yang dibatasi adalah model dan bahasa subdomain, di mana subdomain itu mungkin menjadi domain inti (yang sepertinya harus disebut sebagai "subdomain inti", tetapi itu adalah diskusi lain ...). Ini masih menyisakan beberapa ambiguitas tentang apa yang disediakan oleh konteks terbatas. Apakah ini pengelompokan satu atau lebih subdomain? Jika hanya satu subdomain yang sesuai dengan konteks terikat, apa yang sebenarnya dikatakan konteks terbatas itu kepada kita?

Bab 3 dari buku yang sama, bagaimanapun, mengacu pada teknik integrasi antara konteks yang dibatasi. Ini, bagaimanapun, tampaknya menyiratkan bahwa konteks terikat sebenarnya adalah sistem perangkat lunak atau artefak dari beberapa variasi.

Martin Fowler secara singkat membahas gagasan tentang konteks terbatas ( http://martinfowler.com/bliki/BoundedContext.html ), tetapi tidak benar-benar menjelaskan masalah ini.

Pada akhir hari, apa yang konteks dibatasi? Apakah ini pengelompokan subdomain? Model dan bahasa untuk subdomain? Implementasi subdomain? Tanpa jawaban-jawaban ini, tampaknya agak sulit untuk memahami bagaimana menguraikan ruang masalah kehidupan nyata ke dalam konteks yang terbatas.

Michael
sumber
2
Posting itu tidak benar-benar membuat definisi menjadi jelas, setidaknya untuk saya. Ini membahas ide konteks terikat karena mereka mungkin berlaku secara organisasi, tetapi tidak pernah benar-benar menjembatani ini kembali ke pengembangan perangkat lunak.
Michael
1
BAIK. Yah, meskipun saya bukan ahli DDD, saya menemukan deskripsi ini dari Microsoft berguna (dalam paragraf Pendahuluan): msdn.microsoft.com/en-us/library/jj591572.aspx . Dikatakan: ...
Robert Harvey
1
Konteks terikat adalah komponen otonom, dengan model domain mereka sendiri dan bahasa mereka sendiri di mana-mana. Mereka seharusnya tidak memiliki ketergantungan satu sama lain pada saat menjalankan dan harus mampu berjalan secara terpisah. Namun mereka adalah bagian dari sistem keseluruhan yang sama dan perlu bertukar data satu sama lain ...
Robert Harvey
1
... Jika Anda menerapkan pola CQRS dalam konteks terbatas, Anda harus menggunakan acara untuk jenis komunikasi ini: Konteks terikat Anda dapat menanggapi peristiwa yang dimunculkan di luar konteks terikat, dan konteks terikat Anda dapat menerbitkan acara yang lain konteks terbatas dapat berlangganan. Acara, memungkinkan Anda untuk mempertahankan hubungan longgar antara konteks Anda yang dibatasi.
Robert Harvey

Jawaban:

38

Konteks dan Subdomain Terikat ada di tingkat yang berbeda.

Sebuah Subdomain adalah bagian dari ruang masalah, itu adalah partisi alami dari sistem, sering mencerminkan struktur organisasi. Jadi logistik dan operasi dapat dipisahkan dari penagihan & penagihan . Eric membedakan subdomain inti , pendukung , dan generik sesuai dengan relevansi bisnis mereka dalam skenario yang diberikan.

Konteks adalah bagian dari ruang solusi. Mereka adalah model . Ini akan menjadi hal yang baik untuk memilikinya, mencerminkan partisi domain-subdomain ... tetapi hidup tidak selalu mudah. Dan Anda mungkin telah menggembungkan domain lawas yang mencakup semuanya, atau lebih banyak konteks di subdomain yang sama (yaitu aplikasi lawas yang dibangun oleh aplikasi pengganti yang dibuat seseorang).

Untuk memiliki Bounded Context, Anda perlu memiliki model, dan batas eksplisit di sekitarnya. Persis apa yang hilang di banyak aplikasi berbasis data yang menggunakan basis data untuk berbagi data.

Cara lain - ortogonal - untuk melihatnya mungkin sebagai berikut. Bahasa Ubiquitous , kondisi khusus di mana setiap istilah memiliki definisi tunggal yang jelas, tidak berskala. Semakin besar Anda memperbesarnya, semakin banyak ambiguitas yang merayap. Jika Anda ingin mencapai model yang tepat dan tidak ambigu, Anda perlu membuat batasannya secara eksplisit, dan berbicara banyak Bahasa yang Tidak Berarti, masing-masing dalam satu Konteks Terbatas, dengan tujuan yang terdefinisi dengan baik .

ZioBrando
sumber
1
Jadi, di dunia yang ideal, akan ada hubungan 1-ke-1 antara subdomain dan konteks terbatas? (Memahami, jelas, bahwa apa yang ideal dan apa yang benar berbeda).
Michael
2
Belum tentu: kuncinya adalah bahwa BC tumpang tindih banyak subdomain adalah bau. Yah ... itu tidak dibatasi. Dalam istilah DDD, sebuah model harus benar-benar sesuai dengan tujuannya, dan subdomain yang berbeda memiliki tujuan yang berbeda (dan bahkan mungkin bos yang berbeda dengan tujuan yang berbeda). Tetapi dalam subdomain yang sama, BC yang berbeda mungkin ada karena alasan yang berbeda. Aplikasi web dan seluler mungkin merupakan kasusnya, atau model yang berbeda untuk perencanaan atau pelaksanaan .
ZioBrando
Tetapi kuncinya adalah untuk memahami bahwa ada dua keluarga masalah: 1) membaca konteks yang ada (di mana Anda hanya dapat menerima dan mengelompokkan model dan kolaborasi yang ada), 2) merancang perangkat lunak yang tepat mengingat kendala yang ada, sehingga memaksakan batas konteks antara model berorientasi kecil tujuan. Dalam skenario kedua Anda tidak akan secara sengaja tumpang tindih dengan batas subdomain. ... secara umum, mencari perangkat lunak yang sempurna dalam organisasi yang tidak sempurna mungkin merupakan hal yang sulit. Tapi memecahkan mereka inkonsistensi mungkin layak usaha.
ZioBrando
8

Teknik Desain Domain Driven digunakan untuk membantu kami membuat model dunia yang kita tinggali. Model-model ini ada sebagai gagasan di benak orang-orang yang terlibat dalam suatu proyek.

Karena telepati masih dalam masa pertumbuhan, ide-ide ini dikomunikasikan antara orang-orang yang menggunakan kata dan frasa.

Kata-kata dan frasa bisa ambigu pada saat terbaik. Untuk membantu kami mengurangi ambiguitas, kami menggunakan 'konteks' untuk memperjelas artinya.

Ketika orang-orang tenggelam dalam proyek perangkat lunak yang berlangsung selama bertahun-tahun, mereka tampaknya melupakan konteks dari mana muncul ide-ide yang berubah menjadi kata-kata yang berubah menjadi nama variabel yang dimasukkan ke dalam kode.

Pemula tiba di proyek dan mulai menggunakan dan menggunakan bahasanya. Mungkin mereka adalah pengguna, mungkin mereka adalah pengembang. Jika tidak ada konteks yang diberikan kepada mereka, mereka akan muncul dengan konteks mereka sendiri (dan, karenanya, makna) dari pengalaman hidup mereka sendiri.

Konteks yang baru diterapkan ini akan memandu bagaimana pengembang baru melakukan refactor atau mengembangkan kode. Jika mereka menerapkan konteks yang salah, mereka akan refactor dan mengembangkan kode dalam, mungkin arah yang salah. Arah yang salah, meskipun sedikit, dapat menyebabkan masalah yang jauh lebih besar di telepon.

Seperti yang saya lihat, 'konteks terikat' hanyalah 'konteks yang diklarifikasi' yang diberikan kepada proyek pemula sehingga mereka tidak menerapkan konteks sewenang-wenang mereka sendiri untuk mencemari model kami, yang diasah dengan indah.

Ini adalah pengakuan eksplisit, oleh tim, bahwa this phrase, dalam this part of the projectarti sebenarnya this thing(dan tidak, seperti yang mungkin Anda pikirkan, that thing).

Sama seperti itu adalah ide yang baik untuk menandai batas-batas antara taman Anda dan taman tetangga Anda. Anda menentukan batas secara eksplisit sehingga Anda tidak marah ketika mereka mulai menggali hamparan bunga di halaman rumput Anda yang terawat sempurna.

Hanya itu saja. Ini adalah ide yang sangat sederhana yang sangat penting sehingga banyak yang telah ditulis tentangnya.

Jadi iya. Konteks dibatasi secara harfiah batas, 'pagar', yang membedakan antara konteks satu subdomain dari konteks subdomain lain dalam suatu proyek.

Model dan bahasa subdomain diisolasi dari model dan bahasa lain untuk menghindari ambiguitas makna.

Tapi ya. Dunia tidak sesederhana itu.

Anda dan tim harus teliti dalam mematuhi konteks yang ditentukan. Sangat mudah untuk menjadi malas dan membayangkan kembali konteks untuk mengambil jalan pintas selama pembangunan perangkat lunak.

Juga, hal-hal berinteraksi dengan hal-hal lain dan konteks terbatas juga perlu berinteraksi satu sama lain. Jadi, ada berbagai pola untuk menggambarkan bagaimana interaksi itu terjadi. Lihat buku Eric Evan, Domain Driven Design Bab 14 untuk berbagai pola ini: Kernel Bersama, Pemasok Pelanggan, Konformis, Lapisan Anti Korupsi, Cara Terpisah, Layanan Host Terbuka, Bahasa yang Diterbitkan.

JW01
sumber
1
Jadi pada dasarnya pagar di sekitar subdomain.
Robert Harvey
1
Iya nih. Sejauh yang saya bisa melihatnya. Itu adalah pagar.
JW01
0

Pada dasarnya, konteks Bounded mendefinisikan beberapa batas nyata penerapan beberapa sub-domain. Ini adalah beberapa area abstrak di mana sub-domain tertentu masuk akal, sementara yang lain tidak. Jadi ini bisa menjadi pembicaraan, presentasi, proyek kode dengan batas fisik yang ditentukan oleh artefak.

Dalam situasi yang berbeda saya menggunakan tiga perspektif yang berbeda, atau metafora konsep Konteks Terikat.

Dari perspektif run-time, ini mewakili batas-batas logis, ditentukan oleh kontrak layanan di mana model diimplementasikan. Kontrak dapat direpresentasikan sebagai API layanan ini atau serangkaian acara yang diterbitkan dan dikonsumsi. Jadi dari perspektif ini, konteks terikat tidak ada hubungannya dengan batas fisik.

Dari perspektif pakar domain, konteks terbatas adalah area di mana proses bisnis tertentu diterapkan, bahasa di mana-mana tertentu diterapkan, dan istilah tertentu masuk akal, sedangkan yang lain tidak. Jadi itu hanyalah sebuah persegi panjang yang digambar di atas selembar kertas atau papan tulis.

Untuk pengembang perangkat lunak, yaitu, dari perspektif kode statis, konteks terikat mewakili cara saya merancang model saya di sekitar sub-domain yang sesuai. Berapa banyak basis kode yang diimplementasikan dengan sub-domain tertentu? Apa konsep mereka terdiri? Konsep mana yang berlaku di masing-masing konsep? Itulah sebabnya dikatakan bahwa konteks terikat termasuk ruang Solusi.

Aku benar-benar seperti ini contoh konsep Konteks Bounded.

Pertanyaan penting lainnya (jika bukan yang paling penting) adalah bagaimana mengidentifikasi konteks terikat . Jika Anda melakukan itu secara tidak benar, Anda akan berakhir dengan layanan yang cerewet, tidak dapat dipelihara dan digabungkan dengan ketat , juga dikenal sebagai monolith terdistribusi .

Zapadlo
sumber