อะไรที่อ้างอิงถึง DDD บริบทที่ล้อมรอบคืออะไร


40

เมื่อทำงานผ่านหนังสือ "การใช้การออกแบบโดเมนขับเคลื่อน" โดย Vaughn Vernon ฉันไม่สามารถเข้าใจอย่างถ่องแท้ว่าบริบทที่แท้จริงนั้นเป็นอย่างไร

หนังสือกำหนดบริบทที่มีขอบเขตว่า "ขอบเขตความคิดที่สามารถใช้โมเดลโดเมนได้มีภาษา Ubiquitous ที่พูดโดยทีมงาน คำจำกัดความนี้จะทำให้ดูเหมือนกับบริบทที่ล้อมรอบคือรูปแบบและภาษาของโดเมนย่อยซึ่งโดเมนย่อยนั้นอาจเป็นโดเมนหลัก (ซึ่งดูเหมือนว่าควรจะเรียกว่า "โดเมนย่อยหลัก" แต่นั่นคือ การสนทนาอื่น ... ) สิ่งนี้ยังทำให้เกิดความคลุมเครือเกี่ยวกับบริบทที่ จำกัด ไว้ มันคือการจัดกลุ่มของหนึ่งหรือมากกว่าโดเมนย่อย? หากมีโดเมนย่อยเพียงโดเมนเดียวที่สอดคล้องกับบริบทที่ถูกล้อมบริบทบริบทที่บอกเราคืออะไร?

อย่างไรก็ตามบทที่ 3 ของหนังสือเล่มเดียวกันหมายถึงเทคนิคการรวมระหว่างบริบทที่ล้อมรอบ อย่างไรก็ตามสิ่งนี้ดูเหมือนจะบ่งบอกว่าบริบทที่ล้อมรอบนั้นเป็นระบบซอฟต์แวร์หรือสิ่งประดิษฐ์ที่มีความหลากหลาย

