הקדמה: למה הקונפדרציה העולמית צריכה סינגלטון

בתוכנות הנדסיות - בין אם מדובר בניתוח סופי-הlementr (FEA) של תכנון ממוחשב (CAD) kernel, או מערכת בקרה בזמן אמת - הגדרות גלובליות למשולות כל דבר מסובלנות לפתרון העדפות המשתמש. כאשר עשרות מודולים חייבים לקרוא את אותו ערך או רכוש חומרי, כל אי עקביות יכולה לייצר תוצאות לא נכונות, תצורה מרתיעה או מחיקת מצבים של נקודה אחת, לדוגמה, כדי להפחית את הממשק יחיד של גישה אחת.

מאמר זה בוחן את התפקיד של דפוס הטון במיוחד לניהול הגדרות גלובליות בתוך תוכנה הנדסית.אנו נבחן את מכניקתו, היתרונות, יישום תקלות, חששות חוטפים, חלופות מעשיות - כל זאת תוך מוצהר במגבלות הנדסיות בעולם האמיתי כמו ביצוע רדיניסטי, ביצועים ובדיקתיות.

הבנת תבנית ה- Singleton

דפוס הטון הוא אחד מתבניות העיצוב המקוריות של Gang-of-Four.a. הדרישה הבסיסית שלו פשוטה: מחלקה חייבת לאפשר רק מקרה אחד להיווצר, והוא חייב לספק נקודת גישה גלובלית של גישה לאותה מקרה.היישום הקלאסי כרוך ביצור פרטי, חבר סטטי כדי להחזיק את המקרה, ושיטת ציבור סטטית (למשל, FLT:0).

C++ Singleton עבור מנהל תצורה נראה כך:

class ConfigManager {
public:
 static ConfigManager& getInstance() {
 static ConfigManager instance; // thread-safe in C++11+
 return instance;
 }
 double getTolerance() const { return tolerance_; }
 void setTolerance(double t) { tolerance_ = t; }
private:
 ConfigManager() : tolerance_(1e-6) {}
 double tolerance_;
};

הכוח העיקרי של התבנית הוא שהוא מספק נקודה מבוקרת, צפויה של תיאום.בתוכנה הנדסית, שבו מודול אחד עשוי צריך לדעת את גודל הזמן המשמש אחר, תצורת יחיד מונעת כל מודול לשמור על עותק משלו - אשר כמעט בוודאות התרחק מסנכרן.

ניהול הגדרות הסודיות הגלובליות בהנדסת תוכנה

יישומים הנדסיים לעתים קרובות להתמודד עם סביבות שבהן רכיבים מרובים חייבים לשתף פרמטרים של זמן ריצה.

  • (ב) ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
  • (FLT:0CAD ומערכות PLMIRFLT:1) - יחידות משתמש, טיוטת סטנדרטים, ומפתחי רישיון הם מועמדים טבעיים עבור אובייקט הגדרות גלובליות.
  • (FLT:0) מערכות בקרה בזמן אמת (FLT:1) - רווחי בקר, מרווחי דגימה, וסףי אזעקה חייבים להיות נגיש עם שקיפות נמוכה מחוטים מרובים - טון עם סאימוניזציה נאותה synSyncization יש מגבלות.
  • (FLT:0 data loggers and post-מעבדים ראשיים של LT:1) - פורמט Output, רמת דחיסה ונתיבי קבצים נדרשים לאורך מחזור חיי היישום.

בכל מקרה, החלופה תהיה להעביר אובייקט תצורה באמצעות כל מכנה של בונה ותפקוד. בעוד גישה זו (זריקת תלות) היא נקייה מבחינה ארכיטקטונית, בבסיסי הנדסה מורשת רבים היא לא מעשית בשל ערימות שיחות עמוקות ו הלולאות רגישות לביצוע.הטון מציע קרקע בינונית פרגמטית.

הבטחת יציבות מעבר למודולים

תארו לעצמכם סימולציה רב-פיזיקה שבה מכניקה מבנית ודינמיקה נוזלית מחליפים תנאים בכל שלב.אם מודול הנוזל משתמש בצפיפות שונה מאשר המודול המבני, תוכנית ההפיכה תניב תוצאות חסרות משמעות פיזית.על ידי ריכוז תכונות חומריות ב-FLT:3 Singleton, שני המודולים קוראים את אותו הערך - תוך מתן מקור משותף של טעות.

