PracticU

Generics - חלק 3

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

Generics - חלק 3
בשיעור הזה בונים אוסף מוצרים שיורש מ-List<Product>, ומממשים את הממשקים הגנריים של המוצר כדי להימנע מקאסטים.
השלבים העיקריים
1. הבעיה בעטיפה: המחלקה Products עטפה ArrayList כדי לאפשר רק מוצרים. עטיפה כזאת דורשת לכתוב מחדש כל פעולה ולהעביר אותה לאוסף הפנימי.
2. ירושה מ-List של Product: במקום עטיפה המחלקה יורשת את List<Product>. הפונקציה Add מקבלת מוצר בלבד, וכל פעולות הרשימה זמינות בלי קוד נוסף. מוסיפים רק את הפעולות הלוגיות של האוסף.
3. פעולה ייעודית לאוסף: בתוך המחלקה מוגדרת פונקציה שמחשבת את מחיר הממוצע. מאחר שהמחלקה היא רשימה, הפונקציה רצה על האוסף עצמו ולא על שדה פנימי.
4. למה לא לרשת את ArrayList: בירושה לא אפשר לשנות חתימה. Add של ArrayList מקבל Object, ולכן הגדרת add חדש הייתה יוצרת העמסה ולא דריסה, והמתכנת היה יכול להכניס מחרוזת בכל זאת.
5. IComparable<Product>: הפונקציה CompareTo מקבלת Product ישירות, בלי קאסט מ-Object. יש IntelliSense מלא, ואין צורך לבדוק טיפוס.
6. IEquatable<Product>: הפונקציה Equals מקבלת Product, ו-Remove משתמש בה כשהוא מחפש את הפריט למחיקה. בשיעור מוכח הדבר בנקודת עצירה שנכנסת ל-Equals בזמן Remove.
7. יתרון הגרסה הגנרית: אין בוקסינג ואין קאסטים, והקוד קצר וברור יותר. לפי השיעור, Equals הבסיסית של מבנה (struct) משווה את השדות בעזרת reflection, ואילו המימוש הידני משווה רק את מה שהוגדר.
8. מיון: Sort משתמש ב-CompareTo כברירת מחדל. מיון לפי מחיר נעשה בעזרת השוואה נפרדת שמועברת ל-Sort.
בסיום השיעור ברור שירושה מ-List<T> יחד עם ממשקים גנריים נותנת אוסף מדויק, נקי וקל לתחזוקה.
השיעור הבא בקורס: Generics - חלק 4

פרקי ההרצאה: Generics - חלק 3

  1. 00:00

    סקירת מחלקת המוצר והמעטפת

  2. 02:59

    ירושה מ-List של Product

  3. 04:26

    הוספת פונקציות ייעודיות לאוסף

  4. 05:23

    מתי לרשת List ומתי לעטוף

  5. 07:04

    בטיחות טיפוס בהוספת מוצרים

  6. 08:51

    חישוב ממוצע מחירים באוסף

  7. 10:08

    INTERFACE-ים גנריים ב-.NET

  8. 11:22

    מימוש IComparable גנרי

תמלול ההרצאה: Generics - חלק 3

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

  1. 00:05

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

  2. 00:36

    אקזיסטינג אייטם. ונאתר את ה-collection שבנינו, בואו נלך לתיקיית ה-collections, ובנינו כאן איזשהו אוסף שמכיל את המחלקה product.

  3. 01:03

    בואו ניגש, האמת שהיה לנו אחד אחר, ה-release trapper, זה היה יותר מתאים. היה לנו product ו-products וזה מה שאנחנו רוצים לבנות. בואו נסתכל על ה-product.

  4. 01:19

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

  5. 01:28

    יש לה קונסטרקטור, two-string, equals, get-hash-code, compare-to. יש לנו פה כל מיני מחלקות שמאפשרות לבצע מיונים אחרים.

  6. 01:37

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

  7. 02:03

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

  8. 02:26

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

  9. 02:38

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

  10. 02:49

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

  11. 03:01

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

  12. 03:23

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

  13. 03:47

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

  14. 03:58

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

  15. 04:10

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

  16. 04:22

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

  17. 04:40

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

  18. 04:57

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

  19. 05:37

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

  20. 05:56

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

  21. 06:23

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

  22. 06:54

    הנה products, myproducts שווה new products. כאשר אנחנו פונים ל-myproducts.ad קודם כל שימו לב שבכלל יש לנו פה את כל הפונקציות שקיימות בתוך ליסט.

  23. 07:12

    אם אנחנו פונים ל-ad אנחנו רואים ש-ad אומרת לנו תביאו לנו מוצר אחד ויחיד. אל תביאו לנו person, אל תביאו לנו string, תביאו לנו רק מוצר. בואו נפתח אובייקט new product.

  24. 07:26

    ונגדיר לו איזשהו קוד, נגדיר לו איזשהו שם, ונגדיר לו איזשהו מחיר. נוסיף עוד שניים כאלה, יש לנו פה סדרה של מחירים נוספים.

  25. 08:13

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

  26. 08:36

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

  27. 08:55

    והיתרון השני, שהוא לא פחות חשוב, שעכשיו אנחנו יכולים להגיע לפעילויות ספציפיות שאנחנו צריכים, לדוגמה, get average price.

  28. 09:09

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

  29. 09:33

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

  30. 09:56

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

  31. 10:30

    לבצע מיון וחיפוש וכולי. אבל אם אנחנו מסתכלים על iCompareable לדוגמה אנחנו רואים שהפונקציה שלו Compare to מקבלת Object פה אנחנו חוזרים לעבוד עם Object אז מה הקונספט של הג'נריק?

  32. 10:48

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

  33. 11:08

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

  34. 11:27

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

  35. 11:45

    אז אני כרגע אלחץ control צדיק סופית או control נקודה, אתם יכולים לקרוא לזה implement interface i comparable של product ובואו נסתכל פה למטה נראה שהתווספה לנו פונקציה גם היא נקראת compare to אבל היא לא מקבלת object היא מקבלת product.

  36. 12:06

    בואו ניקח את הפונקציה הזאת ונחליף איתה את הפונקציה הקודמת נשים אותה קודם כל כאן נסתכל על הפונקציה הקודמת הפונקציה הקודמת שבנינו פעם של iCompatible קיבלה Object וכל מה שהיא עשתה זה השוותה בין ה-Name הנוכחי ל-Name של האובייקט שהתקבל

  37. 12:25

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

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

ההרצאה הקודמת: Generics - חלק 2

ההרצאה הבאה: Generics - חלק 4

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

  • Generics

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

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