PracticU

אוספים - Collections - חלק 4

בלי כתוביותעם כתוביות
PracticU › קורס תכנות מתקדם - #Advanced .NET C › אוספים - Collections - חלק 4
מילון מושגים:
מחלקה - תבנית בתכנות מונחה עצמים שמגדירה אילו נתונים ופעולות יהיו לאובייקטים שנוצרים ממנה.
מערך - מבנה נתונים שמאחסן אוסף ערכים מאותו סוג ברצף, שאפשר לגשת אליהם לפי מספר מיקום (אינדקס).
פונקציה - קטע קוד בעל שם שמבצע משימה מוגדרת, מקבל ערכי קלט (פרמטרים) ויכול להחזיר תוצאה. מאפשרת לארגן קוד ולהשתמש בו שוב.
ממשק - נקודת מגע בין רכיבים: ממשק משתמש שבו אדם מפעיל תוכנה, או ממשק תכנותי שמגדיר אילו פעולות רכיב אחד חושף לאחר.
אובייקט - יחידה בתכנות מונחה עצמים שמאגדת נתונים (תכונות) ופעולות (מתודות). נוצר בדרך כלל ממחלקה המשמשת כתבנית.
קומפיילר - תוכנה שממירה קוד מקור שנכתב בשפת תכנות לקוד שהמחשב יכול להריץ, ומדווחת על שגיאות תחביר.
זיכרון - רכיב מהיר ונדיף שבו המחשב שומר נתונים ותוכניות בזמן ריצתם. תוכנו נמחק עם כיבוי המחשב.
פרמטר - ערך שמועבר לפונקציה או לפקודה כקלט, ומשפיע על אופן פעולתן ועל התוצאה שהן מחזירות.

אוספים - Collections - חלק 4
בשיעור הזה הופכים מחלקה רגילה, קשת בענן, לאוסף שניתן לרוץ עליו עם foreach, וזה דורש הבנה של IEnumerable ושל IEnumerator.
השלבים העיקריים
1. קשת כאוסף של צבעים: המחלקה Rainbow מכילה את מספר הצבעים TotalColors ואת חמישה צבעים לקריאה בלבד, אדום, צהוב, ירוק, כחול ומג'נטה. למחלקה אין מערך פנימי, והצבעים מוגדרים ישירות בה.
2. למה foreach לא עובדת מיד: foreach דורשת שהמחלקה תהיה אוסף במובן הטכני, כלומר שניתן לרוץ עליה. הגדרה כזאת מתקבלת על ידי הורשת IEnumerable.
3. הפונקציה GetEnumerator: הממשק IEnumerable מכיל פונקציה אחת, GetEnumerator, שמחזירה אובייקט מסוג IEnumerator. האובייקט הזה הוא מה שמאפשר לרוץ על האוסף.
4. מחלקה מקוננת לאינומרטור: המחלקה RainbowEnumerator ממשת את IEnumerator ומכילה שלוש פעולות. Reset מחזירה את המיקום להתחלה, MoveNext מקדמת את המיקום ומחזירה האם יש פריט נוסף, ו-Current מחזירה את הפריט במיקום הנוכחי.
5. המיקום ההתחלתי: המיקום מתחיל ב-0, לפני הפריט הראשון, כי MoveNext מקדמת את המיקום לפני הקריאה הראשונה לערך.
6. מה foreach עושה מאחורי הקלעים: היא קוראת ל-GetEnumerator פעם אחת, ואז רצה בלולאת while שקוראת ל-MoveNext ואחר כך ל-Current. לכן אפשר לכתוב את אותה ריצה בעצמנו, והתוצאה זהה.
7. yield return: מילה שמורה שמאפשרת לכתוב פונקציה שמחזירה IEnumerable בלי לכתוב מחלקת אינומרטור. הקומפיילר בונה את המחלקה לבד, וכל yield return מוסיף ערך לריצה.
8. סדרת פיבונאצ'י: עם yield return אפשר לחשב את הסדרה תוך כדי הריצה, בלי לשמור אותה בזיכרון מראש, כשמספר הפריטים נקבע לפי הפרמטר של הפונקציה.
בסיום השיעור ברור שכל אוסף מבוסס על IEnumerable, ושאפשר לבנות אוסף משלנו בשתי דרכים: מימוש ידני של IEnumerator או שימוש ב-yield return.
השיעור הבא בקורס: תרגילים על Collections

פרקי ההרצאה: אוספים - Collections - חלק 4

  1. 00:00

    קשת בענן כאוסף של צבעים

  2. 02:59

    הגדרה טכנית של אוסף: IEnumerable

  3. 05:20

    מתודת GetEnumerator והאינומרטור

  4. 06:59

    הנומרטור: מה שמאפשר ריצה על האוסף

  5. 08:16

    מחלקה פנימית RainbowEnumerator

  6. 10:40

    שדה Position והתחלת הריצה

  7. 12:01

    מתודת MoveNext

  8. 13:09

    מתודת Current לפי המיקום

