Məhsul
Archito YeniMerge request-lərdən öyrənir, ilişəni göstərir Inteqrasiyalar 25
Həllər
Rola görə
Niyə AppArch
Resurslar
Müştərilər Qiymətlər Əlaqə
Dil
Bizimlə əlaqə

Arxitektura kitabçası.

AppArch komandasının və müştərilərindən topladığımız memarlıq prinsipləri, qərarlar və antipattern'lər. AppArch'a abunə olmasanız da oxumağa dəyər.

14 fəsil

Arxitektura nədir, nə deyil

"Memarlıq, sonradan dəyişdirilməsi baha olan qərarlar toplusudur." - Ralph Johnson

Memarlıq, "hansı framework'ü istifadə etdik" deyil - bu bir tətbiq detalıdır. Memarlıq, kod bazanızı gəzdiyinizdə hiss olunan formadır: modullar necə ayrılıb, asılılıqlar hansı istiqamətdə axır, hansı koddan hansı koda çağırış edilə bilər.

Yaxşı bir arxitektura, developer-in yeni bir feature əlavə etmək üçün hara yazmalı olduğunu qeyri-müəyyənlik olmadan söyləyir. Pis arxitektura bu sualı hər dəfə müzakirəyə çevirir.

? Memarlıq, yoxsa kod keyfiyyəti? Praktik test: qərarı geri qaytarmaq nə qədər bahadır? Saatlar → kod keyfiyyəti. Həftələr → memarlıq.

Memarlıq qərarlarının qiyməti

Bir arxitektura qərarının əsl dəyəri, qəbul edildiyi anda deyil, ona əsaslanan qərarların sayı artdıqca üzə çıxır. Üç ölçü:

  • Geri çevirmə müddəti - qərarı geri almaq üçün neçə həftə?
  • Yayılma səthi - qərara əsaslanan neçə fayl / modul var?
  • Koqnitiv yük - yeni bir tərtibatçı qərarı anlamaq üçün neçə saat istəyir?

Bir qayda qoymazdan əvvəl soruşun: bu qərarın üç ay sonra yanlış olduğunu görsəm, geri qaytarmaq nə qədər ağrılı olacaq?

Niyyət və icra

Memarlıq, almağı düşündüyünüz qərarların cəmidir; kod bazası isə gerçəkdə inşa ediləndir. İkisi arasındakı fərq memarlıq sürüşməsidir - və bir saat çəkməli olan bir dəyişiklik bir həftə çəkənə qədər səssizcə böyüyür.

Məsələ mükəmməl diaqramı bir dəfə çəkmək deyil. Niyyət ilə tətbiqi, diaqramın kodun necə davrandığını hələ də proqnozlaşdıra biləcəyi qədər yaxın saxlamaqdır.

Qatlı (n-qat)

Klassik ayrım: təqdimat → tətbiq → domen → data. Hər qat yalnız altındakını çağıra bilər. Öyrətməsi ən asan, pozulması da ən asan modeldir - interfeysdən birbaşa data qatına tək bir çağırış, və qatlaşma bir uydurmadan ibarət qalır.

Komanda kiçik və sahə dayaz olduqda istifadə edin. Zəifliyi, biznes məntiqinin yuxarıya kontrollerlərə, aşağıya verilənlər bazasına sızma meylidir.

Altıbucaqlı · Portlar və Adapterlər

Domen mərkəzdə dayanır və xarici dünyadan heç nə bilmir. Verilənlər bazası, HTTP, mesaj növbəsi kimi xarici olan hər şey domenlə adapterlərin tətbiq etdiyi portlar (interfeyslər) üzərindən danışır.

Qazanc test edilə bilənlik və dəyişdirilə bilənlikdir: testlərdə Postgres'i yaddaşdaxili bir saxta ilə, ya da REST'i gRPC ilə, tək sətir domen kodu dəyişdirmədən əvəz edə bilərsiniz.

Clean Architecture

Altıbucaqlının bir incələşdirilməsi: asılılıqların yalnız içəriyə, domen varlıqlarına doğru baxdığı konsentrik halqalar. Çərçivələr, interfeys və verilənlər bazaları ən xarici halqada yaşayır - nüvə deyil, detal.

Sizə heç bir infrastruktur olmadan kompilyasiya edilən və test edilən bir sahə qazandırır. Bədəli mərasim havasıdır - daha çox interfeys, daha çox uyğunlaşdırma. Uzunömürlü sistemlər üçün dəyər, bir CRUD idarəetmə paneli üçün artıqlıqdır.

DDD - Domenə Əsaslanan Dizayn

DDD framework deyil, dil intizamıdır. "Aggregate", "bounded context", "anti-corruption layer" - bunlar problemi təsvir etmək üçün ortaq söz ehtiyatıdır.

