
static למחלקה ולכל חבריה, ואז אי אפשר ליצור ממנה אובייקט.הטקסט המלא של הדקות הראשונות בהרצאה «הדגמה של Singleton - חלק 3» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
אוקיי, אז אנחנו רוצים להתחיל לבנות בעצם מערכת שכזו. אז מה בעצם הולך להיות לנו במערכת? אנחנו הולכים לבנות רק את הקליינט. יותר נכון, רק את הארכיטקטורה של הקליינט.
אז אנחנו נרצה רכיב תוכנה של תקשורת, רכיב הקלטת קול, רכיב הקלטת תמונה, רכיב עבור החלון הראשי, ורכיבים עבור החברים. אוקיי, אז בואו נתחיל אולי מרכיב התקשורת, או בואו פשוט נתחיל לבנות את המערכת.
אז בואו נפעיל Visual Studio, בואו נראה אם יש לי על שולחן העבודה, יש לי כאן, אוקיי. זה יהיה New Project, וזה יהיה, נתחיל עם Console Application, נעשה את הכל כקונסול.
אז זה יהיה קונסול, ונשים אותו כרגע על שולחן העבודה, ונקרא לזה פשוט סינגלטון סינגלטון וידאו קונפרים סינגלטון וידאו קונף יופי סינגלטון וידאו קונף אוקיי יפה אז זה זו בעצם הולכת להיות האפליקציה שלנו עכשיו אנחנו רוצים שאנחנו רוצים להתחיל לבנות את הקלאסים נתחיל עם ארבעת הקלאסים
האלו נכון קשורת הקלטת קול הקלטת תמונה וחלון ראשי אני לא יודע אם אנחנו נבנה גם את הרכיב שהוא לא סינגלטון אבל תכף נראה.
אוקיי אז נתחיל עם רכיב התקשורת. נחזור לוויז'ואל סטודיו ונעשה את זה בקובץ נפרד שזה יהיה ברור יותר אז עכבר ימני ואד קלאס. הקלאס הזה יהיה רכיב התקשורת Communication.
אז נקרא לזה Communication. Communication. Enter. אז זה רכיב התקשורת. אוקיי, ונחזור לתוכנית שלנו. עכשיו, התוכנית שלנו, לא, זאת אומרת, אנחנו רוצים שיהיה לנו רכיב תקשורת, אבל כרגע אני אניח לו, כרגע אני עוד לא אעשה איתו כלום,
כי בסך הכל רכיב התקשורת לא יוזם שום דבר, אז כרגע יש לנו איזשהו קלאס של תקשורת, אבל כרגע נניח לו. בואו נעבור שב לחלון הראשי, ומה שאני ארצה לעשות זה לדמות את הלוגין.
אז בואו נעבור לחלון הראשי. השאלה אם חלון ראשי, אם אנחנו רוצים חלון ממש, כי איך אחרת נפעיל פונקציה? אז בואו נעשה חלון אמיתי, בואו נוסיף עכבר ימני Add Windows Form.
נוסיף Windows Form, וזה בעצם החלון הראשי, נקרא לו שמו Main Window Add. יופי. ועכשיו נוסיף כפתור לוגין, נלך לטולבוקס, ננעץ, נוסיף כפתור, וזה בעצם יהיה כפתור הלוגין שלנו, לוגין, ונקרא לכפתור לוגין,
כדי שנראה בקוד שזה הכפתור, זה לוגין, ופשוט את הכפתור עצמו, דאבל קליק על לוגין, אז אנחנו עכשיו בפונקציה לוגין, אבל אם נחזור לארכיטקטורה שלנו, אז אנחנו רוצים שיהיה לנו רק חלון אחד במירב.
זאת אומרת, מקסימום חלון אחד, אבל לא בהכרח חלון. אז אחרי זה נחזור לוודא שאכן יש לנו חלון אחד, רק חלון אחד מקסימום. כרגע נתחיל עם ארכיטקטורה פשוטה, אז נחזור לחלון הראשי ואנחנו רוצים שבלחיצה על לוגאין, אנחנו רוצים לפנות לפונקציית לוג-אין שמחצין ה-Communication.
נגיד, כן, נגיד שזאת תהיה הארכיטקטורה, ה-Communication מחצין פונקציית לוג-אין ולוג-אאוט, אנחנו כרגע נממש לוג-אין. אוקיי, אז בואו נחזור.
ואנחנו רוצים לפנות אל רכיב התקשורת. יפה מאוד. אז במילים האלו עכשיו שאמרנו, אנחנו רוצים לפנות אל רכיב התקשורת. אז בעצם אנחנו מודים שיש רכיב תקשורת והוא הרכיב, אנחנו רוצים לפנות אל רכיב התקשורת, שזה באופן בלתי מפורש, אנחנו אומרים שיש רק רכיב אחד כזה.
אז עדיין לא קיבענו את רכיב התקשורת שהוא יהיה רק אחד, וגם עוד לא החצנו אותו, את האחד הזה. זאת אומרת, אם אני מכאן רוצה לפנות אל רכיב התקשורת ולהגיד Communication, אז יש לי פה את הקלאס קומיוניקיישן שבנינו אבל אני לא יכול להגיד קומיוניקיישן נקודה כי עוד לא החצנתי פונקציית לוגין של קומיוניקיישן.
זאת אומרת עוד לא החצנתי כזו פונקציה סטטית. אני יכול כן ליצור קומיוניקיישן חדש וליצור פונקציה. זאת אומרת אין לי עדיין פונקציית לוגין ואני צריך בעצם לקבל החלטה באיזה רמה פונקציית הלוגין תהיה.
האם היא תהיה ברמת המחלקה, Communication.Login, האם זו הפונקציה שאני רוצה לבנות, או האם זו הפונקציה שאני רוצה לבנות. מי מחצין את פונקציית לוגין? האם המחלקה תחצין את פונקציית לוגין, או האם אובייקט מסוג המחלקה הוא זה שמחצין את פונקציית לוגין?
אז אמרנו שאנחנו רוצים ש-Communication יהיה רק אחד כזה. לכאורה אפשר לממש את כל רכיב הלוגין, סליחה, את כל רכיב התקשורת, אפשר לממש אותו כמחלקה סטטית.
ואז יש לי רק אחד כזה. אז אולי בתור התחלה באמת נממש את רכיב התקשורת כמחלקה סטטית. עכשיו, סינגלטון, הפתרון של סינגלטון הוא לא לבנות מחלקות סטטיות, כי יש מספר בעיות עם פתרון של מחלקה סטטית, למרות שזה על פניו זה סוג של פתרון להגדיר
את כל המחלקה כסטטית, אבל בסינגלטון אחד מהדברים שאנחנו אומרים זה שעלול להיות שאנחנו נרצה יותר מאחד. זאת אומרת, אנחנו רוצים להשאיר את הגמישות שאולי אנחנו נרצה שניים כאלה ואולי הרבה כאלה.
אולי באמת יהיה ערוץ תקשורת של קול, והכל באמת ייצור ערוץ תקשורת א', רידיו רקורדר, יהיה לו ערוץ תקשורת משלו, אולי לוגין ולוגאוט, צריך ערוץ תקשורת משלו, אולי וכן הלאה.
אז יכול להיות שאנחנו נרצה שרכיב התקשורת יהיו כמה כאלה. זה אחד מהדברים שמנחים אותנו בעיקרון שאנחנו חושבים על סינגלטון, שזה לא כזה ודאי שאנחנו רוצים רק אחד כזה.
דבר נוסף עם סינגלטון זה או עם סטאטי זה שעלול להיות או השליטה נכון אנחנו אומרים אחד מקסימום אבל עלול להיות אפס ואם המחלקה היא סטאטית אז יש סביבות כמו ב-C++ שהמילה סטאטי אומר שיהיה בדיוק אחד כזה בוודאות ולא אפס.
ב-C-Sharp סטאטי הוא יותר גמיש, הוא באמת ייווצר רק בפנייה הראשונה אליו, שזה די סינגלטון. אבל באופן עקרוני, פתרון סטאטי, באופן כללי, פתרון סטאטי הוא לא נחשב, או מחלקה סטאטית לא נחשבת לפתרון סינגלטון מהסיבות האלה.
אוקיי, אבל רק כדי שלנו, רק בשביל השיעור ושלנו יהיה ברור, אז אני כן רוצה להתחיל עם פתרון סינגלטון. באמת כרגע אמור להיות לי רק אחד כזה אז בואו נממש את זה כסינגלטון.
אז נחזור אל הקוד שלנו ואנחנו לא נעבוד בשיטה הזו אנחנו נעבוד בשיטה הזו אז לוגין אני יכול להגיד לא ליצור לי את הפונקציה בואו נשתמש בצ'וקצ'יק generate method stop for פה לוגין, יפה, ו-f12, נלך אליו, וזוהי הפונקציה שנוצרה לנו בקומוניקיישן.
אז יש לנו פונקציית לוגין, ופונקציית הלוגין היא אמורה לבצע את התקשורת עצמה. אצלנו כל מה שאנחנו נעשה זה אנחנו רק נדפיס לקונסול cwtabtab שלוגין הופעלה.
זהו. בואו ננסה להריץ את התוכנית, נראה מה יקרה. אז כשאנחנו מריצים את התוכנית, בואו נעשה f11, אז המיין שלנו ריקה ולכן היא לא עושה שום דבר.
בואו נתחיל מזה שאנחנו רוצים, כשהתוכנית מתחילה לרוץ, להציג את החלון הראשי. בסופו של דבר אנחנו אומרים שהחלון הראשי לא בהכרח יוצג.
אמרנו שכשהתוכנית מתחילה לרוץ, אז היא אמורה להציג כאן, כל כך התוכניות היום מתנהגות, התוכנית אמורה להציג כאן אייקון מערכתי, ורק בלחיצה עליו בעצם החלון הראשי אמור להופיע או משהו כזה. זאת אומרת החלון הראשי לא אמור להיווצר עם תחילת ריצת התוכנית אבל האייקון כן אז בסוף אולי נסביר גם איך את זה עושים.
אבל בואו נתחיל אולי מתוכנית שבתחילת הריצה שלה מציגה חלון ראשי אחד ואחרי זה גם נראה איך אנחנו דואגים שלא ייווצרו עוד כאלה בטעות. אוקיי, אז נחזור לקוד שלנו.
מה שאנחנו רוצים על מנת להציג את החלון זה לכתוב application, בוא נראה אם יש לי צ'ופצ'יק לאפליקיישן, using, אוקיי, נקודה, run, ולה נותנים את החלון.
אנחנו ניצור את החלון בשורה נפרדת. בואו נסגור את זה ונמזער את זה. אז קוראים לחלון שלנו Main Window, אז אנחנו ניצור מיין ווינדו. עכשיו אם לרגע נדון בעובדה שאנחנו רוצים רק מיין ווינדו אחד אז אפשר היה גם להגיד בואו נגדיר את מיין ווינדו כסטטית.
אבל אבל אי אפשר להגדיר את מיין ווינדו כסטטית. F12, אולי נעלה את זה רגע למעלה, מיין ווינדו נתונה לנו, או יותר נכון אפילו אם אני אגדיר את מיין ווינדו כסטטית אני לא יודע אם זה יעבור קומפילציה אבל אם אני אגדיר אותה כסטטית עדיין יש לי בעיה עם ההתנהגות של המיין ווינדו
שהיא בעצם היא לא סטטית. הקוד שהוויז'ואל סטודיו כותב לי הסטנדרטי הוא לא עבור חלון סטטי. יכול להיות שאני יכול איכשהו לבנות לעצמי חלון סטטי אבל זה לא החלון שהוויז'ואל סטודיו בונה לי באופן טבעי.
אז אם אנחנו רוצים לעבוד עם החלון שבונה לי הוויז'ואל סטודיו אני לא יכול שהוא יהיה סטטי. אז אם נרצה לוודא שלא ניתן ליצור יותר ממיין ווינדו אחד כך שהוא יהיה סינגלטון, אז נצטרך למצוא איזשהו פתרון לזה.
אבל סטטי, להגדיר את המחלקה כסטטית, זה יתנגש בהתנהגות הטבעית של המחלקה שאנחנו מקבלים מהוויז'ואל סטודיו. אבל עוד נחזור לטפל במיין ווינדו שהוא יהיה סינגלטון.
כרגע בואו נחזור לקוד שלנו, אז חייבים להגדיר מיין ווינדו נקרא לו mw, נקצה מיין ווינדו אחד ונעביר פה mw. עכשיו f11, f11 מקצה לי מיין ווינדו אחד חדש, אפילו מבצע initialized component, יש פה קוד כמובן לא סטטי, כן, זו הבעיה בעצם, זה הקוד שמתבצע עבור האובייקט החדש שיצרנו, זה הקונסטרקטור,
ועכשיו אנחנו קוראים לאפליקיישן run, כן? אפליקיישן run לא חוזרת עד שלא סוגרים את החלון, כשסוגרים את החלון run חוזרת ואז רק התוכנית תסתיים.
אז F11 והנה החלון שלנו. לחיצה על לוגין, אולי נציג את הקונסול, לחיצה על לוגין ואז אנחנו מגיעים לפונקציה, קוראים ללוגין, מדפיסים לוגין למסך, יופי.
נראה שזה בסדר. אוקיי, אבל בואו נסגור ואכן התוכנית מסתיימת יפה מאוד מצוין אבל נזכר נלך לקומיוניקיישן ונזכר שהגדרנו את הפונקציה לוגין כסטטית שזה למעשה שקול להגדרת המחלקה לסטטית כי כל התכולה של המחלקה היא סטטית אז אפשר גם לכתוב פה סטטיק בוא נכתוב פה סטטיק