עקביות זו משתרעת מעבר לערכים המספריים לדגלים התנהגותיים (למשל, "שימוש חישוב מקביל" או "בדיקות ניתוק") , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇

היתרונות של דפוס הבודדון עבור סודיות

  • (ב) [15] גישה ומוטציות (FLT:1 ), כי כל קורא וכותב דרך מקרה אחד, אתה יכול לאכוף חוקי אימות (למשל, "סובלנות אינה יכולה להיות שלילית") , כניסה או מצבי קריאה בלבד.
  • (FLT:0) Lazy FirstizationFLT:1 - ניתן ליצור אובייקט התצורה על פי בקשה ראשונה, הימנעות מסטארט-אפ מעל פני הראש כאשר התצורה אינה נדרשת באופן מיידי.
  • (FLT:0) נקודת גישה גלובלית: כל קוד יכול לשחזר את ההגדרות עם שיחה סטטית פשוטה, צמצום לוחמת רותחת.זה חשוב במיוחד במסגרות מחוסמות (למשל, OpenGL, Event Loops) שבו עובר הקשר הוא cumbersome.
  • (FLT:0) מצב המדינה הקפיטליסטית 1FLT: כי רק עותק אחד קיים, אתה יכול לנסח את הטון ל-XML/JSON forמחסומים/restart, שהוא חיוני בסימולציות ארוכות טווח.

דרישות יישום וקישור בטיחות

תוכנה הנדסית משתמשת יותר ויותר מחשוב רב-קריאה ומופץ.יישום נאיב של Singleton יכול להציג תנאים גזעיים שנתוני תצורה מושחתים.חשבו בגישות קלאסיות אלה להקדשה בטוחה חוט:

ההרחבה Motex-Guarded Preization

class Config {
private:
 static Config* instance_;
 static std::mutex mtx_;
public:
 static Config* getInstance() {
 if (!instance_) {
 std::lock_guard<std::mutex> lock(mtx_);
 if (!instance_)
 instance_ = new Config();
 }
 return instance_;
 }
};

מנעול כפול זה עובד נכון ב C++11 ולאחר מכן, כי השפה מגדירה רכישה / שחרור זיכרון סדר על פי FLT:5 פעולות.בסטנדרטים ישנים יותר, הוא נשבר על הרבה מדפים.