Nə zaman DDD?

  • Domain mürəkkəbdir və texniki mürəkkəbliklə qarışdırılır.
  • Birdən çox komanda eyni domain üzərində işləyir.
  • Biznes tərəfi ilə tərtibatçı tərəfi fərqli dildə danışır.

DDD hər layihə üçün deyil. CRUD-yoğun bir admin paneli üçün artıq görünürsə, yəqin ki, elədir.

Palçıq Yığını

Aydın bir memarlıq yoxdur: hər şey hər şeyə bağlıdır, vəziyyət qlobal olaraq paylaşılır və bir dəyişikliyi anlamağın yeganə yolu onu işə salmaqdır. Əksər sistemlər bura bir qərarla deyil, min son tarixlə gəlir.

Palçıq yığınını yenidən yazmırsınız - onu boğursunuz. Bir tikiş yerini sarıyın, tək bir qabiliyyəti təmiz interfeysin arxasına köçürün, təkrarlayın. AppArch-ın asılılıq xəritəsi tikiş yerlərinin harada olduğunu sizə göstərir.

Antipattern: Tanrı modulu

"Tanrı modulu" layihənin hər tərəfindən çağırılan, içində hər şey olan moduldur. Utils, Common, Shared adları xəbərdarlıq işarəsidir.

# bunu aşkarlayan bir qayda
- id: GOD-001
  max_fan_in: 25
  message: "Module imported by >25 files - split or rename"

Həll: təxminən üç hissəyə bölün. Birinci qrup əsl infrastruktur (logger, config). İkinci qrup domen primitivləri (money, id). Üçüncü qrup - çox güman ki, ayrı bir moduldur.

Dövri asılılıqlar

A modulu B-yə, B də A-ya ehtiyac duyur. Artıq heç biri tək başına anlaşıla, test edilə və ya yerləşdirilə bilmir, və build sırası püşkatmaya çevrilir. Dövrlər, heç kimin toxunmaq istəmədiyi modulun ən etibarlı xəbərçisidir.

Dövrü, paylaşılan anlayışı hər ikisinin asılı olduğu üçüncü bir modula çıxararaq və ya bir istiqaməti bir interfeys ilə tərsinə çevirərək qırın. AppArch dövrləri bir merge request'də görünən kimi işarələyir.

Sızan abstraksiyalar

Bir abstraksiya onu düzgün istifadə etmək üçün necə tətbiq olunduğunu bilməli olduğunuz zaman sızır - SQL istisnaları atan bir repozitori, çağıranları köhnəlmiş məlumatla məşğul olmağa məcbur edən bir keş. Bir detalı gizlətməyə söz verdi, amma gizlətmədi.

Ya sızmanı bağlayın - tətbiq xətalarını sərhəddə çevirin - ya da abstraksiyanı atın. Sızan abstraksiya heç olmamasından pisdir: dolayılığın bədəlini ödəyirsiniz, amma izolyasiyanı əldə etmirsiniz.

Memarlıq icmalı

İnceleme, merge'ləri əngəlləyən bir qapı deyil; bir dəyişikliyin sistemi nəzərdə tutulan formasına yaxınlaşdırıb-yaxınlaşdırmadığına dair bir söhbətdir. Ən yaxşı incelemeler 'bu indi doğrudurmu?' əvəzinə 'bu, gələcəkdə nəyi çətinləşdirir?' deyə soruşur.

Yüngül və davamlı saxlayın. Hər vacib merge sorğusunda edilən qısa baxış, hamının yan keçdiyi üç aylıq arxitektura şurasından yaxşıdır.

Arxitektura Qərar Qeydləri (ADR)

Bir ADR tək bir qərarı əks etdirir: kontekst, nəzərdən keçirilən seçimlər, seçim və nəticələri - bir-iki paraqraf, kodun yanında versiyalanmış. Altı ay sonra əhəmiyyət daşıyan yeganə suala cavab verir: bu niyə belədir?

ADR'ni qərar veriləndə yazın, sonradan yox. Silmək əvəzinə yerinə yenisini qoyun - fikrinizi niyə dəyişdirdiyinizin izi, aktual cavab qədər dəyərlidir.

Böyük yenidən qurma

Tək bir nəhəng birləşdirmə kimi gələn böyük refaktorinq, qiyafəsini dəyişmiş bir yenidən yazmadır - və ilk dəfə pozulan kimi geri qaytarılır. Əsl refaktorinq hər biri ayrılıqda göndərilə bilən, kiçik və davranışı qoruyan addımlar ardıcıllığıdır.

Yeni yolu köhnənin yanına əlavə edin, çağıranları mərhələli şəkildə köçürün, sonra köhnə yolu silin. Testlər təhlükəsizlik kəndiridir; onlar olmadan refaktorinq etmirsiniz, qumar oynayırsınız.

Bülletenimizə qoşulun

Yeni modullar, buraxılış qeydləri və memarlıq haqqında yazılar. İstədiyiniz vaxt bir kliklə ayrıla bilərsiniz.