Domain-based dizayn çətin olmamalıdır. Budur necə başlamaq

Andrew Hamel-Law tərəfindən

Bir çox komandanın domen idarəedici dizaynı (DDD) mənimsədiyini gördüm və çox şeyin səhv getdiyini gördüm. Tez-tez problemlər çox erkən mərhələlərdə başlayır.

Bu blog yazı DDD əsaslarını araşdırır və izləmək üçün bir yol verir. DDD haqqında düşünməyə dəyər olan şeyləri, habelə təhlükəsiz olaraq göz ardı edə biləcəyiniz şeyləri qeyd edəcəkdir. Bəzi praktiki məsləhətlər və öyrənmə səyahətinizdəki mühüm məqamlar barədə bir neçə təklif var. Həm də "proqramın mərkəzində mürəkkəbliyi həll etmək" üçün bir neçə sübut edilmiş yollardan biri olan DDD sənətkarlığına doğru irəlilədiyiniz zaman qurmaq üçün bir çərçivə əldə edəcəksiniz.

"Domen idarəedici dizayn" nədir?

'Domen idarəedici dizayn' dedikdə Eric Evansın 2003-cü ildə yazdığı «Domain-based Dizayn: Proqramın Ürəyində Mürəkkəblik» kitabında təqdim etdiyi dizayn prosesindən bəhs edirəm. O, DDD-ni "həyata keçirilməsini əsas iş konsepsiyalarının inkişaf edən bir modelinə dərindən bağlayaraq kompleks ehtiyaclar üçün proqram təminatını inkişaf etdirməyə bir yanaşma" olaraq təyin etdi. Bu kitab inanılmaz dərəcədə oxunaqlı olsa da (inkişaf etdiricilər üçün ən yaxşı üç kitabımdan biri) da kənarlaşdırıla bilər: 560 səhifəlik, bu, ağırdır.

Evansın kitabı DDD-də yeganə kitab deyil. Vaughn Vernon tərəfindən "Domain-based Dizayn Layihəsi" ən məşhurdur - lakin daha da uzun. Scott Millet və Sam Knight tərəfindən Vaughn'ın "Domain-based Dizayn Distilled" və ya bəlkə də mənim şəxsi sevdiyim "Domain-based Dizayn Anatomiyası" nı sınaya bilərsiniz.

Bütün bunlara baxmayaraq, insanlar hələ də məlumatın şəffaf həcmi və bəlkə də necə başlamağın variantları sayından imtina edirlər.

Bu məni kədərləndirir, çünki DDD məni layihələrdə ağlı başında saxlayan, kod bazalarını səliqəli saxlayan və iş probleminə yaxın olan şeydir və ən əsası komandaların təşkili və çatdırılmasına kömək edir.

Mərhələ 1: İş problemindən başlayın

Beləliklə, necə başlayırsınız? DDD haqqında unut.

Tamamilə.

Domen idarəedici dizayn haqqında eşitdiyiniz günləri xatırlayın və yalnız proqram domeninizi qutular və xətlərdən istifadə edərək modelləşdirmək istərdinizmi?

Bunu et. Əylənin.

Sadəcə cəhd edin və proqram təminatı ilə hansı problemi həll etdiyinizi anlayın. 'Sərhədli kontekstləri', 'yerli dilləri' və bütün bunları unut - hətta 'domain' sözünü unut.

Davam et. Gedin ... burada sizi gözləyəcəm.

İndi çalışaq iş problemimizi başa düşək.

Bunu edərkən kod yazmaq üçün istifadə edəcəyiniz eyni anlayışlardan istifadə edərək düşünmək xoşdur, yəni kodu Obyekt yönümlü bir dildə yazmağı düşünürsünüzsə, OO şəkildə də. İdeal olaraq, bir ağ lövhəyə sahib olacaqsınız, ancaq draw.io kimi onlayn vasitələr də əladır. Narahat olmayın, bir UML ustası olmağınız lazım deyil. Lazım gələrsə, bunun asan yolları üçün Simon Brownun əşyalarına nəzər yetirin. Martin Fowler'in köhnə, lakin hələ də əla "UML Distillə" edilmiş olması da çox lazımlıdır.

Mərhələ 2: Yalnız çəkməyin, kodlaşdırma da modelləşdirir