มาร์ตินฟาวเลอร์กล่าวถึงแนวคิดบริบทที่ล้อมรอบสั้น ๆ ( http://martinfowler.com/bliki/BoundedContext.html ) แต่ไม่ได้ชี้แจงปัญหาอย่างแท้จริง

ในตอนท้ายของวันที่สิ่งที่เป็นบริบทที่ล้อมรอบ? มันคือการจัดกลุ่มของโดเมนย่อยหรือไม่? รูปแบบและภาษาสำหรับโดเมนย่อยหรือไม่ การใช้งานของโดเมนย่อยหรือไม่? ดูเหมือนจะยากที่จะเข้าใจวิธีแยกย่อยพื้นที่ปัญหาในชีวิตจริงออกเป็นบริบทที่ล้อมรอบ



2
โพสต์นั้นไม่ได้ทำให้คำจำกัดความชัดเจนจริง ๆ สำหรับฉันอย่างน้อย มันกล่าวถึงความคิดของบริบทแวดล้อมเนื่องจากพวกเขาอาจนำไปใช้ในองค์กร แต่มันไม่เคยเชื่อมโยงกลับไปสู่การพัฒนาซอฟต์แวร์
Michael

1
ตกลง. ดีแม้ว่าฉันไม่ได้เป็นผู้เชี่ยวชาญ DDD, ฉันไม่พบคำอธิบายนี้จาก Microsoft ที่มีประโยชน์ (ในบทนำวรรค): msdn.microsoft.com/en-us/library/jj591572.aspx มันบอกว่า: ...
Robert Harvey

1
บริบทที่ถูกผูกไว้เป็นส่วนประกอบของตนเองพร้อมโมเดลโดเมนของตัวเองและภาษาที่แพร่หลาย พวกเขาไม่ควรมีการพึ่งพาซึ่งกันและกันในเวลาทำงานและควรมีความสามารถในการแยก อย่างไรก็ตามพวกเขาเป็นส่วนหนึ่งของระบบโดยรวมที่เหมือนกันและจำเป็นต้องแลกเปลี่ยนข้อมูลกับคนอื่น ...
Robert Harvey

1
... หากคุณกำลังใช้รูปแบบ CQRS ในบริบทที่มีขอบเขตคุณควรใช้เหตุการณ์สำหรับการสื่อสารประเภทนี้: บริบทที่ล้อมรอบของคุณสามารถตอบสนองต่อกิจกรรมที่ยกมานอกบริบทที่มีขอบเขตและบริบทที่ล้อมรอบของคุณสามารถเผยแพร่กิจกรรมที่อื่น ๆ บริบทที่ จำกัด อาจสมัครรับข้อมูล กิจกรรมช่วยให้คุณรักษาข้อต่อหลวมระหว่างบริบทที่มีขอบเขตของคุณ
Robert Harvey

คำตอบ:


38

บริบทและโดเมนย่อยที่ถูกผูกไว้มีระดับที่แตกต่างกัน

Subdomainเป็นส่วนหนึ่งของพื้นที่ที่เป็นปัญหาก็เป็นแบ่งพาร์ทิชันธรรมชาติของระบบมักจะสะท้อนให้เห็นถึงโครงสร้างขององค์กร ดังนั้นโลจิสติกและการดำเนินงานอาจจะมีการแยกออกมาจากใบแจ้งหนี้และการเรียกเก็บเงิน เอริคที่แตกต่างหลัก , การสนับสนุนและทั่วไปย่อยตามความเกี่ยวข้องธุรกิจของพวกเขาในสถานการณ์ที่กำหนด

บริบทเป็นส่วนของพื้นที่การแก้ปัญหา พวกเขากำลังรุ่น มันจะเป็นสิ่งที่ดีที่จะมีพวกเขาสะท้อนให้เห็นถึงการแบ่งโดเมน - โดเมนย่อย ... แต่ชีวิตไม่ได้ง่ายอย่างนั้นเสมอไป และคุณอาจมีโดเมนดั้งเดิมที่ป่องครอบคลุมทุกอย่างหรือบริบทเพิ่มเติมในโดเมนย่อยเดียวกัน (เช่นแอปมรดกเก่าที่มีคนสร้างแอพทดแทนขึ้นมา)

ในการมีบริบทที่ถูกผูกไว้คุณจะต้องมีแบบจำลองและขอบเขตที่ชัดเจนรอบ ๆ สิ่งที่ขาดหายไปในแอปพลิเคชั่นขับเคลื่อนข้อมูลจำนวนมากที่ใช้ฐานข้อมูลเพื่อแชร์ข้อมูล

อื่น - มุมฉาก - วิธีดูมันอาจเป็นดังต่อไปนี้ ภาษาที่ใช้กันแพร่หลายเงื่อนไขพิเศษที่ทุกคำศัพท์มีคำจำกัดความที่ชัดเจนเพียงคำเดียว ยิ่งคุณขยายภาพมากเท่าไหร่ความกำกวมก็จะยิ่งมากขึ้นเท่านั้นหากคุณต้องการให้แบบจำลองที่แม่นยำและชัดเจนคุณจำเป็นต้องทำให้ขอบเขตชัดเจนและพูดภาษา Ubiquitous เล็ก ๆ น้อย ๆ แต่ละภาษาภายในบริบทเดียวที่มีวัตถุประสงค์ที่ชัดเจน .


1
ดังนั้นในโลกอุดมคติอุดมคติจะมีความสัมพันธ์แบบ 1 ต่อ 1 ระหว่างโดเมนย่อยและบริบทที่มีขอบเขตหรือไม่ (เข้าใจชัดเจนว่าอะไรคืออุดมคติและความจริงที่แตกต่าง)
Michael

2
ไม่จำเป็น: สิ่งสำคัญคือ BC ที่ทับซ้อนโดเมนย่อยจำนวนมากมีกลิ่นเหม็น ก็ ... มันไม่ จำกัด ขอบเขต ในแง่ของ DDD แบบจำลองควรสอดคล้องกับจุดประสงค์ของมันอย่างสมบูรณ์และโดเมนย่อยที่แตกต่างกันมีจุดประสงค์ที่แตกต่างกัน แต่ภายในโดเมนย่อยเดียวกันอาจมี BC อื่นด้วยเหตุผลที่ต่างกัน เว็บและแอพมือถืออาจจะมีกรณีหรือรุ่นที่แตกต่างกันสำหรับการวางแผนหรือการดำเนินการ
ZioBrando

แต่สิ่งสำคัญคือต้องเข้าใจว่ามีครอบครัวที่มีปัญหาอยู่สองครอบครัว: 1) อ่านบริบทที่มีอยู่ (ซึ่งคุณสามารถยอมรับและจัดหมวดหมู่โมเดลที่มีอยู่และความร่วมมือ), 2) การออกแบบซอฟต์แวร์ที่ถูกต้องตามข้อ จำกัด ที่มีอยู่ ระหว่างโมเดลขนาดเล็กที่มุ่งเน้นวัตถุประสงค์ ในสถานการณ์ที่สองคุณจะไม่ซ้อนทับขอบเขตโดเมนย่อยโดยเจตนา ... โดยทั่วไปการมองหาซอฟต์แวร์ที่สมบูรณ์แบบในองค์กรที่ไม่สมบูรณ์แบบอาจเป็นเรื่องยาก แต่การแก้ไขความไม่สอดคล้องเหล่านั้นอาจจะคุ้มค่ากับความพยายาม
ZioBrando

