Table of Contents
הבנה של אדריכלות שכבתית בפיתוח תוכנה מודרני
(האדריכלות השכבתית היא אחת מהתבניות העיצוביות הארוכות ביותר של תוכנה, הורות יישום לתוך הטיקים האופקיים שבהם לכל שכבה יש אחריות יחידה, מוגדרת היטב, הפרדה זו של חששות הייתה אבן הפינה של תוכנה ארגונית במשך עשרות שנים, החל ממודלים מוקדמים של לקוחות ועד ימינו, נמנעים ממיקרו-שירותי-הענן-הענן-שלימים של בנייתם, באופן דרמטי, של ארכיטקטורציות-הת-ה-ה-החלופה:
מה בדיוק יש אדריכלות?
אדריכלות שכבתית, לעתים קרובות נרדפת עם אדריכלות נטוייה, מחלק יישום לשכבות ערימה.כל שכבה מתקשרת רק עם שכבות צמודות - בדרך כלל השכבה ישירות מתחתיה - באמצעות ממשקים מוגדרים היטב.התבנית הנפוצה ביותר כוללת ארבעה שכבות:
- (FLT:0) Presentation Layer:FLT:1 Handles User Interface and Userאינטראקציה. May be a Web דפדפן, אפליקציה ניידת או נקודת קצה API.
- (ב) ⁇ לוגיקה עסקית (BLL): כפל 1: מכיל כללי דומיין, זרימות עבודה ולוגיקה אימות.
- (FLT:0) Data Access Layer (DAL): FLT:1 שאילתות מסד נתונים, פעולות ORM ודאגות אחסון.
- (FLT:0Database Layer:FLT:1) חנות הנתונים בפועל (relational, NoSQL, file system).
משתנים קיימים – למשל, הוספת שכבת שירות בין BLL ו- DAL או שכבת אינטגרציה עבור ממשקי API חיצוניים.הרעיון המרכזי הוא ששינויים בשכבה אחת (למשל, החלפת הספק מסד הנתונים) לא צריך לקרוע דרך כל בסיס הקוד.בידוד זה הוא מה שהופך אדריכלות כה רבת עוצמה להפחתת הסיכון ועידוד מחדש.
מקורות ואבולוציה
לתבנית יש שורשים במודל של ISO/OSI רשתות (כ- ⁇ ) ועיצוב מונחה מוקדם של האובייקט. בשנות ה-90, אדריכלות תלת-שכבתית הפכה לסטנדרט עבור יישומים של שירות לקוחות-server.היום, ארכיטקטורים עם אדריכלות hexagonal (פורטים ותאים), אדריכלות בצל, וארכיטקטורה נקייה.
יתרונות: מדוע קבוצות בוחרות שכבות
כאשר אנו דנים ב[[1924]] ו[[1924]] ו[[1924]] ו[[1924]], [[1924]] ו[[1924]]]], [[1924]], [[1924]]]], [[1924]]]]]], [[1924]]]]]]
1.התעצמות הקוד באמצעות הפרדה של חששות
על ידי בידוד לוגיקה עסקית בשכבה שלה, כי ההיגיון הופך נכס ניתן לניתוק.לדוגמה, ⁇ :0 ב BLL יכול לשמש על ידי בקר אינטרנט, כלי CLI, ומשרה אצווה ללא שכפול. בדומה, דפוס הגישה של נתונים גישה מחדש של שכבת נתונים יכול לעבור מפוסטאפSQL על ידי שינוי פרויקטים DAL - BLL לא יודע אפילו על תכונות מרובות של פיתוח זה.
2.החזקות והפחתת השפעת השינוי
בפסד קודים צמוד, שינוי ב- UI עשוי לכפות טקס של schema מסד הנתונים ולהיפך.אדריכלות שכבתית שוברת את השרשראות הללו.אם אתה צריך לעדכן את מסגרת ממשק המשתמש (למשל, מתגובה ל- Angular), רק שכבת המצגת משתנה.אם כלל רגולטורי חדש דורש אימות, לשנות רק את BLL זה F:0localization של מנגנון ראשוני משתנה על ידי שינוי ארכיטקטורציה טכנית 1.
סקאביה (Independent Layer Scaling)
לא כל חלקי היישום לחוות את אותו העומס.עם שכבות, אתה יכול לדרג את מאגר שרת האינטרנט באופן עצמאי מבריכת השרת יישומים או מסד נתונים אשכול.אפילו בתוך מונולית, שכבות מאפשרות פיתוח מקביל: קבוצות שונות יכולות לעבוד על המצגת ולוגיקה עסקית עם סכסוכים מינימליים של מיזוג, כל עוד ממשקים נשארים יציבים.
מבחן באמצעות החלמה
כל שכבה יכולה להיות חד-פעמית בבידוד באמצעות לעג או גמגמות עבור התלויות שלה.ה-BLL, למשל, ניתן לבדוק ללא מסד נתונים אמיתי על ידי לעג לממשקים של DAL.זה מוביל לבדיקות מהירות יותר, אמינות יותר ולעודד התפתחות מונחת בדיקה.זה גם עושה את זה קל להפעיל מבחנים על שכבה אחת כדי לתפוס תוקפנות מוקדם.
כיצד אדריכלות שכבתית מפחיתה את החוב הטכני
חוב טכני – העלות המוטעית של עבודות נוספות שנגרמו על ידי בחירת פתרון קל (מוגבל) עכשיו במקום גישה טובה יותר שלוקחת יותר זמן – הוא תוצר לוואי טבעי של פיתוח תוכנה.אדריכלות שכבתית נלחם בחובות טכניים בכמה דרכים קונקרטיות.
Enforcing Clear Boundaries Prevents ספגטי קוד
ללא שכבות, לוגיקה עסקית לעתים קרובות מדממת אל מטפלים באירועי UI, שאילתות SQL מוטבעות בבקרים, ואימות מפוזר בכל מקום.לאורך זמן, הפרות אלה יוצרות בלגן מסובך שבו אף אחד לא יכול לשנות בבטחה כל דבר אחר אדריכלות מעוגלת כמו FLT:0concontractFLT:1: "השכבה הזו עושה x, היא מתקשרת באמצעות y, שום דבר אחר."
עידוד ושילוב עיצוב
כאשר החוב הטכני עולה באופן בלתי נמנע (אולי בשל מועד מהיר), אדריכלות שכבתית מקלה לשלם את החוב הזה בחזרה מאוחר יותר. כי הרכיבים הם זוגו באופן רופף, אתה יכול להוציא יישום תמים משכבה ולהחליף אותו עם אחד חזק ללא כתב מחדש את העולם.לדוגמה, גישה נתונים כתובה להפליא באמצעות דיפר יכול להיות מספק כדי להשתמש ב-ORM או דפוס החלפה, עם השפעה נמוכה יותר, על אפסית של אפס: 1.
קידום תקני קוינג עקביים
גבולות שכבתיים באופן טבעי כופים עקביות.כל קוד הגישה לנתונים חי במקום אחד, כל הכללים העסקיים של מפתח חדש יכולים להבין במהירות היכן לחפש חששות ספציפיים.זה מקטין את הזמן על גבי לוח הזמנים ואת הסיכון של הצגת שגיאות על ידי הצבת קוד בשכבה הלא נכונה. קונצנזוס גם עושה ביקורות קוד יעילות יותר: בודקים יודעים מה לצפות בכל שכבה.
פיתוח טכנולוגיה Swaps
טכנולוגיה מתפתחת במהירות.מסד נתונים שהיה בחירה גדולה לפני שלוש שנים עשוי להיות כעת אחריות.אדריכלות שכבתית מבודדת את שאר היישום משינויים כאלה.You יכול להחליף את DAL ממסגרת אנטי לדאל, או מ-MySQL ל- Cosmos DB, עם הפרעה מינימלית ל- BLL ו- מצגת. יכולת זו להסתגל ללא כתב מחדש היא צמצום ישיר בחובות טכניים ארוכי טווח.
המונחים: Automated Testing Debt
עם בידוד חזק של שכבתיות, בדיקות אוטומטיות יכולות לאמת כי גבולות שכבתיים מכובדים.לדוגמה, באפשרותך לכתוב מבחן אינטגרציה המבטיח את BLL לעולם לא לגשת ישירות למסד הנתונים - זה רק קורא לממשק DAL. בדיקות כאלה לזהות הפרות ארכיטקטוניות מוקדם, למנוע את סוג הסבך שמוביל לחוב טכני.
יישום אדריכלות שכבתית יעילה
ציור מחוויית הייצור, הנה אסטרטגיות ניתנות לפעולה כדי למקסם את היתרונות תוך הימנעות משגיאות נפוצות.
1. Define Clear Responsbilities and Boundaries
(ה) כתוב: "מה כל השכבות עושות, ומה חשוב, מה זה עושה" (לאו)
- נספח: בקשות HTTP, הסדרות ומדינת UI (FLT:0 No Business Rules) או שיחות מסד נתונים.
- שכבת עסקים: Orchestrates Workflows, לאכוף כללים, ומאמת את הקלטים.
- שכבת גישה לנתונים: מפות בין אובייקטים ומחסנים של תחומים:0.10.10.אין לוגיקה עסקית מעבר ל-CRUDUREFLT:1
לכפות כללים אלה בסקירות קוד וכלים של CI. חלק מהצוותים משתמשים במסגרות מבחן אדריכלות (למשל, ארצ'י לאואווה, NetArchTest עבור .NET) כדי לאכיפת שותפים אוטומטית.
השתמש בממשקים וזריקת תלות
שילוב שכבתי עם ממשקים הוא חיוני עבור הזרקת התלות (DI) מכולות חוטים ממשקים אלה בזמן ריצה.לדוגמה, BLL תלוי על FLT:1, לא על בטון (FLT:2 שמדברים אל SQL Server.זה מאפשר לך להחליף יישומים בקלות ולעג לבדיקות.
3.השתמש ב-U Obency Inversion Principle
האדריכלות השכבה הקלאסית מאפשרת לעתים קרובות BLL להסתמך על DAL – כלומר BLL הוא יחד עם סוגים ספציפיים של מסד נתונים. כדי לבטל לחלוטין את התלות הזאת: להגדיר ממשקים מחודשיים ב- BLL, וליישם אותם ב-DAL.The BLL כבר לא יודע על השכבה DAL; שניהם תלויים בהפשטות.
4.אימוץ תקני Coding עקביים לאורך שכבות
מוסכמות נפוצות, מבנה הפרויקט, ודפוסי טיפול בשגיאות להפחית את העומס הקוגניטיבי.לדוגמה, להשתמש באותם סוגי חריגים ב- BLL (למשל, FLT:3) ולהמיר אותם בגבולות שכבתיים. להימנע משילוב מודלים של נתונים: BLL צריך להשתמש בגופים דומיין, בעוד DAL עשוי להשתמש במודלים של ישויות מסגרת; השתמש במפות (כמו AutoMapper או ידני) בין היתר כדי למנוע דליפת דליפת שומן.
5.Refactorרגילly - Layer by Layer
לוח זמנים בכל טבילה לשיפורים ארכיטקטוניים.לדוגמה, אם שכבת המצגת הפכה למוצפנת עם ההיגיון, לחלץ את ההיגיון הזה לתוך BLL.אם DAL יש בעיות ביצועים, לספק שאילתות ללא שינוי הממשק.העברה רגילה מונעת חוב מהשגת ולשמור את קוד בסיס צוותים בריאים.
אינטגרטיבי עם מערכות חיצוניות ב- Edge
אינטגרציה חיצונית ( APIs, מערכות מורשת של צד שלישי) צריכה להיות עטוף בשכבת אינטגרציה או באמצעות שכבות נגד שחיתות. שמור את BLL טהור על ידי הפיכת נתונים חיצוניים למודלים התחום שלך בגבול.זה מונע הפיכה חיצונית מדבקת ההיגיון הליבה שלך - מקור עיקרי של חוב טכני.
מלכודות נפוצות וכיצד להימנע מהם
אדריכלות שכבתית אינה כדור כסף. Misapplication יכול להוביל למערך בעיות משלו.
שם הסרטון: Layer Leakage
מפתחים לפעמים עקפים שכבות עבור "קנאות שוק", כלומר, קורא לדיאל ישירות משכבת המצגת.לאורך זמן, קיצורי דרך אלה יוצרים כדור גדול של בוץ.
פיט 2: Overly אבסטר או "Anemic" Layers
כל שכבה צריכה להוסיף ערך. שכבה עסקית אגמית שרק עוברת נתונים דרך DAL היא חסרת טעם.
משחק: Overhead
שכבת יתר יכולה להציג שקיפות, במיוחד אם כל שכבה מבצעת טרנספורמציה של נתונים.FLT:0 Solution:0.10.1 אופטימיזציה בגבולות. השתמש בטעינה עצלה, צ'נג או לדלג על שכבות עבור תרחישים לקריאה בלבד (למשל, השתמש בדפוס CQRS שבו קורא על ידי לעקוף את נתיבי BLL).
נפילה 4: התעלמות מ-Crosing Cross-Cutting
קידוד, אבטחה ואימות לעתים קרובות נוגעים במספר רב של שכבות, אם לא מטופלים בקפידה, חששות אלה יכולים לחדור כל שכבה ולפר את ההפרדה.FLT:0Solution:veFLT:1 השתמש בתכנות מוכוונת היבט (AOP) או צינורות מתווך (למשל, ב-ASP.NET Core או Expressjs) כדי להתמודד עם חששות חוצים ללא קוד מזהמים.
מלכוד 5: לא מעורבים באדריכלות
לפעמים הצוותים מתייחסים לשכבות כאל מחוסנים.כאשר המערכת גדלה, הגבולות המקוריים של שכבת השכבות עשויים להיות מעצירים.FLT:0Solution:FLT:1 מאפשר לשכבות לחלקן או להציג שכבות חדשות (כמו שכבת שירות או שכבת אינטגרציה) כאשר יש צורך.
דוגמה אמיתית לעולם: עקרונות ועקרונות שכבות
(FLT:0)DirectusveFLT:1 , CMS ללא ראש ופלטפורמת נתונים, מדגים עקרונות אדריכלות שכבתיים בעיצוב ההתעלות שלה.היישום הליבה מתחלק ל- API (ייצוג), שירותים (לוגיקה עסקית), וצוותי נתונים (גישה לנתונים) כגון קובצי קובצי קידוד, נקודות קצה, פריסות לפעול בתוך שכבות מוגדרות בבירור, ומאפשרות לשימוש חוזר על פני סיטואציות מינימליות כמו מפתחי תיבות של קבוצות ישירות.
השוואת אדריכלות שכבתית עם תבניות אחרות
זה עוזר להבין איפה אדריכלות שכבתית מתאימה יחסית חלופות מודרניות.
- אדריכלות:0 (Ports and Fiters): FLT 1:1 רעיון דומה אבל עם תלות הפוכה הליבה העסקית מבודד לחלוטין מתשתית.
- (ב) ⁇ :0) אדריכלות טהורה: 1 (FLT:1) גרסה מפורשת יותר של אדריכלות hexagonal עם מעגלים קונצנטריים.
- (ב) ⁇ :0 (השירותי): 1FLT:1 כל שירות פנימי עשוי להשתמש אדריכלות שכבתית.התבנית משלימה מיקרו-שירותים על ידי הבטחת כל שירות הוא בנוי היטב.
- אדריכלות:0 (אפילוט-Driven Architecture:FLT:1 לעתים קרובות) שכבות חוצה-חיתוך, אבל מטפלים באירוע יכולים להיות מאורגנים בשכבות.
עבור רוב היישומים העסקיים המסורתיים (ERP, CRM, מסחר אלקטרוני אחורי), אדריכלות שכבתית נותרה הבחירה הפרגמטית ביותר בגלל הפשטות, היכרות נרחבת ותמיכה פשוטה כלי.
הפרקטיקה הטובה ביותר לניהול החוב הטכני עם שכבה
מעבר ליישום, הנה תהליכים המסייעים לשמור על חובות נמוכים.
- (FLT:0)Automated Architecture אימותation: FIRLT:1) להשתמש בכלים כמו ArchUnit, NetArchTest, או מנתחים מותאמים אישית כדי להבטיח כי התלויות שכבתיות מכובדות.
- (FLT:0) ביקורות קוד התמקדו ב- Layer Boundaries:BuildFLT:1 בבקשות למשוך, במיוחד לבדוק אם ההיגיון ממוקם בשכבה הנכונה. עודד סוקרים להפרות חוצה-שכבות הדגל.
- (ב) ⁇ :0) , ⁇ "רישום של דברים": 1:1 כאשר אתה צריך לקחת קיצורי דרך, לתעד אותם במסד חוב הקשור לקוד. השתמש בבידוד של אדריכלות שכבתית כדי לאשר את התשלום מאוחר יותר.
- (ב) "הישמרו" (בראשית כ"ד): "כל שכבה צריכה להכיל רק את מה שנדרש." ~ שכבת נפיחות היא סימן של התפיסות המוזנחות או אחריות שלא הייתה נכונה.
- (ב) במבחנים באינטגרציה: FLT:0) לבחון את הגבולות בין שכבות לתפוס תוקפנות מוקדם.לדוגמה, להבטיח כי ה-BLL עדיין עובד כאשר DAL משולף לחנות לא-זיכרון.
מסקנה
אדריכלות שכבתית אינה מהווה דחייה של העבר – היא אסטרטגיה מוכחת, מתאימה לבניית תוכנה שעדיין ניתנת לניהול וניתן להחלפה לאורך שנים של שינוי.על ידי אכיפת הפרדה ברורה של חששות, הצוותים יכולים להשתמש בלוגיקה עסקית על פני ממשקים מרובים, חלקים בקנה מידה של המערכת באופן עצמאי, ולהגיב לשיטות פיתוח ללא רישום בסיס קוד, ההשפעה הישירה על החוב הטכני היא משמעותית: שכבת משמעת מספקת הופכת את הטכנולוגיה בטוחה יותר, אך פחות יעילה, תוך כדי תיקון דרישות איטיות, אך ורק כדי כך היא דורשת מגבלות יציבות יותר, כמו מותאמות אישית, מאשר למערכות אבטחה, או מקוד פתוח יותר, מאשר מותאמות אישית, תוך כדי שינוי קבוע, תוך כדי שמירה על בסיס קבוע, מאשר למערכות מתקדמות יותר, תוך כדי שמירה על בסיס קבוע, או מקוד פתוח יותר, מאשר למערכות קבוע, מאשר למערכות מתקדמות יותר, מאשר למערכות אבטחה, מאשר למערכות קבוע, ללא תיקון, מאשר למערכות אבטחה, מאשר מותאמות אישית, ללא תיקון, מאשר מותאמות אישית, ללא תיקון יעיל יותר, ללא תיקון, מאשר למערכות אבטחה, מאשר למערכות אבטחה, ללא תיקון עצמיות, ללא תיקון עצמיות, מאשר למערכות אבטחה, מאשר למערכות אבטחה, ללא תיקון עצמיות, ללא תיקון עצמיות, ללא תיקון יעיל יותר, ללא תיקון
[01:0] כתביו של מרטין פוולר על תבניות אדריכלות: 1 לתובנות עמוקות יותר, ולבחון את ה-FLT:2Directus Architecture Documents FLT 3: כדי לראות את העקרונות הללו החלים בפרויקט קוד פתוח פופולרי.