Table of Contents
אדריכלות נקייה היא יותר מאשר רק מילת מפתח בפיתוח תוכנה מודרני - זוהי גישה מכוונת, מובנה לעיצוב מערכות שעומדות במבחן הזמן.ב הליבה שלה, אדריכלות נקייה מספקת מערך של קווים מנחים לארגון קוד כך שלוגיקה עסקית נשארת עצמאית של השפעות חיצוניות כגון מסגרות, מסדי נתונים, ממשקי משתמש ושירותים צד שלישי. עצמאות זו הופכת את הבסיס לקל יותר לשמור, להסתגל, להסתגל, כמו להתפתח דרישות יסוד, כך שאתה לומדת על מבנה חיוני, מדוע הוא פועל על ידי עיצוב, כלומר, עקרונות חיוני, כך הוא פועל, עיצוב, עיצוב, עיצוב, ומערכת חשיבה יעילה, כך הוא מבנה חיוני, ומערכת חשיבה יעילה, היא, עיצובית, היא יעילה, כיצד הוא פועל, כך, כך שבסיסו של המבנה הבסיסית, היא מבנה חשיבה יעילה, ומערכת חשיבה יעילה, כך, כך שבסיסית, היא יעילה, היא יעילה, היא מבנה חשיבה יעילה, ולכן היא יעילה, היא יעילה, ומערכת פיתוח.
מהי אדריכלות נקייה?
אדריכלות נקייה הייתה פופולרית על ידי רוברט C. Martin (המכונה לעיתים קרובות דוד בוב) בספרו "FLT:0" אדריכלות נקייה: מדריך של איש מקצוען למבנה התוכנה והעיצובFLT:1" ובסדרה של פוסטים.הפילוסופיה הליבה היא להפריד חששות על ידי הגדרת שכבות אקסצנטריות של אחריות, עם השכבה הפנימית המכילה את ההיגיון העסקי הטהור ביותר ואת השכבות ביותר לטיפול בשכבות החיצוניות ביותר כמו סוכנויות אינטרנט, רכיבים של UI.
גישה זו אינה חדשה באופן קיצוני – היא שואבת רבות מן הדפוסים הקודמים כגון אדריכלות hexagonal (Alistair Cockburn), אדריכלות בצל (Jeffrey פלרמו), ועיצוב מונחה על ידי התחום (Eric Evans) מה אדריכלות נקייה מביא לשולחן הוא קבוצה ברורה, חוזרת של כללים שכל קבוצה יכולה לאמץ, ללא קשר לשפה או למסגרת.
על ידי אכיפת חוק זה, מפתחים להבטיח כי שינויים מסגרות, מסדי נתונים, או טכנולוגיות UI לא לקרוע פנימה כדי להשחית את ההיגיון העסקי הליבה.המערכת הופכת להיות גמישה ביסודה לקיום טכנולוגי.
עקרונות מפתח של אדריכלות נקייה
העקרונות נועדו להנחות את קבלת ההחלטות לאורך כל מחזור החיים של פרויקט, בואו נבחן כל עיקרון בעומק.
1. עצמאות של מסגרות
מסגרת היא כלי, לא הבסיס של המערכת שלך.באדריכלות נקייה, ההיגיון העסקי שלך לא צריך להיות מקושט למסגרת מסוימת.לדוגמה, אם אתה בונה יישום אינטרנט עם מסגרת כמו React, Angular, או Vue, לוגיקה הליבה לא צריך לייבא רכיבים תגובה או התייחסות שירותי Angular. במקום זאת, המסגרת צריכה להיות מטופלת כמו דאגה חיצונית כי תקע לתוך ממשקים מוגדר היטב, אפילו להחליף קוד זה, או להחליף את זה.
2. Testability
כאשר כללים עסקיים מבודדים מתלויים חיצוניים, הם הופכים להיות גמישים למדי.אתה יכול לכתוב בדיקות יחידה עבור ישויות ולהשתמש במקרים ללא לסובב מסד נתונים, ללעג לשרת HTTP, או לטעון UI. מהירות זו ואמינות של בדיקות מעודד מפתחים לבחון לעתים קרובות יותר, מוקדם יותר, לתפוס באגים לפני שהם עולים.
3.הפרדה של דאגות
אדריכלות נקייה מחלק מערכת לשכבות, כל אחת מהן בעלת אחריות ייחודית (השכבה הפנימית ביותר) (FLT:0EntitiesFLT:1) מכילה כללים עסקיים ארגוניים (השכבה הבאה בחוץ (ראה:2Use CasesssuaFLT 3: 3) מטפלות בפרטי עבודה ספציפיים של יישומים (F:4) באופן קבוע, כולל עיבוד נתונים של שימוש ב-JF) ו-iFST (לדוגמה, לדוגמה, כדי למנוע שימוש בתבנית חיצונית של שימוש ב-iF)
חוק התלות
כלל זה הוא דבק שמחזיק את האדריכלות יחד.זה קובע כי תלויות קוד המקור צריכות תמיד להצביע פנימה: משכבות חיצוניות כלפי שכבות פנימיות.אין שכבה פנימית צריכה לדעת על שכבה חיצונית.בפרקטיקה, זה אומר שהממשקים המוגדרים במקרים ובגופים הנמצאים בבעלות השכבות הפנימיות הללו.
שכבות של אדריכלות נקייה
בעוד מספר השכבות יכול להשתנות בהתאם לפרויקט, תרשים אדריכלות נקייה הקנון מראה ארבע טבעות קונצנטריות.הבנת כל שכבה חיונית ליישום העקרונות בצורה נכונה.
תקנות עסקיות (Enterprise Business Rules)
[ה] ישויות הן החלק היציב ביותר של המערכת.הם מטביעים את הכללים העסקיים המרכזיים החלים על פני הארגון כולו.לדוגמה, במערכת הבנקאית, ישות 1FLT:1 מכילה שיטות כמו FLT:2 ו-FLT:3 אשר לאכוף את השחלות כגון "איזון חייב ללכת מתחת לאפס".
שימוש במקרים (Application Business Rules)
במקרים מסוימים, המערכת מתנהגת מנקודת המבט של שחקן (משתמש אנושי, מערכת אחרת או לוח זמנים) הם מזמרים את זרימת הנתונים לגופים ומכוון את הגופים לבצע את הכללים העסקיים שלהם.לדוגמה, מערכת אחרת (FLT:4 תכנה שיטות על ה-FLT:5 ישויות ולאחר מכן ישרוד את התוצאה באמצעות ממשק רצף.
ממשק Fiters
שכבה זו הופכת נתונים בין התבנית הנוחה ביותר לשימוש במקרים וגופים (מבנים נתונים פשוטים באופן רציונאלי) לבין התבנית הנדרשת על ידי סוכנויות חיצוניות. רכיבים משותפים כאן כוללים:
- (ב) ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
- (ב) ,0) ,PresentersFLT 1 (הופנה מהדף ההרחבה של ה-UI) אשר הופכת את השימוש בפלט למקרה לתבנית המתאימה ל- UI, כגון מודל תצוגה.
- (FLT:0Database GatewaysFLT:1) אשר הטמיע ממשקי החלפה ותרגם בין נתוני ישות לבין SQL או NoSQL פעולות.
- (ב) ,0) לקוחות מתואמים את ה-API (הלקוח) 1 (FLT) אשר מכנים שירותים חיצוניים וממירים תגובות למבנים הנתונים של השכבה הפנימית.
שכבת ההסתגלות היא המקום שבו רוב הקוד "הקרח" חי.זהו גם השכבה נוטה להשתנות לעתים קרובות ביותר כמו טכנולוגיות חיצוניות מתפתחות.
מסגרות ונהגים
הטבעת החיצונית מכילה את כל הטכנולוגיות קונקרטיות שהמערכת משתמשת: שרת האינטרנט (למשל, אקספרס, Django, Spring Boot), מערכת ניהול מסד הנתונים (למשל, PostgreSQL, MongoDB), מסגרת UI (למשל, תגובה, Angular), וכן על שכבה זו צריכה להיות דקה ככל האפשר.
היתרונות של שימוש באדריכלות נקייה
אימוץ אדריכלות נקייה מניב יתרונות קונקרטיים, ארוכי טווח, אשר עולים על המאמץ של בניית קוד בצורה זו.
- (FLT:0) שימוריות: 1FLT כאשר אתה צריך לשנות תכונה, אתה משנה רק את מקרה השימוש הרלוונטי ואת ישויותיו - לא את היישום כולו. כי התלויות מופנות פנימה, שינויים בשכבות החיצוניות (כמו החלפת מסד נתונים) לעתים רחוקות ללוגיקה עסקית.
- (FLT:0) estability:0) , כפי שהוזכר קודם לכן, משמעות ההפיכה הנמוכה היא שאתה יכול לבדוק כללים עסקיים בבידוד מבלי להקים סביבה מלאה.זה מוביל ללשאות משוב מהירות יותר וביטחון גבוה יותר בקוד.
- (FLT:0) lexibility: FLT:1 אתה יכול לדחות החלטות לגבי תשתיות.לדוגמה, אתה יכול להתחיל עם התעקשות פשוטה המבוססת על קבצים ולאחר מכן לעבור למסד נתונים יחסי ללא כתב לוגיקה עסקית, כל עוד ממשק ה-Repository נשאר זהה.
- (FLT:0) calScalability: אדריכלות נקייה של 1 בינואר אינה הופכת אוטומטית את המערכת שלך לסקאלה אופקית, אבל היא תומכת בדרגות צוות.על ידי הפרדה בין השכבות, חברי צוות שונים (או אפילו קבוצות שונות) יכולים לעבוד על ממשק המשתמש, מסד הנתונים והלוגיקה העסקית בו זמנית ללא נקיטת צעדים על מנת לעבור על מנת לעמוד על מנת אחד את השני.
- (FLT:0) על גבי לוח ושיתוף פעולה: מפתחי חדש יכולים להבין את המבנה הכולל במהירות כי האדריכלות עוקבת אחר דפוס ידוע.
לצליל עמוק יותר לתוך המוטיבציה מאחורי דפוס זה, ניתן לקרוא את הדיון המקורי של רוברט C. Martin:0 (Clean Architecture blog postcioFLT:1 או לחקור את הדיון של רוברט C. Martin Fowler על observabilityFLT 3: 3, אשר משלים את הארכיטקטורה נקייה.
יישום אדריכלות נקייה בפרקטיקה
מעבר לאדריכלות נקייה יכול להרגיש מאיימת, במיוחד אם אתה עובד עם בסיס קוד מורשת.הצעדים המעשיים הבאים יעזרו לך להתחיל.
שלב 1: זיהוי ובודד את דומיין הליבה
התחל על ידי בחינת הקוד הקיים שלך כדי לאתר את הכללים העסקיים הטהורים.אלה החלקים שעדיין הגיוניים אם החלפת מסד הנתונים או מחר UI לחלץ אותם לתוך מודול נפרד (למשל, חבילה, תיקיה, או מיקרו-שירות) ללא תלות חיצונית.מודול זה יהיה להפוך את הישויות שלך ולהשתמש במקרים.
שלב 2: Define Interfaces for External Interactions
עבור כל פעולה הדורשת מערכת חיצונית (בסיס נתונים, מערכת קבצים, רשת, UI), להגדיר ממשק מנקודת המבט של הליבה.לדוגמה, ליצור ממשק 6FLT עם שיטות כמו FLT 7 ו-FLT:8 לא לדאוג לגבי יישום עדיין; הממשק שייך ליבת.
שלב 3: בניית הסתגלות אשר מחייבת את הממשקים האלה
עכשיו ליצור כיתות קונקרטיות בשכבות החיצוניות שמילאות את הממשקים.עבור מתאם מסד נתונים, זה יכול להיות מחלקה repository המשתמשת ב- ORM או ב-SQL.עבור מתאם UI, זה יכול להיות בקר ונוכחי שהופכים נתונים לתצוגה באינטרנט.המפתח הוא להבטיח כי הליבה לעולם לא יבוא את אלה מתאימים ישירות.
שלב 4: Wire Everything Together in the Framework Layer
השתמש הזרקת התלות - בין אם באמצעות מיכל, שורש הרכב, או חיפוש ידני - לחבר את המתאם לליבת הסטארט-אפ.זה האחריות של השכבה החיצונית ביותר.לדוגמה, ביישום אינטרנט טיפוסי, נקודת הכניסה העיקרית יוצרת את מתאם מסד הנתונים, מקרה השימוש, ואת הבקר, ואז מתחיל את השרת.
שלב 5: החל מינוף מתמשך
אדריכלות נקייה היא לא מאמץ חד פעמי.כפי שאתה מוסיף תכונות, לבדוק כל הזמן כי קוד חדש אינו מפר את כלל התלות. השתמש בכלים כדי לאכוף גבולות אדריכליים (למשל, ארצ'י עבור Java, או PHPStan עם כללים מותאמים אישית עבור PHP). באופן קבוע תמצית לוגיקה משוכפלה לשימוש במקרים וגופים, ודוחפת קוד ספציפי מסגרת.
מלכודות נפוצות להימנע
- (FLT:0) פרויקטים קטנים בעלי ניסיון: אדריכלות נקייה מוסיף עקיף. עבור יישום CRUD פשוט עם מקרה שימוש אחד ולא שינויים צפויים, ייתכן שהראש לא שווה את זה.
- (FLT:0) קוד המסגרת של קוד הליבה: ההרחבה 1 (הקל להפתיע לייבא את התועלת של מסגרת מתוך נוחות.לדוגמה, באמצעות המחשה של ORM בכיתה ישות.תמיד להפעיל את מודול הליבה שלך כמו ספרייה עמידה הראשונה כדי לאמת אין לו תלות חיצונית.
- (FLT:0) יצירת ממשקים רבים מדי לפני זמן: ההרחבה 1 (You Don't Need a Interface for Every Class.Onlyפשטת מה אתה מצפה לשנות.התחל עם הגבולות החיצוניים העיקריים (בסיס נתונים, UI, מערכת קבצים) ולהגיש מאוחר יותר אם יש צורך.
- (FLT:0) אבחון גבולות טיפול בשגיאות: FLT:1 איך יוצאים מן הכלל נזרקים ונתפסים על פני גבולות שכבתיים דורש תכנון זהיר.שכבות פנימיות צריכות לזרוק חריגים עסקיים שהם בעלי משמעות למפתחת. Outer להתאים את אלה לשגיאות ספציפיות מסגרת (למשל, HTTP 500) ללא הליבה של אי פעם לדעת על פרוטוקול HTTP.
דוגמה אמיתית: מערכת עיבוד פשוטה
שקול יישום מסחר אלקטרוני צריך להציב הזמנה.בגישה ארכיטקטונית נקייה:
- (ב) [ה]ה': [ה], [ה], [ה], [ה], [ה], [ה],] ב[ה], [ה], [ה]], [ה'], [ה'], [ה''ו], [ה'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
- (ב) ,0) ,Use Case:FLT 1: 1 (FLT:12) מקבל בקשה המכילה מזהה לקוחות ורשימת המוצר.זה קורא ממשק FLT:13 כדי לחסוך את ההזמנה ואת ה-FLT:14 כדי לעדכן את המלאי.
- (ב) ויקרא ה' (ב') ב'' (ב') ב''' (ב') ב'[[1924]], [[1924]], [[1924]], [[1924]]]], [[1924]]]]]], [[1924]]]]]]]], [[1924]]]]]]]], [[1924]]]]]]]], [[1924]]]]]]
- (FLT:0) עבודות ונהגים: ההרחבה שורש אוסף שרת אינטרנט, מסמיך את מאגר החיבור מסד הנתונים, וחוטים את כל התלות יחד.
אם תחליטו מאוחר יותר לעבור מפוסטgreSQL ל- MongoDB, אתם צריכים לכתוב חדש (FLT:22) ולעדכן את שורש ההרכב.במקרה השימוש והגופים נשארים בלתי מזוהים.אם אתם רוצים להוסיף ערוץ הודעות חדש כמו SMS, אתם יוצרים מתאם אחר ולהרשם אותו – מבלי לשנות את הליבה.
מתי כדאי לאמץ אדריכלות נקייה?
אדריכלות נקייה היא לא כדור כסף.זה הכי יקר בפרויקטים עם מורכבות בינונית עד גבוהה, תוחלת חיים ארוכה צפויה, או תחום עסקי שהוא מרכזי להצלחה של החברה.
- אתה צופה שינויים תכופים לכללים העסקיים.
- המערכת חייבת להשתלב עם מסדי נתונים מרובים או שירותים חיצוניים שעשויים להשתנות.
- יש לך צוות של מפתחים שצריכים לעבוד במקביל.
- אתה בונה מערכות שמשרתות לקוח מרובות UIs (web, Mobile, שולחני) מאותו קו אחורי.
מצד שני, עבור אבטיפוס קטן, תסריטים חד פעמיים, או פרויקטים עם מחזור חיים קצר מאוד, ארכיטקטורה פשוטה יותר (כמו מבנה MVC שטוח) עשוי להיות פרגמטי יותר.אתה תמיד יכול לספק מחדש לאדריכלות נקייה ככל שהפרויקט גדל.
מסקנה
אדריכלות נקייה היא גישה מוכחת ליצירת בסיסים קודים שעדיין ניתנים לקיום, לבחינה ולהתאמה לאורך שנים של פיתוח.על ידי אכיפת חוק התלות והפרדה של חששות לשכבות נפרדות, מפתחים יכולים לבודד את ההיגיון העסקי הליבה מהצ'ור הבלתי נמנע של טכנולוגיות חיצוניות.ההשקעה העליונה בעיצוב ממשקים וארגון קודים משלמים כאשר אתה צריך להוסיף תכונות, להחליף מסדי נתונים יקרים, או על חברי צוות חדשים, בעוד שברשותך, אינה חייבת להבין את עקרונות הגישה המתאימה, באופן עקבית, ללא שינוי, כל מערכת ההפעלה, אינה תלויה, ולא משנה, אלא אם היא מבוססת על בסיס קבוע, אלא אם היא מבוססת על בסיס קבוע, ולא משנה, היא מבוססת על עקרונות מערכת ההפעלה, החל, החל, היא מבוססת על בסיס קבוע, החל של המערכת, החל של מערכת ההפעלה, ולא משנה, החל, החלת, כל מערכת ההפעלה, כל מערכת ההפעלה, ולא על בסיס קבוע, היא מבוססת על בסיס קבוע, החל מערכי מערכת ההפעלה, ולא משנה, החלת, כל מערכת ההפעלה, ולא משנה, היא מבוססת על בסיס קבוע, היא מבוססת על בסיס קבוע, החל מערכי מערכת ההפעלה, היא מבוססת על עקרונות של המערכת, היא מבוססת על בסיס קבוע, ולא משנה, החלת, היא, היא, היא מבוססת על עקרונות מערכת
לקריאה נוספת על עיצוב דומיין מודלים ואדריכלות נקייה בשפות תכנות ספציפיות, ייתכן שתתייחסו ל- (FLT:0Domain-Driven Design CommunityFLT:1 או ל-FLT:2explicit Architecture article מאת הרברטo Graçaph 3 המקשר בין מספר דפוסים.