Table of Contents
מבוא
עקרון האחריות הבודד (SRP) הוא אחד מחמשת עקרונות SOLID של עיצוב מוכוון אובייקטים, אשר נוסחת לראשונה על ידי רוברט C. מרטין בליבה, SRP קובע כי לכל מחלקה או מודול צריך בדיוק סיבה אחת לשנות. כאשר שיעור לוקח על אחריות מרובות, שינויים המיועדים למטרה אחת יכולים להציג באגים פונקציונליות שאינה קשורה.
למרות הפשטות שלו, SRP הוא לעתים קרובות מופרת בקוד של עולם אמת.הלחץ לתכונות הספינה במהירות, בשילוב עם גבולות לא ברורים של תחומים לא ברורים, מוביל לעתים קרובות ל-FLT:0god ClasssFLT:1 שעושה הכל מגישה לנתונים ללוגיקה מצגת. מאמר זה חוקר את הסימנים של הפרות SRP, אסטרטגיות זיהוי מעשי, והוכחה טכניקות לשיפור של חששות שאתה לומד כיצד לזהות דרכים לנקודות בקרה אוטומטיות ולעמודים, כדי לשמור על שיטות בדיקה אוטומטיות.
הבנת עיקרון האחריות הבודד
מה זה בעצם אחריות?
על פי מרטין, אחריות היא:0 (ב) סיבה לשנות את ה-II אם אתה יכול לתאר כיתה באמצעות יותר מ"ו" אחד - לדוגמה, "המעמד הזה מטפל באימות FLT:2andFLT 3: 3LT 3Diging" - ככל הנראה יש לו אחריות רבה.
SRP אינו עומד להגביל את גודל הכיתה או ביטול שיטות.זה עומד להבטיח שלכל מחלקה יש מיקוד מוגדר היטב.מעמד גדול בעל אחריות יחידה, קוהרנטית (למשל, עסקה עסקית מורכבת) הוא טוב יותר ממעמד קטן כי ג'ונגלים משימות שאינן קשורות.
למה SRP משנה
- (העיקרון:0) , כאשר לכל שיעור יש סיבה אחת לשנות, שינויים מבודדים.שינוי בתיבת הדואר האלקטרוני אינו מסכן את פירוק ההיגיון החשבונית.
- (FLT:0) הסתברות: 1) שיעורים חד-צדדיים קלים יותר לבדוק בבידוד.You יכול ללעג תלותיות מבלי צורך להגדיר ההקשר מורכב שמתאים התנהגויות שאינן קשורות.
- (FLT:0) אחריות: מרכיבים ממוקדים ניתן להשתמש מחדש בחלקים שונים של המערכת או אפילו בפרויקטים אחרים.תבנית כללית של מטרה לא צריכה להיות משותפת למנגנון משלוח ספציפי.
- (FLT:0)Parallel Development: FLT:1 Teams יכול לעבוד על אחריות נפרדת במקביל עם סכסוכים מזעריים של מיזוג כאשר שיעורים בבירור מקובעים.
סימנים נפוצים של SRP
הפרות SRP לעתים קרובות מתבטאות באמצעות ריחות קודים בלתי ניתנים לערעור. הריחות האלה אינם הוכחה מוחלטת, אך הם מציעים בחריפות ששיעור לקח יותר מדי דאגות.
1. כיתות גדולות, מורכבות
שיעור המשתרע על פני מאות או אלפי שורות, מכיל שדות ושיטות רבים, ויש לו מורכבות מחזורית גבוהה הוא מועמד ראשוני להפרה SRP. כאשר אתה פותח קובץ ולראות שילוב של גישה לנתונים, כללים עסקיים, לוגיקה ממשק המשתמש, ולטפל בשגיאות, השיעור הוא כמעט ללא ספק עושה יותר מדבר אחד. לדוגמה, AFLT:0 כי הן שאילתות, אימות סיסמאות, שולח אישורים, הודעות דוא"ל, ו-mail יש כמעט ללא ספק לפחות ארבעה שלבים נפרדים.
2 סיבות שונות לשינוי
שאל את עצמך: "מה יכול לגרום לכיתה זו להשתנות?" אם הרשימה כוללת יותר מאחת הסיבות שאינן קשורות – שקת מסד נתונים חדש, שינוי בפורמט דואר אלקטרוני, מסגרת אחרת של כניסה – אז השיעור מפר את SRP. כל סיבה צריכה להתאים לדאגה נפרדת שיש לחדור בכיתתו.
קוד דו-פעמי בכל השיטות
כאשר אותו היגיון מופיע בשיטות מרובות באותה כיתה, לעתים קרובות הוא מציין כי שיטות אלה שייכות לתחומי אחריות שונים.לדוגמה, אם שתי השיטות "הסתר" ו"ספורט" מכילות קוד אימות זהה, כי אימות הוא אחריות נפרדת שיש להוציאו לתוך מעמד האימות שלו.
4.קשה או בלתי אפשרית
אם כתיבת מבחן יחידה עבור מחלקה דורשת הגדרת תיקון מפורט - לעג מסד נתונים, מערכת קבצים, שרת דואר אלקטרוני, ו- API של צד שלישי - השיעור עשוי לטפל יותר מדי אחריות.מבחן יחידה אמיתי צריך להיות מסוגל לבדוק התנהגות אחת על ידי לעג רק אחד או שניים תלות. כאשר בדיקות להפוך אינטגרציה על ידי צורך, SRP הוא כנראה מופרת.
שינויים תכופים ובלתי צפויים
כיתות שמשנות כל גלגול, לעתים קרובות מסיבות שונות, סובלות מ"שינוי שינוי הפיכה" לתכונה אחת משפיעה בטעות על תכונה אחרת.חוסר יציבות זו היא סימן ההיכר של הפרות SRP.עקוב אחר ההיסטוריה של הקבצים שלך; אם שיעור אחד מופיע ברבים מבצעים התייחסות לסיפורי משתמשים שונים, זהו דגל אדום.
רשימות ארוכות של פרדוקסים או שיטות סטטר מופרזות
שיעורים הדורשים פרמטרים רבים כדי להיות מוגדר לפני השימוש לעתים קרובות מצביעים על כך שהם מנסים להתמודד עם מספר רב של הקשרים. בדומה, שיעור עם שיטות סטטר ציבורי רבות שיש לקרוא בסדר מסוים (הפיכת זמן) מצביע על כך שתחומי אחריות שונים מעורבים יחד.
אסטרטגיות לזיהוי הפרות
תגיות: Code Reviews with a Checklist
במהלך ביקורות קוד, שאל שאלות ספציפיות: "מה האחריות היחידה של המחלקה הזאת?", אם הצוות לא יכול להסכים על תשובה בולטת, השיעור כנראה צריך פיצול. השתמש ברשימות הכוללות את הסימנים לעיל.לעודד בודקים כדי לסמן כל שיטה שנראה "מחוץ למקום" - לדוגמה, שיטה המבצעת רשת I/O בתוך מחלקה העוסקת בעיקר בנתונים של טרנספורמציה.
כלי ניתוח קוד סטטי
כלים אוטומטיים יכולים לזהות ריחות SRP רבים עם כללים הניתנים להגדרה.כאן הם כמה מדדים וכלים שיש לשקול:
- (ב) ⁇ :0) ,(Cyclomatic Complexity: מתודולוגיות של 1 (FLT: 1) עם מורכבות גבוהה לעתים קרובות אות מספר רב של אחריות.
- (ה-Lack of Cohesion of Methods (LCOMua): מדד זה כמה שיטות חולקות שדות.A גבוה LCOM מציין כי השיעור מכיל למעשה מספר קבוצות נפרדות של שיטות הפועלות על נתונים שונים - הפרה ברורה של SRP. הרבה מנתחים סטטיים, כולל FLT:2PMDFal 3LT, דוח LCOM.
- (ב) אם שיעור תלוי בהרבה שיעורים אחרים שאינם קשורים, ייתכן שהוא מארגן יותר מדי אחריות.סונרקוביה יכולה למדוד "הפיכה קשה" ו"לנצל".
- (ב) ויקרא י"א): "כלים כמו [ה-]ב':2SimianFLT 3: 3 או גלאי השכפול המובנה בסנאר-קוביה יכולים להדגיש בלוקים חוזרים שיש להוציאם.
ניתוח קיסרי
דמיין את התלות בין המעמדות שלך.אם שיעור שירות נמוך יש תלות בלוגיקה עסקית ברמה גבוהה (מחזור תלותי או "ההוב" עם קשרים רבים), SRP עשוי להיות שבור.
מספק ריצה יבשה
לפני ביצוע שינויים, נסה לשנות מבחינה נפשית לזהות קבוצות נפרדות של שיטות ושדות שנראים שייכים יחד.אם אתה יכול לקרוא לכל קבוצה עם צומת אחד (למשל, "ReportFormatter", "דואר אלקטרוני", "Databaseor"), אז למחלקה המקורית היו לעתים קרובות מספר רב של תחומי אחריות.
אישור לשחזר SRP
ברגע שזיהית הפרה, המטרה היא לפרק את הכיתה לשיעורים קטנים וממוקדים תוך שמירה על ההתנהגות הקיימת.הההפצה צריכה להיעשות באופן מצטבר, עם בדיקות העוברות אחרי כל צעד.
הפקה Class
הטכניקה הישירה ביותר: ליצור מעמד חדש לכל אחד מהם אחריות מזוהה ולהעביר את השיטות והשדות הרלוונטיים אליו.המעמד המקורי הופך לחזית שמנציגים לכיתות החדשות.לאורך הזמן, אתה יכול להסיר את החזית ולתת ללקוחות אינטראקציה ישירות עם המעמדות הקטנים יותר.
החלפת מצב עם Polymorphism
כאשר יש שיעור גדול (FLT:4 או FLT:5 הצהרות לבחור התנהגות המבוססת על סוג או מצב, תנאים אלה מייצגים לעתים קרובות אחריות שונה. ליצור תת-מעמד או אובייקטים אסטרטגיה כדי לבודד כל גרסה.זה לא רק דבק SRP אלא גם משביע את העיקרון הפתוח / סגור.
תקשורת נפרדת ותהליכים
כיתות שני compute תוצאה ושולחות אותו באמצעות ערוץ כלשהו (network, קובץ, UI) מפרות את SRP. חישוב ותקשורת הן שתי אחריות נפרדת. השתמש בדפוס Command/Query: אובייקט שירות מבצע את החישוב, ונוכח נפרד או שולח מטפל בפלט.זה הופך את החישוב ללא לעג לתקשור.
הכירו מערכת אירועים
כאשר מחלקה צריכה לגרום לתופעות לוואי (כניסה, הודעה, ביקורת) לאחר ניתוח ליבה, SRP מציע להעביר את תופעות הלוואי האלה החוצה.גישה מונחת אירוע מאפשרת למחלקת הליבה לפרסם אירוע, ומטפלים נפרדים אחראים לרישום, דוא"ל, וכו 'זה שומר את שיעור הליבה התמקד בלוגיקה העסקית העיקרית שלו.
דוגמה מעשית: מתן דו"ח
ראה סעיף 6:
- נתונים של מסד נתונים
- פורמט הנתונים ל-HTML
- הודעות דוא"ל לרשימה של מקבלי
- שתף את מצב המשלוח לקובץ
לכיתה זו יש בבירור ארבע אחריות.לאורך זמן, כל אחריות משתנה מסיבות שונות: מקורות נתונים חדשים, פורמטים חדשים של פלט, ספקי דואר אלקטרוני חדשים, תקני כניסה חדשים.השיעור הופך לערעור.כאן מדובר בתוכנית של שינוי שלב אחר צעד.
שלב 1: זיהוי אחריות
רשימת הסיבות לשינוי: שינויים של סכימה מסד נתונים, דרישות עיצוב, לוגיקה של משלוח דואר אלקטרוני, פורמט כניסה.כל אחד הוא דאגה נפרדת.
שלב 2: אימוץ גישה לנתונים
יצירת מעמד 7 (FLT 7) המטפל בשאילתת מידע ולוגיקה של השאילתה לתוכה.
שלב 3: עיצוב
יצירת מחלקה 9 (FLT 9) שלוקחת נתונים גולמיים וחוזרת מחרוזת HTML.The FLT:10 עכשיו קורא המאגר כדי לקבל נתונים, ולאחר מכן את הפורמט כדי ליצור HTML.
שלב 4: שלח דואר אלקטרוני
יצירת מחלקה של תפוצה 11 אחראית להכנת הודעות דוא"ל ולשלוח הודעות דוא"ל.השיעור תלוי בתצורת שרת דואר אלקטרוני, לא על דיווח או פורמט.
שלב 5: מימוש
יצירת מסגרת סטנדרטית של כניסה (FLT:12) כדי להקליט תוצאות.שירות הדואר האלקטרוני יכול לקרוא לוגר, אבל טוב יותר, להשתמש באירוע: לאחר שליחת מוצלח, להעלות אירוע כי מטפל יומני נפרד אוסף.
תוצאות
המקור (FLT:13) הופך למתאם (או הוא מסולק לחלוטין) כל מחלקה חדשה היא קטנה, ניתנת לבדיקה, ויש לה סיבה אחת לשנות.לדוגמה, אתה יכול להעיד יחידה 14:14 ללא מסד נתונים או שרת דואר אלקטרוני.
כלים ומסובכים ל- Onמתמשכים Vigilance
Integrate SRP זיהוי לתוך צינור האינטגרציה המתמשך שלך. השתמש במדדים הבאים כדי לעקוב אחר מגמות איכות קוד:
- (FLT:0) מורכבות מתודולוגיה לכל שיטה: ⁇ FLT:1) Aim forערכים מתחת לגיל 10 עבור רוב השיטות.
- (ב) ⁇ :0) עץ ההקדשה (DIT): LT:1 מאוד ירושה עמוקה מאוד יכולה להסתיר אחריות מעורבת.
- (הופנה מהדף LT:0)0 (Lack of Cohesion of Methods): 1 מנתחים סטטיים רבים מחשבים את זה.ערך מעל 0.5 (בגודל נורמלי) מציע שהשיעור צריך להיות מפוצל.
- (ב) מספר התלויים הישירים: 1FLT אם שיעור תלוי יותר מ קומץ סוגים לא קשורים, סביר להניח שהוא מתאמת בין תחומי אחריות רבים.
(ב) , (ב) , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
מלכודות נפוצות ב-Refactoring
אישור ל-SRP אינו ללא סיכונים:
- (ב) שיעור חלוקת התפוצה (FLT:0) יתר על המידה: 1FLT:1, יכול ליצור אבסטרקציה מיותרת. מחלקה עם אחריות ברורה אחת כי לעתים נדירות שינויים לא צריכים לספק גם אם יש לה שני חששות פנימיים.
- (ב) ⁇ :0) עקיקת עקיפין: 1 (בשורה ראשונה) שיעורים קטנים רבים מדי יכולים להפוך את המערכת קשה לנווט.מאזן הוא מפתח – כל מחלקה צריכה להיות שם ברור ותכלית.
- (ב) [15] , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
- (ב) [15] עזיבתם של ליגת מורשת שעדיין תלויה בהרבה שיעורים מביסים את המטרה בסופו של דבר, הלקוחות צריכים להיות תלויים בשיעורים החדשים.
מסקנה
זיהוי ותיקון הפרות חד-צדדיות חד-צדדיות הוא משמעת מתמשכת שמשלמים דיבידנדים באיכות התוכנה. על ידי צפייה בסימנים - שיעורים גדולים, סיבות מרובות להשתנות, רכיבים קשים-למבחן - אתה יכול לתפוס בעיות מוקדם. השתמש שילוב של ביקורות קוד ידני, כלי ניתוח סטטי, ומפגשים קבועים מספקים כדי לשמור על בסיס קוד שלך coshesive.זכור כי SRP הוא מדריך, לא ברור, כאשר הוא קוד אחד הוא יעיל יותר, הוא יעיל יותר, הוא יעיל יותר, הוא יעיל יותר, הוא יישום, הוא יעיל יותר, הוא יישום קוד אחד, הוא יעיל יותר, הוא יעיל יותר, הוא יעיל יותר, כאשר הוא אחד הוא יעיל יותר, הוא יישום קוד סטנדרטי, הוא מסוגל לעשות את הקוד שלך הוא יעיל יותר, הוא מסוגל לעשות את זה הוא יעיל יותר, הוא יעיל יותר, הוא יעיל יותר, הוא יעיל יותר, כאשר הוא יעיל יותר, הוא יעיל יותר, כאשר הוא יעיל יותר, הוא יעיל יותר, הוא יעיל יותר, כאשר הוא יעיל יותר, הוא יעיל יותר, כאשר הוא יעיל יותר, הוא יעיל יותר, הוא אחד, הוא אחד, הוא יעיל יותר, כאשר הוא יעיל יותר, הוא מסוגל לעשות את זה הופך להיות מסוגל לעשות את זה הוא יישום קוד אחד, הוא אחד, הוא יישום קוד אחד, הוא אחד, הוא
כפי שמרטין פיולר כותב ב-FLT:0 (מספק: שיפור העיצוב של קוד קיים) 1: "כל שוטה יכול לכתוב קוד מחשב שיכול להבין.מתכנתים טובים כותבים קוד שבני אדם יכולים להבין."