Bunu edərkən, koda davam etməyi unutmayın - ağ lövhədə bir eskiz ilə müvafiq kodu super bağlayın. Unutmayın - kodu yazan insanlar eskiz diaqramları çəkməlidirlər, eskiz diaqramları çəkənlər kod yazmalıdırlar. Niyə? Kodunuz daha qəlizlə tərtib etdiyiniz modellərin versiyasını daha da məhdudlaşdıran, tərtibedən yoxlanılmış olduğundan və kodunuzu yazarkən hələ çox dizayn qərarları qəbul edirsiniz.

Gedərkən, özünüzü model y olan şeyləri saxlamaq üçün kod bazanızdakı ayrı bir yerə müalicə edin. Mən "model" adlı bir paket hazırlamağı xoşlayıram, digərləri isə "domain" adlandırırlar. Hər ikisi yaxşıdır. Özünüzü və həmkarlarınızı xoşbəxt edin. Hər şeyi səliqəli görmək istəyirsinizsə özünüzə bir neçə alt paket əlavə edin.

Xahiş edirik unutmayın: çərçivə və santexnika materiallarından bir az əsəbləşmək - həqiqətən model olmayan əşyalar - bu "model" paketinə sürünməyə başlayır. Narahat olmayın. Model çirkliliyi həmişə olur - işə başladığımda Enterprise JavaBeans bitləri idi və bu günlərdə Bahar Çərçivə məhsulları kimi ehtimal olunur.

Sizdən xahiş edirəm bir az bu model çirkliliyi ilə yaşayın. Bu yaxşıdır. Sadəcə sizi əsəbiləşdirən hissə öyrəşin. Tanımaq yaxşı bir hissdir.

Mərhələ 3: Domen mütəxəssisi həmkarları ilə birlikdə dizayn

Model edərkən, qurulduğunuz sistemin əsl dünya versiyasını həqiqətən başa düşən mütəxəssislərlə sıx əlaqə saxladığınızdan əmin olun. Bəlkə də son istifadəçi olacaqlar. Onları həmtəsisçi kimi qəbul edin. Problemi çox detallı şəkildə bilirlər, amma kodun necə olacağını bilmirlər (bəlkə də). Sən əkssən.

Həqiqətən başınızı çətin bitlərin ətrafına çəkmək və zəhmli həllər yaratmaq üçün onlarla birlikdə bir olun. Proqramda dünyalarını təsvir etmək üçün istifadə etdikləri terminlərdən istifadə edərək mütəxəssisləriniz üçün asan bir şey saxlayın. Yalnız isimlər deyil, fellər də; məsələn, yalnız "BankAccount" deyil, həm də "kredit hesabı" və "bağlayın". Həqiqətən mütəxəssisin sözlərinə diqqətlə qulaq asın. Aydınlıq və ortaq bir anlaşma əldə etmək üçün çox sayda sual verin, lakin heç vaxt sözlərinizi onlara yükləməyin. Vahid testlərini mütəxəssislərin 100% rahat olduğu dildə yazaraq bu ortaq dil və modeli idarə etməyə kömək edin.

Həmkarlarınızı mütəxəssis lens kimi cəlb etməklə, sevimli təmiz modelinizə daxil olan texniki santexnika / çərçivə əşyalarını təyin etməklə daha da irəliləyə bilərsiniz. Çirklənməni müəyyən etdikdən sonra, bütün bunları "model" paketinizdən bunu etmək rahat olduğu müddətdə kod bazanızdakı başqa bir yerə köçürə bilərsiniz.

Kodunuzu bir və ya bir neçə mütəxəssis həmkarına göstərməklə bu təmizlik işində müvəffəq olmağınızdan əmin olun və ya daha yaxşısı, onlarla cütləşdiyiniz zaman edin. Əgər bunlar mənalı olarsa (istifadə etdiyiniz, lakin lüğətin deyil, sintaksis haqqında biraz izahat verərək) doğru yoldasınız.

Ən yaxşı göstərişlər:

  1. Şeyi aydın edin.
  2. Modelinizin və mütəxəssisinizin fikir ayrılığı olduğu bir nöqtəyə gəlsəniz, düzdürlər və model səhvdir. Həmişə. Modelinizi dəyişdirin. Bu, bir irəliləyişdir!

Bundan sonra heç bir problem görməmisinizsə, o zaman təbrik edirəm! Siz domen idarəedici dizayn edirsiniz! Özünüzə bir DDD ləyaqət nişanını verin!

Mərhələ 4: Modeliniz pozulduqda

