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

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

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

מקורו של ה-"תבניות העיצוב" של Four (1994), תבנית ה- Singleton מתייחסת לתרחישים שבהם רכיבים מרובים צריכים לגשת למשאב משותף מבלי ליצור מקרים מקודמים שיכולים להוביל לסכסוכים או למיצוי משאבים. בקביעת נתונים הנדסיים, שבו שיעורי נתונים יכולים לעלות על אלפי רשומות לשנייה, מעל פני מיידיות של אובייקטים מרובים של גליקו מרובים - כל קובץ פתיחה או רשת sotcancketack ביצועים וגורם חוסר יציבות.

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

למה ה- Singleton Pattern for Data Logging?

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

  • (ב) יש צורך ב- 0 (Resource Efficiency:FLT:1) רק קובץ אחד, חיבור רשת או buffer, צמצום הזיכרון והמערכת להתקשר מעל הראש.
  • (ב) סעיף 1:0) צו עקבי: FLT:1, נקודה אחת של כניסה עבור נתונים יומני מבטיח כי רשומות כתובות בסדר שהם נוצרו, אשר קריטי עבור debugging ו שלאחר-hoc ניתוח.
  • (FLT:0)Simplified SynSyncization: ההרחבה של 1:1) באמצעות מקרה אחד מקל על יישום פעולות כתיבה בטוחות חוט ללא תיאום מבוזר.
  • (FLT:0) הורדת משאבים: 1FIRLT:1) יכול להזיז את מחזור החיים שלו במפורש - פתיחת משאבים לשימוש ראשון ולסגיר אותם במהלך השבתת היישום - מניעת דליפות משאבים.

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

הפרקטיקה הטובה ביותר ליישום

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

Lazy Preization

Lazy sloation יוצר את מקרה ה-oneton רק כאשר הוא מתבקש לראשונה, ולא בסטארט-אפ יישום.זה מקטין את טביעת הרגל הזיכרון ואת זמן הסטארט-אפ, שהוא בעל ערך במיוחד במערכות משובצות או כאשר מודולים מרובים הם טעון באופן דינמי.לדוגמה, C++ logger יחידton עשוי להשתמש במשתנה סטטי מקומי כמו C++11, אשר מובטח להיות מוחזר רק פעם אחת באופן מאובטח ב- Java, באמצעות כבלואטרקורד סטונארון פנימי, באמצעות מחשביפטון, ללא עצלן קבוע.

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