8

ใช้เทคนิคการออกแบบโดเมนขับเคลื่อนเพื่อช่วยให้เราสร้างแบบจำลองของโลกที่เราอาศัยอยู่แบบจำลองเหล่านี้มีอยู่เป็นแนวคิดในใจของผู้คนที่เกี่ยวข้องในโครงการ

เนื่องจากกระแสจิตยังอยู่ในช่วงวัยเด็กแนวคิดเหล่านี้จึงสื่อสารกันระหว่างผู้ใช้คำและวลี

คำและวลีสามารถคลุมเครือในช่วงเวลาที่ดีที่สุด เพื่อช่วยเราลดความคลุมเครือเราใช้ 'บริบท' เพื่อชี้แจงความหมายของพวกเขา

เมื่อผู้คนหมกมุ่นอยู่กับโครงการซอฟต์แวร์ที่ยาวนานหลายปีพวกเขาดูเหมือนจะลืมบริบทที่เกิดจากความคิดที่เปลี่ยนเป็นคำที่เปลี่ยนเป็นชื่อตัวแปรที่ถูกอบเข้ามาในรหัส

มือใหม่มาถึงโครงการและเริ่มใช้และใช้ภาษาของมัน บางทีพวกเขาเป็นผู้ใช้บางทีพวกเขาเป็นนักพัฒนา หากไม่มีบริบทให้พวกเขาพวกเขาจะมากับบริบทของตนเอง (และดังนั้นความหมาย) จากประสบการณ์ชีวิตของพวกเขาเอง

บริบทที่เพิ่งนำมาใช้ใหม่นี้จะเป็นแนวทางว่านักพัฒนาใหม่ปรับโครงสร้างใหม่หรือพัฒนารหัสอย่างไร หากพวกเขาใช้บริบทที่ไม่ถูกต้องพวกเขาจะสร้างและพัฒนารหัสในทิศทางที่ผิดอาจจะเคยเล็กน้อย ทิศทางที่ไม่ถูกต้อง แต่เล็กน้อยอาจทำให้เกิดปัญหาใหญ่กว่าเส้น

ดังที่ฉันเห็นบริบท 'ที่ถูกล้อมรอบ' เป็นเพียง 'บริบทที่ชัดเจน' ซึ่งถูกส่งมอบให้กับมือใหม่เพื่อให้พวกเขาไม่ได้ใช้บริบทของตนเองเพื่อทำให้นางแบบของเรามัวหมอง

มันเป็นบางอย่างที่รับรู้อย่างชัดเจนโดยทีมที่this phraseในthis part of the projectหมายถึงว่าthis thing(และไม่ได้เป็นคุณได้ดีอาจจะคิดว่าthat thing)

เป็นความคิดที่ดีที่จะทำเครื่องหมายเขตแดนระหว่างสวนของคุณและสวนเพื่อนบ้านของคุณ คุณระบุขอบเขตอย่างชัดเจนเพื่อไม่ให้คุณโกรธเมื่อพวกเขาเริ่มขุดเตียงดอกไม้บนสนามหญ้าที่ตกแต่งอย่างสวยงามของคุณ

อย่างนั้นแหละ. มันเป็นความคิดที่ง่ายมากซึ่งสำคัญมากที่มีการเขียนล็อตเกี่ยวกับมัน

ใช่. บริบทที่ล้อมรอบนั้นแท้จริงแล้วเป็นขอบเขตที่ 'รั้ว' ที่แยกความแตกต่างระหว่างบริบทของโดเมนย่อยหนึ่งจากบริบทของโดเมนย่อยอื่นในโครงการ

รูปแบบและภาษาของโดเมนย่อยนั้นแยกออกจากรูปแบบและภาษาอื่น ๆ เพื่อหลีกเลี่ยงความคลุมเครือในความหมาย