Son bir az yalan danışdım. Bəzən model və mütəxəssisiniz arasında fikir ayrılığı ola bilər. Modeliniz səhv olduğuna görə ola bilər (ola bilər), ancaq modelinizin bir problemi həll etdiyinə və domeninizin mütəxəssisinin başqa bir problemi izah etməsinə səbəb ola bilər. Modellər yalnız bir problemi həll etməlidir və modelinizin eyni zamanda həll etmək üçün lazım olan bütün problemləri həll edə bilmədiyi nöqtəyə gələ bilərsiniz.

Bu 100% cərimədir. Bu yalnız bir model ilə bunu etmək üçün yəqin ki, heç bir yol yoxdur deməkdir.

Bu nöqtəyə gəlsəniz, tez bir yoxlama aparın: modelinizdəki bütün elementlər mövcud problemi həll etmək üçün lazım olduğuna görə mövcuddurmu? Əgər yoxsa, onları çıxarın. Bütün modellər gerçək dünyanın abstraksiyalarıdır və etdiyi hər şeyi ehtiva etməsinə ehtiyac yoxdur.

İkinci probleminizi həll edərlərsə, "model" paketinizdəki kodu ikiyə bölün. Kodunuzu müvafiq olaraq yenidən bölüşdürün. Bunu mütəxəssislərinizin köməyi ilə edin. Əgər niyə parçalanmağınızı bilmirlərsə, küçələrdə gəzmək üçün London metrosundan necə istifadə etmədiyinizi onlara izah edin. Bunun üçün başqa bir xəritədən istifadə edirsiniz. Bir boru xəritəsi çox xüsusi bir problemi həll etmək üçün çox xüsusi bir xəritədir. Bir "London problemi ilə əlaqədar gəzinti" məsələsini həll etməyim lazım ola bilər, amma bunu fərqli bir şəkildə edirəm. Eyni şey burada tətbiq olunur.

Üst məsləhət: Bunun üçün lövhəyə geri dönmək istəyəcəksiniz.

"Ancaq" sizin ağladığınızı eşidirəm, "orijinal modelimin bəzi parçaları indi iki yerə lazımdır!" (Grrr! Narahat ol!)

Bu tamamilə yaxşıdır. Sadəcə davam edin və ehtiyacınız olan bitləri kopyalayın. Hər iki modelinizi arıq, orta və problem həllinə yönəldin. Quru olmamağınızdan narahatsınız? Mathias Verraes tərəfindən "Quru məlumat haqqında" oxuyun və sonra bir inkişaf etdiriciniz kimi səviyyəyə qalxdığınız üçün təbrik edin. Ayrıca Dave Thomas və Andy Hunt'un Changelog podcastını (Episode 352) də nəzərdən keçirin.

Üst məsləhət: Yalnız lazım olan bitləri (yəni sahələr / atributlar və metodlar / funksiyalar) kopyaladığınızdan əmin olun.

OK, indi hər birində bir problemi həll edən iki model var, kodun hara getdiyini necə bilirsiniz?

Cavab yenə "ekspertlərinizlə danışın". Sənə izah edəndə çox güman ki, iki iş barədə düşünürdülər.

Üst göstəriş: İş günlərinin müxtəlif vaxtlarında geyə biləcəkləri vəzifə adları və “şapka” lar barədə düşünmələrini təmin edin.

Modelinizin bu xətlər boyunca yarandığından əmin olun. İrəli sürdüyünü izah etdikdə onlardan "bunu edərkən hansı papağınız var?" Deyə soruşun. Bunu çox sürətlə incələyəcəklər və tezliklə yenidən uçacaqsınız.

Tebrik edirik! İndi ilk iki modelinizi kəşf etdiniz. Bundan əlavə, əlaqəli kontekstlərə də ehtiyac duydunuz. Özünüzü başqa bir DDD mükafatına layiq olan nişanla mükafatlandırın!

İndi bir DDD kitabına dalış etməyə və solo-DDD səyahətinizə başlamağa hazırsınız. Eric'in Mavi Kitabının özünə birbaşa gedə biləcəyinizi düşünmək istəyirəm. Əgər bu hələ də zəhmli görünsə, Əl modeller, Göy dillər, Repozitoriya və Bağlı məzmunlardakı hissələrə nəzər yetirin. Bu işi nə qədər tez mənimsədiyinizə təəccüblənəcəksiniz.

Əvvəlcə 26 fevral 2020-ci ildə https://www.didtworks.com saytında yayımlanıb.