המונחים: Safety

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

  • (ב) [ה]ה']: [ה'] [ה']'[ה]'[ה]']'[ה]'[ה]']'[ה]']'[ה']'[ה]']'[ה']'[ה']'[ה']'[ה']']'''']''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  • (ב) ,0) פעולות אטומיות: 1FLT 1 עבור ניגודים פשוטים או עדכוני דגל, השתמש במשתנה אטומי (למשל, FLT:2 ב C++,FLT 3 ב- Java).
  • (FLT:0)Lock-Free Buffers:FLT1 עבור גבוה מאוד, לשקול buffer טבעת ללא מנעולים שבו חוטים הפקדה רשומות ללא חסימת, וחוט סופר ייעודי מרוקן את ה-buffer. דפוס זה, הידוע בשם "פרונכר-קונמר" גרסה, ניתן ליישם באמצעות קבצים ממפת זיכרון או תורים מקבילים.
  • (FLT:0)Thread Local Storage (TLS): TLS:FIRLT:1 במקרים מסוימים, כל חוט יכול לכתוב ל- buffer חוט-local, ואת ה-oneton ממזג באופן זמני את הציצים האלה לתוך פלט אחד.

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

נקודת גישה גלובלית

לספק שיטה סטטית או רכוש כדי לשחזר את מקרה ה-oneton. in Engineering data logging, נקודת גישה זו צריכה להיות קלה ככל האפשר.הימנע מפרמטרים מופרזים: החתימה הטיפוסית היא FLT:4 או FLT:5 להימנע מתצורה עובר על כל שיחה - לא להשתמש בתצורה נגישה גלובלית או ראשונית אחת.

שקול לספק פונקציית מאקרו או קוליין כדי להפחית את ה-Verplate. לדוגמה, ב C++, אתה יכול להגדיר (FLT:6 ).זה לא רק מרכזי גישה, אלא גם מאפשר פסילת זמן של רמות יומן עבור שחרור.

ניהול משאבים

הטון מחזיק לעתים קרובות משאב - תיאור קובץ, חיבור מסד נתונים, או שקע רשת ניהול נכון משאבים הוא רב-חשיבות.יישם aFLT 7 או FLT:8 שיטה אשר פלואס buffers, משחרר מנעולים, סוגרים את הטיפול.קרא שיטה זו במכוון במהלך פיזור יישומים, לא מחורבן (כדי למנוע בעיות עם סדר סטטי).

בשפות עם מערכי דטרמיניסטיות (C++), ניתן להשתמש ב"יצור על שימוש ראשון, להרוס את תבנית היציאה של תהליך" אך להיות מודע למכשולים פוטנציאליים במהלך ההרס הסטטי.ב- Java, להשתמש ב-"מסגור: FLT:9 ב- Python, השתמש ברישום 10.

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

מדינה מינימלית

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

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

שיקולים מתקדמים

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

סינגלטון Anti-Patterns ו- Alternatives

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

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

בדיקה אחרונה ב-oneton Logger

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

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

באיזו שיטה תבחר, תעדו זאת בבירור כדי להימנע משימוש לרעה בייצור.

ביצוע Tuning for High-Frequency Logging

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

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

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

יישום Singleton ב Real-World Engineering Data Logging

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

Singleton Logger ב C++ עבור Embedded Systems

C++ Embedded לעתים קרובות פועל על מיקרובקר עם זיכרון מוגבל וללא מערכת הפעלה. a Singleton logger באמצעות סימולציות עצלות ניתן ליישם עם משתנה מקומי סטטי EFLT (ה-C++11 מבטיח בנייה בטוחה חוטים.המעמד לוגר שומר נקודה לנמל סדרתי או אובייקט מערכת קבצים, נפתח על שימוש ראשון.

Singleton Logger ב Java for Data Acquisition

ב-Java, תבנית ביל ספו טוטון משתמשת בכיתה פנימית סטטית: (FLT:14 ;השיטה 15 מחזירה 16; הליטר משתמש ב-FLT:17 מוגן על ידי FLT:18 עבור פולש גבוה, הלוגר יכול לטבול כותב ובאופן זמני.

Singleton Logger ב Python for Scientific Computing

הטבע הדינמי של פייתון הופך את היצירה פשוטה: להגדיר מקרה ברמה מודול או להשתמש metaclass. עם זאת, בטיחות חוט חייב להיות מפורש: שימוש FLT:19 סביב כתיבת פעולות; עבור ביצועים, לשקול שימוש באמצעות ניתוחי מודולים 20 כדי לאסוף נתונים בינאריים וכתיבה עם FLT:21 של Python (Global Interpreter Lock) מספק כמה בטיחות אבל לא עבור I / O; מנעול זה עדיין צריך קשר עם זיכרון משותף מאוד.

Singleton Logger in C# עבור מערכת ההפעלה מבוססת Windows

מפתחי C# משתמשים לעתים קרובות בכיתה עצלנים חס ושלום: (FLT:24 ; ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇

מסקנה

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

(בקריאה נוספת, חקרו את דפוסי העיצוב המקוריים של הספר FLT:0Design Patterns: Elements of Reusable Object-Oriented SoftwarecioFLT:1 מאת Gamma et al., או הדיון על סינגלים בטוחים חוטים ב-FLT:2IBM DevelopersFLT 3 עבור ארכיטקטורות מתקדמות, ראה את המאמר של מרטין Fowlers על FLT:2IBM Developers ב-Fier:2IBM DeveloperWorks:2R5Builds in the Cloudves 3.