แต่ใช่ โลกนี้ไม่ง่ายนัก

คุณและทีมจะต้องมีความเข้มงวดในการปฏิบัติตามบริบทที่กำหนดไว้ เป็นเรื่องง่ายที่จะขี้เกียจและนึกถึงบริบทที่จะตัดมุมระหว่างการสร้างซอฟต์แวร์

นอกจากนี้สิ่งที่มีปฏิสัมพันธ์กับสิ่งอื่น ๆ และบริบทที่ล้อมรอบจำเป็นต้องมีปฏิสัมพันธ์กับคนอื่นด้วย ดังนั้นจึงมีหลายรูปแบบเพื่ออธิบายว่าการโต้ตอบเหล่านั้นเกิดขึ้นได้อย่างไร ดูการออกแบบการขับเคลื่อนโดเมนหนังสือของ Eric Evan บทที่ 14 สำหรับรูปแบบต่าง ๆ เหล่านี้: เคอร์เนลที่ใช้ร่วมกันผู้ผลิตลูกค้า Conformist เลเยอร์ Anticorruption วิธีแยกบริการ Open Host ภาษาที่เผยแพร่


1
ดังนั้นจึงเป็นรั้วรอบโดเมนย่อยโดยทั่วไป
Robert Harvey

1
ใช่. เท่าที่ฉันเห็น มันเป็นรั้ว
JW01

0

โดยทั่วไปบริบทที่ถูกกำหนดจะกำหนดขอบเขตที่จับต้องได้บางส่วนของความเกี่ยวข้องของโดเมนย่อย มันเป็นพื้นที่นามธรรมที่บางโดเมนย่อยมีเหตุผลในขณะที่คนอื่นไม่ ดังนั้นนี่อาจเป็นการพูดคุยการนำเสนอโครงการรหัสที่มีขอบเขตทางกายภาพที่กำหนดโดยสิ่งประดิษฐ์

ในสถานการณ์ที่แตกต่างกันฉันใช้มุมมองที่แตกต่างกันสามประการหรือคำอุปมาอุปมัยของแนวคิดบริบทที่ถูกผูกไว้

จากเปอร์สเปคทีฟรันไทม์แสดงถึงขอบเขตแบบลอจิคัลที่กำหนดโดยสัญญาของบริการที่ใช้โมเดล สัญญาสามารถแสดงเป็น API ของบริการนี้หรือชุดของกิจกรรมที่เผยแพร่และใช้งาน ดังนั้นจากมุมมองนี้บริบทที่ถูก จำกัด ไม่มีส่วนเกี่ยวข้องกับขอบเขตทางกายภาพ

จากมุมมองของผู้เชี่ยวชาญด้านโดเมนบริบทที่ล้อมรอบเป็นพื้นที่ที่มีการใช้งานกระบวนการทางธุรกิจบางอย่างมีการใช้ภาษาที่แพร่หลายและคำศัพท์บางคำมีความชัดเจนในขณะที่คนอื่นไม่เข้าใจ ดังนั้นมันเป็นเพียงรูปสี่เหลี่ยมผืนผ้าที่ถูกวาดลงบนแผ่นกระดาษหรือไวท์บอร์ด

สำหรับนักพัฒนาซอฟต์แวร์คือจากมุมมองโค้ดคงที่บริบทที่ถูกผูกไว้แสดงถึงวิธีที่ฉันออกแบบโมเดลของฉันรอบโดเมนย่อยที่สอดคล้องกัน มีการใช้โค้ดเบสในโดเมนย่อยที่เฉพาะเจาะจงเท่าไร พวกเขาประกอบด้วยแนวคิดอะไรบ้าง แนวคิดใดบ้างที่ใช้ได้ในแต่ละแนวคิด นั่นเป็นเหตุผลที่มีการกล่าวว่าบริบทที่ล้อมรอบเป็นพื้นที่ของโซลูชัน

ผมชอบเรื่องนี้เป็นตัวอย่างของแนวคิดบริบทขอบเขต

อีกคำถามที่สำคัญ (ถ้าไม่ได้เป็นหนึ่งที่สำคัญมากที่สุด) คือวิธีการระบุขอบเขตบริบท หากคุณต้องการทำอย่างนั้นไม่ถูกต้องคุณจะจบลงด้วยช่างพูด unmaintainable และบริการคู่แน่นยังเป็นที่รู้จักเสากระจาย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.