PracticU

הדגמה של Singleton - חלק 9

בלי כתוביותעם כתוביות
PracticU › קורס Design Patterns › הדגמה של Singleton - חלק 9
מילון מושגים:
Singleton - דפוס עיצוב שמבטיח שממחלקה מסוימת יהיה מופע אחד בלבד, עם נקודת גישה גלובלית אליו.
אובייקט - יחידה בתכנות מונחה עצמים שמאגדת נתונים (תכונות) ופעולות (מתודות). נוצר בדרך כלל ממחלקה המשמשת כתבנית.
רכיב - יחידת בניין עצמאית וניתנת לשימוש חוזר בתוך מערכת או ממשק משתמש, שאחראית על חלק מוגדר מהתפקוד.
מחלקה - תבנית בתכנות מונחה עצמים שמגדירה אילו נתונים ופעולות יהיו לאובייקטים שנוצרים ממנה.
בנאי - מתודה מיוחדת שמופעלת אוטומטית בעת יצירת אובייקט ממחלקה, ומאתחלת את ערכיו ההתחלתיים.
משתנה - שם שמפנה למקום בזיכרון שבו נשמר ערך שיכול להשתנות במהלך ריצת התוכנית, כמו מספר, טקסט או אובייקט.
האש - פונקציה שממירה מידע לערך קצר באורך קבוע. שינוי קטן בקלט משנה את התוצאה, והיא חד-כיוונית.

הדגמה של Singleton - חלק 9
כשכמה חוטים (threads) מנסים בזמן אחד לגשת לאובייקט סינגלטון לראשונה, הם עלולים ליצור אותו פעמיים. השיעור מדגים את התקלה, את הסיבה לה ואת הדרך לזהות אותה בדיבאגר.
המערכת שנבנית
1. שני חוטים: חוט אחד מדמה את האודיו רקורדר וחוט שני מדמה את הווידאו רקורדר. לכל אחד פונקציית התחלה משלו (AudioProc ו-VideoProc), גם כשהקוד זהה, כי בפרויקט אמיתי הקוד שלהם שונה.
2. מחלקת סינגלטון: Communication מדמה את רכיב התקשורת ומכילה מתודת send שמדפיסה את הפאקט שהגיע.
3. הפעלה במקביל: שני החוטים מנסים בו זמנית לקבל את המופע ולקרוא ל-send, והמטרה היא לראות מה קורה בזמן היצירה.
4. הפרדה לקובץ נפרד: המחלקה מועברת לקובץ נפרד מ-Program כדי שהקוד יהיה קריא.
מה קורה בזמן ריצה
1. בדיקת null בשני החוטים: כל חוט בודק אם Instance שווה ל-null. אם שניהם מקבלים תשובה חיובית, שניהם נכנסים לבלוק היצירה ומפעילים את הקונסטרקטור.
2. דריסה של המשתנה: כל חוט מקצה אובייקט משלו ודורס את Instance, כך שאובייקט אחד הולך לאיבוד והשניים ממשיכים לשלוח הודעות.
3. הדגמה עם נקודות עצירה: המרצה מקפיא חוט אחד, מאפשר לשני להגיע לאותה נקודה, ומציג שני אובייקטים שונים לפי ה-hash code שלהם.
פקודות והגדרות
מוסיפים הדפסה של this.GetHashCode() בקונסטרקטור ובמתודת send, כדי לזהות מאיזה אובייקט מגיעה כל הודעה. כך רואים בזמן ריצה שנוצרו שני אובייקטים.
שימו לב
בקוד עם חוטים מרובים הקונסטרקטור של סינגלטון אמור לרוץ פעם אחת בלבד. הקוד שנכתב כאן מפר את הכלל הזה, וזו בדיוק הבעיה שהשיעור מציג.
בתום השיעור הסטודנט מזהה מדוע בדיקת null ויצירה ללא הגנה מובילות לכפילות באובייקט סינגלטון, ומכיר את הדרך לזהות את התקלה בדיבאגר.
השיעור הבא בקורס: הדגמה של Singleton - חלק 10

פרקי ההרצאה: הדגמה של Singleton - חלק 9

  1. 00:00

    מטרה: שני Threads שניגשים לאותו סינגלטון

  2. 00:54

    תכנון הניסוי: אודיו, וידאו וקומוניקיישן

  3. 02:16

    יצירת Thread לאודיו והגדרת Thread Start

  4. 04:08

    שכפול ה-Thread לערוץ הווידאו

  5. 05:08

    מחלקת Singleton עם שדה Instance

  6. 06:49

    פונקציית send והבנאי הפרטי

  7. 08:27

    העברת מחלקת התוכנית לקובץ נפרד

  8. 10:42

    מקביליות: מה קורה כש-Threads רצים יחד