Static Local Firstization (C++11/ Java / C#)

ה- C++ הקודמת באמצעות הפונקציה-localFLT:6 משתנה מובטח להיות בטוח חוט על ידי תקן C++11 (הראשוני נקרא בדיוק פעם במהלך השיחה הראשונה).

אם האובייקט התצורה תמיד נחוץ בסטארט-אפ, פשוטו-אפ:10 בתוך ההגדרה המעמדית (החלת הצטלבת) נמנעים מגלישה מוחלטת, כי הוא נוצר לפני FLT:11 עם זאת, זה יכול לגרום לבעיות בספריות עמוסות דינמיות, והוא מבטל את התועלת העצלה.

עבור תוכנה הנדסית, ההתחלתיזציה להוטה היא לעתים קרובות מקובל כי תצורה ידועה בשלב ההתקנה הראשוני.הבחירה תלויה אם היישום שלך חייב לתמוך לטעון תוסף דינמי שבו ניתן לגשת ל-oneton לפני התצוגה העיקרית היה מלא.

סקלאלה ושיקולי תחזוקה

ככל שתוכנה הנדסית גדלה, שמירה על מונוליטית (FLT) 12 טון הופך ללא נאמנות. אנטי-פטרון נפוץ הוא לזרוק כל הגדרה לכיתה אחת, וכתוצאה מכך מאות מפטרים/שחקנים ופגיעה בעקרון האחריות הבודד.

  • (FLT:0) יחידות ספציפיות ספציפיות של דומיין 1 (במקום אחת הגדרות behemoth, ליצור בודדים נפרדים עבור פרמטרים, חומרים, אפשרויות הדמיה, וכו 'כל אחד נשאר קטן וממוקד.
  • (ה) [ה] [ה] [ה]] [ה] [ה]] [ה] [ה]] [ה]]] [ה]] [ה]] [ה]]]], [ה]], [ה], [ה], [ה], [ה],], [ה],], [הההה],], [ההתתתתחילה]]]] [ה] [ה]]]]]] [ה[ה[ה[ה[ה[ה]]]]] [ה[ה[ה[ה[ה[ה[ה]]]]]]]]]] [ה[ה[ה]]]]]]]] [ה[ה[ה[ה[ה[ה[ה[ה[ה[ה[ה[ה[ה[ה[ה[ה[ה]]]]]]]]]]]]]]]]]]]], [ה[ה[ה[ה[ה[ה[ה]]]]]]]]]]]]]]]]]]]]] [ה
  • (FLT:0)Configuration תצלומים של סימולציות 1 (לביצועים, לאפשר למודולים לצלם את הטון בסטארט-אפ, לאחסן ערכים רלוונטיים במשתנים מקומיים, ולאחר מכן לקרוא מחדש רק כאשר לא ניתן להבחין בשינוי (תבנית Observer).

אתגרים ומלכודות

למרות השימושיות שלו, דפוס הטון נושא סיכונים מוכרים כי הם מוגדלים בבסיסי קוד הנדסי גדולים:

בדיקה אחרונה ב- 2008.

מדינה גלובלית של רווקטון נמשכת במקרי מבחן, המחייבת דמעה זהירה למנוע זיהום בדיקה.מבחן אחד נכשל יכול להרעיל בדיקות לאחר מכן.לocking the Singleton הוא קשה כי סטטיFLT:13 הוא קשה מחווט.חלק מהצוותים מקטין את זה על ידי הצגת ממשק מופשט ושימוש בדרגה ספציפית מבחן כי הוא מעל המקרה הבודד (למשל, LTFLTFLTF-pri-vate).

תלות נסתרת

קוד הקורא לקוד (FLT:15) יש תלות בלתי נראית בכיתה זו.שינוי אסטרטגיית התצורה או הוספת מקור חדש של הגדרות (למשל, ממסד נתונים) הופך יקר כי כל אתר שיחות חייב להימצא ולעדכן.

קונסולות בוגס Beyondization

גם אם ההתחלתיזציה היא נתונים תצורה חסומה, דו-פעמיים הנקראים ונכתבים מחוטים מרובים דורשים סינכרוניזציה זהירה.אם חוט אחד מעדכן את הסובלנות בעוד אחר קורא אותה, תוכל לראות ערך קרועה.שימוש ב-FLT:16 עבור סוגים פשוטים או מנעול קורא עבור מדינה מורכבת יכול להגן מפני זה, אך מוסיף מורכבות וצווארי בקבוק ביצועים פוטנציאליים במסלולים חמים.

אפשרויות ל-oneton Pattern

בתוכנות הנדסה מודרניות, הטון אינו הכלי היחיד בהתאם להקשר שלך, שקול חלופות אלה:

תבנית Monostate

Monostate עושה את זה נתונים סטטיים:0 â € 1 â € ¢ â ¢ ¢ ¢ ¢ ¢ ¢ ¢ ¢ ¢ ¢ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ¢ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇

שירותי ההרחבה (Configuration Service)

מסגרות כמו Spring (Java), DI מיכלs ב C#, או ספריות C++ מודרניות (Boost.DI) מאפשרות לך לקשור ממשק למודול יחיד.

class Solver {
public:
 Solver(IConfiguration& config) : config_(config) {}
 // ...
};

גישה זו מפשטת מאוד בדיקות: אתה יכול להעביר אובייקט תצורה לעג.הצד הוא שאתה חייב ליישר את גרף התלות, אשר יכול להיות מזועזע קוד מורשת או לולאות רגישות ביצועים שבו עובר דרך הרבה פונקציות מוסיף מעל פני.

איכות הסביבה וקבצים של סודיות

כלים הנדסיים רבים (למשל, ANSYS, MATLAB, Abaqus) משתמשים במשתנים סביבתיים או קבצים חיצוניים תצורה הנקראים ב-Start.the תצורה נתונים מועסים במבנה דמוי עולמי (לעתים קרובות יחיד תחת הכותרת) אבל המשתמש רואה תצורה מבוססת קובץ.תבנית זו מפחיתה את הצורך במודולים של תוכנית LT 18 Call; במקום זאת, שאילתה אובייקט FLT:19 אשר היה מאוכלס מקובץ.

עבור יישומים הנדסיים רציניים, גישה היברידית עובדת בצורה הטובה ביותר: להשתמש ב-oneton פנימי לביצועים, אך לחשוף את כל התצורה באמצעות ממשק מבוסס קובץ, ומאפשרת העברת הודעות בזמן ריצה דרך דפוס המשקיף.

Best Practices for Implementing Singleton Configuration in Engineering Software

ציור מעשרות שנים של פיתוח בעולם האמיתי, הנה המלצות ניתנות להפעלה:

  • (ב) [ה]] [ה]] [ה]], [ה]], [ה], [ה]], [ה]], [ה],]] ב[ה], [ה], [ה], [ה], [ה], [ה],], [התחילה]] [ה] [ה']], [ה'] לא תיראתת ה' [לכתוב] את ה' [ה'] את ה'']']']'''''''''''''''''''''''''''''''''''''''' [ה'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  • (FLT:0)Break Up monolithic SingletonsFIRLT:1) - תצורה מפוצלת לקבוצות לוגיות (SolverConfig, MaterialConfig וכו ') כדי לשמור על כפייה ולאפשר לעג סלקטיבי.
  • (ב) ,0) , ראה ממשק מבדיל בין ה-FLT: [17] ל-[[1924]] ל[[1924]], [[1924]], [[1924]], [[1924]], [[1924]]]]]], [[1924]]]]]]]]]], [[1924]]]]]]]]]], [[1924]]]]]]]]]]]]]]]]]], [[1924]]]]]]]]]]]]
  • (FLT:0) ניתן להשגה לאחר ההפעלה בכל פעם שניתן יהיה ל- 1FIRLT – אם הגדרות נקראות פעם במהלך ההתחלתיזציה, העתק אותן למצב מודול מקומי.זה מבטל את כל בעיות הסינכרון והופך את ה-oneton למעשה לקריאה בלבד.
  • (FLT:0Log and אימות שינויים FLT:1 - כאשר הגדרה משתנה בזמן ריצה (למשל, משתמשים tweaks סובלנות ב- GUI), להזין את השינוי ולאמת את הערך החדש נגד מגבלות.
  • (FLT:0) ללא שימוש מופרז ב-FLT:1 - שמור את הטון על דאגות גלובליות באמת.אם הגדרה נדרשת רק על ידי מודול אחד, לשמור אותו מקומי. overusing Singletons יוצר תלות ספגטי.

דוגמאות אמיתיות בעולם בהנדסת תוכנה

כמה כלי הנדסה ידועים להשתמש דפוס יחידטון לניהול תצורה:

  • (ב) [15] ,0)בנדר (3D) חבילת הבריאה (FLT:1 ), השתמש בסומטב גלובלי (FLT:25 ), המכיל העדפות משתמשים (יחידות, נושא, ערכת נושא, תמונה מרכזית) באמצעות נקודת ציון FLT:26 ברחבי בסיס הקוד.
  • (ב) ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
  • (ב) ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇

דוגמאות אלה מראות כי אפילו מערכות "פרקטיות טובות" מודרניות מסתמכות על סינגלים כאשר היתרון של תיאום גלובלי עולה על עלויות הבדיקה.

משאבים חיצוניים

לקריאה עמוקה יותר, עיין בהערות אלה:

  • (ב) ,0) מתן גורו: Singleton PatternveFLT:1) - הסבר ברור עם דוגמאות קוד בכמה שפות.
  • (ב) דוק: דוקים של Microsoft: יישום יחידטון ב CielFLT 1:1 - מכסה בטיחות חוט ושיטות טובות ביותר.
  • (ב) מרטין פולר: הרישום FLT:1 - מדבר על התבנית כמשתנה גלובלי מבוקר, בן דוד קרוב ל-oneton.
  • (ב) ⁇ :0) ⁇ : Singleton in C++FLT:1 - אתגרים בסביבות מרובות-הנקראות.

מסקנה

דפוס הטון נשאר פתרון יציב לניהול הגדרות תצורה גלובלית בתוכנות הנדסיות כאשר נעשה שימוש בדבקות.זה מספק את העקביות והביצועים הדרושים על ידי יישומים אינטנסיביים חישוביים תוך מתן API פשוט שכל מפתח בצוות יכול להבין.עם זאת, התבנית אינה כדור כסף.זה מציג מצב גלובלי שמסבך בדיקות ויכול להסתיר תלות אם נעשה שימוש יתר.

המפתח הוא ליישם את הטון רק כאשר נדרש תיאום גלובלי אמיתי - סובלנות פתורה, פרמטרים מערכתיים, קבועי cross-module - וכדי לבודד את שאר הקוד מתלות ישירה בו באמצעות ממשקים, חוסר יכולת, או הזרקת תלותיות. על ידי ביצוע התרגילים הטובים ביותר המפורטים לעיל, צוותי הנדסה יכולים לרתום את כוחו של הטון מבלי ליפול למלכודת המשותפת שלו, תוכנה כי הוא חזק והחזקה.