תמלול ההרצאה: אוספים - Collections - חלק 4

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

  1. 00:10

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

  2. 00:34

    והדוגמה שאני רוצה להראות כרגע זה דוגמה לא סטנדרטית בכדי להראות את היכולות ואת השימוש בשני הממשקים האלה של ה-i-numerable וה-i-numerator.

  3. 00:47

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

  4. 01:05

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

  5. 01:15

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

  6. 01:38

    אז יש לנו כאן קודם כל משתנה אינטג'רי שמתאר כמה צבעים יש לנו, Total Colors. אנחנו מדברים על חמישה צבעים, ויש לנו את הצבעים עצמם, Read Only. כל אחד מהצבעים, אני לא רוצה שמישהו ישנה לי אותו, ולכן הוא מוגדר כ-Read Only.

  7. 02:00

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

  8. 02:57

    שני הצבעים הנוספים שהתגלו אגב זה כתום שמופיע אחרי האדום ואינדיגו שמופיע אחרי הכחול, אבל אין לנו כרגע את הצבעים האלה, אז נסתפק באלה ופתאום אנחנו רואים שיש לנו פה איזושהי מחלקה שאומרת אני קשת בענן ויש לי חמישה צבעים first, second, third, fourth ו-fifth אדום, זהוב, ירוק, כחול ומג'נדה ואני רוצה שהמחלקה הזאת תהיה מחלקה שניתן להתייחס אליה

  9. 03:34

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

  10. 03:49

    דבר ראשון, בואו נבנה אובייקט ממנה. ריינבו, ריינבו שווה New Rainbow, ושימו לב שאין לנו שום בעיה לגשת ולהסתכל, ריינבו עם R קטנה כמובן, מהו ה-First Color, ה-Second Color וכו'.

  11. 04:11

    בואו נלך ל-First Color ול-Second Color של קשת בענן, נריץ ונראה Red וYellow. סבבה. אבל אני לא רוצה לעשות את זה בצורה כזאת.

  12. 04:26

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

  13. 04:52

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

  14. 05:12

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

  15. 05:38

    שניתן יהיה לעשות את זה לדוגמה על ידי הורשת i-enumerable ובייסיקלי אפשר להגיד שאתה קולקשה אם אתה ירשת את i-enumerable ופה בדוגמה הזאת אנחנו הולכים להיכנס יותר לעומק ולראות מה זה באמת אומר לרשת את i-numerable?

  16. 06:05

    אז דבר ראשון אני מממש או יורש את i-numerable ומממש את הפונקציה שבו, ואנחנו רואים שיש ל-i-numerable פונקציה אחת שנקראת get-numerator.

  17. 06:21

    אוקיי, פונקציית get-numerator מחזירה לנו אינטרפייס שנקרא i-numerator. מה זה בדיוק האינטרפייס הזה?

  18. 06:32

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

  19. 06:54

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

  20. 07:15

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

  21. 07:44

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

  22. 08:06

    for each עובדת בצורה שונה לגמרי. היא לא רצה על ידי אינדקס כמו לולאת for. היא צריכה את אותו אובייקט מוזר שנקרא אינומרטור שהאינטרפייס הזה אמור לתאר אותו.

  23. 08:23

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

  24. 08:55

    והיא יורשת את i-נומרטור. בואו נממש את i-נומרטור. שימו לב כמה דברים פנימיים יש בתוכו. ושימו לב גם שבנינו את הקלאס הזאת כ-Inner Class.

  25. 09:19

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

  26. 09:45

    זה ריסט. moveNext מזיזה את הנומרטור אחד קדימה ומחזירה true אם יש פריט לקריאה. Current מחזירה את אותו פריט שאנחנו רוצים לקרוא.

  27. 10:03

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

  28. 10:33

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

  29. 10:48

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

  30. 11:09

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

  31. 11:25

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

  32. 11:51

    והנה הקונסטרקטור שלנו מוכן. ריסט מחזירה בחזרה את הפוזישן ל-0. בואו נשים את ריסט פונקציה ראשונה move next וזאת הפונקציה הבאה בתור שאנחנו צריכים לממש צריכה לקדם את ה-position ב-1 ולהחזיר האם אנחנו מכילים או עדיין לא הגענו לסוף האוסף אנחנו נמצאים במצב שבו אנחנו יכולים להחזיר את אחד מפריטי האוסף מה אנחנו צריכים להחזיר האם ה-position

  33. 12:34

    קטן או שווה ל-rainbow נקודה total colors כמה צבעים סך הכל יש לנו בתוך ה-collection שלנו. אז הנה קידמנו את ה-position ב-1 ואמרנו האם יש לנו צבע או אין לנו צבע להחזיר.

  34. 12:59

    current זאת הפונקציה החשובה ומה שהיא אמורה לעשות זה להחזיר את הפריט כתלות ב-position. אז בואו קודם כל אפילו נעשה פה switch על ה-position ונתחיל לבדוק.

  35. 13:22

    אם אנחנו 1, 0 אנחנו לא יכולים להיות מפני שקודם כל יש קריאה למוב נקסט ורק אחר כך לקורנט אם מוב נקסט החזיר הטור. אם אנחנו 1, כל מה שאנחנו רוצים להחזיר זה את ה-first color, 2, 3, 4, 5. אם אנחנו 2 אנחנו רוצים להחזיר את ה-second color, פוזישן 3, 3rd color, פוזישן 4, 4th color, פוזישן 5, 5th color,

  36. 14:02

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

לקורס המלא: קורס תכנות מתקדם ב‑#C ודוט-נט

ההרצאה הקודמת: אוספים - Collections - חלק 3

ההרצאה הבאה: תרגילים על Collections

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

  • שאילתת LINQ - על אוספים רגילים

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

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