תמלול ההרצאה: הדגמה של Singleton - חלק 9

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

  1. 00:12

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

  2. 00:36

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

  3. 00:54

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

  4. 01:14

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

  5. 01:32

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

  6. 01:45

    אז בואו נפתח את הוויז'ואל סטודיו ניו פרוג'קט ווינדוס קונסול וזה יהיה סינגל טון סרדס סינגל טון בלי E סרדס אנטר יופי.

  7. 02:06

    אז במיין שלנו אנחנו הולכים ליצור שני סרדים אז בואו נגדיר סרד סרד אלט שיפט F10 אנטר סרד זה יהיה האודיו סרד. שווה New Audio Thread, עכשיו ה-thread יש לו ארבעה אוברלורדים לקונסטרקטור, אנחנו רוצים את מספר שתיים, אנחנו רוצים להעביר לו Thread Start, מה זה ה-Thread Start הזה?

  8. 02:42

    אז הוא אומר פה למטה ש-Thread Start זה דליגט, זה פוינטר לפונקציה, אם אני אעשה F12, אני אלך ל-thread ואני אעשה קונטרול F, Thread Start, הנה, הנה Thread Start, אז Thread Start F12, ככה נראה ה-Thread Start, זאת אומרת, זה פונקציה שמחזירה ווייד ולא מקבלת שום דבר.

  9. 03:02

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

  10. 03:19

    עכשיו, כל מה שהיא תעשה, היא תנסה ליצור, או היא תנסה להגיד לרכיב הקומוניקיישן שלנו, שתכף ניצור אותו, תרצה להגיד לו singleton.communication.instance.send ולשלוח איזשהו משהו.

  11. 03:38

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

  12. 04:13

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

  13. 04:53

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

  14. 05:08

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

  15. 05:40

    קומיוניקיישן נקודה אין לו אינסטנס תכף ניצור אינסטנס אני כותב את זה כפונקציה על שיפט f10 enter רק כדי שהוא ייצור לי את זה ואז אני מסיר את זה ואני אגיד לו נקודה send send ופה אנחנו נעביר לו זה אודיו זה מה שאנחנו עושים עכשיו זה הפרופרטי אינסטנס שלנו אז זה יהיה get זה נוציא ובסופו של דבר

  16. 06:11

    אנחנו מחזירים אינסטנס קטן נחזיר אינסטנס גדול נמיר אותו לקטן וזו התכונה אנחנו צריכים גם שדה שהוא יהיה private static void אינסטנס וזה השדה ואנחנו לא מחזירים אינסטנס לא מחזירה ווייד אינסטנס מחזירה סינגלטון קומיוניקיישן F6 יש בעיה F8 כי זה לא ווייד יפה אז זה סינגלטון קומיוניקיישן F6 F8 יפה אין לנו פונקציה

  17. 06:55

    send אלט שיפט F10 אנטר וזו הפונקציה send, הפי, פי זה טוב, אבל זה, נגדיר את זה בתור המילה פאקט, ומה שאנחנו עושים, cw-tab-tab, console.writeland, אנחנו פשוט מדפיסים שהפאקט שהגיע, send נשלחה, ונמחק את החריגה.

  18. 07:19

    F6, מצוין, הכל עובר בשלום. אותו דבר אנחנו רוצים מהקונטרול C, קונטרול V, קונטרול X, אנחנו רוצים כאן לכתוב וידאו יפה מאוד אוקיי הדבר האחרון שנותר זה רגע מה הוא רוצה מהאינסטאנס is never assigned to will always have כן לא בדקנו טוב מאוד שהוא מזהיר אותנו אנחנו רוצים בתכונה אם אינסטאנס שווה לנעל אז אינסטאנס

  19. 07:55

    שווה לניו סינגלטון ואנחנו רוצים F12, קונסטרקטור, אין לנו קונסטרקטור, אז נכתוב פה ctor tab tab, נשנה אותו ל-private, ונדפיס cw tab tab, שניקח את זה ונדביק את השם של המחלקה, ctor invoked f6, בילד סקסידד, יפה.

  20. 08:25

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

  21. 08:57

    לקובץ נפרד את ההגדרה של הקלאס אז ניקח את זה, נעשה לו cut, נגדיר פה עכבר ימני, אפשר אפילו ctrl z, פשוט את פרוגרם לשכפל, ctrl cv, ולזו לקרוא, פשוט את זה אני לוקח, עושה לזה קופי, ctrl alt l, f2, ctrl v, אוריד את הרווח, enter.

  22. 09:26

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

  23. 09:51

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

  24. 10:11

    הוא מתחיל לרוץ, אז הפונקציה הזו מתחילה, ומיד מסתיימת ומתה. ונגמר, והסרד מת.

  25. 10:18

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

  26. 10:42

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

  27. 11:01

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

  28. 11:15

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

  29. 11:35

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

  30. 11:47

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

  31. 12:12

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

  32. 12:26

    אבל תוך כדי, גם הפרד השני,

לקורס המלא: קורס Design Patterns אונליין

ההרצאה הקודמת: הדגמה של Singleton - חלק 8

ההרצאה הבאה: הדגמה של Singleton - חלק 10

הרצאות קשורות מקורסים אחרים

  • הדגמה של הרובוט
  • הדגמה של Decorators
  • הדגמה של DRS
  • הדגמה של RESTCONF

קורסים נוספים במסלול

  • קורס WinForms - תוכנות רגילות בווינדוס
  • פרויקט מעשי ב-#C - בונים מחשבון פשוט
  • פרויקט מעשי ב-#C - ספר טלפונים
  • פרויקט מעשי ב-#C - תוכנת צייר
  • קורס ADO.NET - חיבור אתר למסד נתונים
  • קורס תכנות מתקדם - #Advanced .NET C