שלום,
נראה שכבר הכרתם את אאוריקה. בטח כבר גיליתם כאן דברים מדהימים, אולי כבר שאלתם שאלות וקיבלתם תשובות טובות.
נשמח לראות משהו מכם בספר האורחים שלנו: איזו מילה טובה, חוות דעת, עצה חכמה לשיפור או כל מה שיש לכם לספר לנו על אאוריקה, כפי שאתם חווים אותה.
»
«
תכנות מונחה עצמים
מהו תכנות מונחה עצמים?
תכנות מונחה עצמים (Object Oriented Programming) מחקה את החשיבה האנושית. אנו כבני האדם נוטים לסווג את כל מה שבו בקטגוריות. כל עצם בעולם נמצא בקטגוריות מסוימות, שחוסכות לנו את הצורך לציין פרטים שמשותפים לקטגוריות הללו. אם נתאר מכונית מדגם מסוים, נוכל לתאר רק את מה שייחודי לה, כי תכונות כמו מנוע, או 4 גלגלים, ברורות מעצם זה שהיא משתייכת לקטגוריית המכוניות.
בדומה לכך, התכנות מונחה העצמים במדעי המחשב מאופיין בביצוע פעולות על עצמים ממוחשבים שנקראים "אובייקטים" (Objects). זהו סגנון תכנות יעיל מאוד, המאפשר קוד מאורגן יותר, קצר משמעותית ופחות חוזר על עצמו ומשום כך גם חסכוני בקידוד ובשגיאות אפשריות.
שפות כמו ++C ו-TypeScript הציעו הרחבות מבוססות אובייקטים לשפות כמו C ו-JavaScript, מה שהפך את ההגירה אליהן קלה יחסית, מהשפות חפרוצדורליות, חסרות האובייקטים.
בתכנות מבוסס אובייקטים, שבראשי תיבות קוראים לו OOP, מקבצים את כל המשתנים והפונקציות של עניין מסוים אל תוך מחלקה (class).
בדומה לצורת החשיבה שלנו על העולם, האובייקטים בתכנות OOP מתייחסים ומתקשרים אחד עם השני, כשכל אובייקט מתאר מהו ומה הוא יכול לעשות, אבל הידיעה שלנו למי הוא דומה או משתייך, חוסכת הרבה מידע מיותר. אם נראה נשר בשמיים, נזהה מיד שהוא עוף ומכאן צריך רק לדעת מה מיוחד בו לעומת העופות ככלל, בעוד שכנפיים, מקור או נוצות הם ברורים מאליהם.
#יתרונות
יתרונו הגדול של תכנות OOP הוא בכך שאנו מתכנתים בו אובייקטים ומגדירים ביניהם פעולות ובכך מארגנים ומפשטים את הקוד ועושים את העבודה איתו קלה, מדויקת ויעילה יותר.
אבל יש עוד משהו טוב בתכנות כזה. תכנות מונחה עצמים היא שיטה המחקה את החשיבה האנושית. היא אינטואיטיבית וקרובה יותר לדרך החשיבה בה רובנו חושבים ומטפלים בבעיות שבפניהן אנו ניצבים.
למעשה, גם בתכנות וגם בחיים, סידור וארגון המידע בצורה כזו מקלים את השליטה בכמות המידע העצומה שבה אנו מוצפים ומאפשרים לסדר את המידע הזה במוחנו ובמחשב, בצורה נוחה ויעילה מאוד.
באופן כזה ניתן לשלוף ולזהות מידע בקלות, כל אימת שנרצה ולנהל אותו היטב. גם העדכונים והשינויים בקוד כזה הם פשוטים הרבה יותר ומונעים שגיאות.
ניתן לומר שבפרויקטים גדולים, המבוססים על Frameworks קיימים ומעסיקים מספר מתכנתים, הקידוד בתכנות מונחה עצמים מתאים במיוחד ואולי אף הכרחי.
#עקרונות
הפשטה של הנתונים (Data Abstraction) - המתכנת מתרכז במאפיינים הרלוונטיים של העצם.
כימוס (Encapsulation)- הסתרה של פרטי המימוש מהמשתמש בעצם.
מודולריות (Modularity) - מפרידים עצמים ליחידות נושא.
היררכיה, או הורשה (Inheritance) - מגדירים יחסים היררכיים בין העצמים ואובייקט יורש תכונות מהמחלקה שלו.
טיפוסיות חזקה (Strong Typing) - מניעה של בלבול או ערבוב בין טיפוסי עצמים שונים זה מזה.
#האובייקט
בשיטת ה-Object Oriented Programming כל דבר הוא אובייקט.
בתכנות מונחה עצמים מגדירים מחלקות (Classes). לאחר הגדרת מחלקה אפשר לייצר מופעים שלה, שנקראים אובייקטים (Objects).
כך למשל מתכננים ומייצרים מטוס חדש, מחלקים ידועים ומוכרים המרכיבים אותו, שעל גבם תבוא החדשנות של הדגם החדש. איש בימינו לא מתחיל לייצר מטוס מכלום, כי יש הגדרות מוכרות ומוכחות למרכיבים העיקריים שמייצרים מטוס וממרכיבים אלה הוא ייבנה.
כך מחליף סדר וארגון יעיל את הקוד המשוטח, המסורבל והארוך של התכנות הרגיל של פעם (הפרוצדורלי למי שמכיר). במקום רצף הפקודות הענקי והמבולגן יחסית שמאפיין תכנות פשוט, עם המון קודים שחוזרים על עצמם שוב ושוב, מתכננים מחלקה מרכזית לכל דבר וממנה מייצרים בקלות את האובייקטים שנגזרים ממנה, גם עם מאפייניהם היחודיים.
#הגדרות
אם תכנות מונחה עצמים מתמקד בפיתוח של עצמים וביצירת פעולות ביניהם, אז כדאי שנגדיר כמה דברים:
עצם (Object) הוא מעין קפסולת קוד שבתוכה אנו מכניסים שילוב של מידע ופעולות. לרוב זו תהיה מחלקה (Class).
המידע במחלקה ייקרא "תכונות" (Attributes). התכונות שיוצגו הן רק אלה שרלוונטיות לפיתוח או לאפליקציה המסוימת שעליה אנו עובדים.
הפעולות באובייקט שנראות כמו פונקציות ייקראו "שיטות" או "מתודות" (methods). השיטות או המתודות הללו מתארות את מה שאובייקט במחלקה מסוגל לעשות.
ההודעות (Messages) הן מה שמניע את הפעולות. כי השיטות הן בגדר פוטנציאל ובלי הודעה לא תופעל שום שיטה.
#דוגמה
ניתן לראות אובייקט כמו String, בעברית מחרוזת, כשילוב של מידע, שהוא תוכן התווים שמהווה את המחרוזת. יוגדרו גם הפעולות שניתן יהיה לעשות על המחרוזת, כמו הדפסה, חיתוך רשימה, המרה לאותיות גדולות באנגלית וכדומה.
עוד דוגמה? - בתכנות מונחה עצמים ניתן לרשום עובדים למערכת מסוימת. אבל במקום לשמור בנפרד את הנתונים של כל אחד מהם (שם, גיל, תפקיד, השכלה, התמחות וכו') ניצור אובייקט של עובד. מהמחלקה הזו נגזור המון עובדים, על מאפייניהם ותכונותיהם ועל המידע הזה נוכל לבצע פעולות שונות, כמו הדפסה, שאילתות, חיתוכים ועוד.
#סיכום
בתכנות מבוסס עצמים יש תבניות שמתארות סוג של יישות, כמו בחיים עם ישויות כמו מכוניות, בני אדם וכדומה. התבניות הללו נקראות "מחלקות" (Class). תחת ה-Class כהגדרה מרכזית, עם ריכוז של מאפיינים (שהם בעצם משתנים) ומתודות (שהן פעולות שניתן לעשות במחלקה), כל אובייקט שיווצר תחת המחלקה ישאב אותם ממנה.
עוד על המחלקה בתגית "מחלקות".
הנה הסבר התכנות מונחה העצמים (עברית):
https://youtu.be/l6M3qp5Ykus
הסבר לילדים:
https://youtu.be/X3cFiJnxUBY
ההבדל בין תכנות פרוצדורלי של פעם לתכנות מונחה עצמים (מתורגם):
https://youtu.be/OEfSFrk_KEI
4 עמודי התכנות מונחה העצמים:
https://youtu.be/pTB0EiLXUC8
ויסודות התכנות מונחה העצמים עם הדגמות בשפת פייתון (עברית):
https://youtu.be/odRYxQLGb2U?long=yes
תכנות מונחה עצמים (Object Oriented Programming) מחקה את החשיבה האנושית. אנו כבני האדם נוטים לסווג את כל מה שבו בקטגוריות. כל עצם בעולם נמצא בקטגוריות מסוימות, שחוסכות לנו את הצורך לציין פרטים שמשותפים לקטגוריות הללו. אם נתאר מכונית מדגם מסוים, נוכל לתאר רק את מה שייחודי לה, כי תכונות כמו מנוע, או 4 גלגלים, ברורות מעצם זה שהיא משתייכת לקטגוריית המכוניות.
בדומה לכך, התכנות מונחה העצמים במדעי המחשב מאופיין בביצוע פעולות על עצמים ממוחשבים שנקראים "אובייקטים" (Objects). זהו סגנון תכנות יעיל מאוד, המאפשר קוד מאורגן יותר, קצר משמעותית ופחות חוזר על עצמו ומשום כך גם חסכוני בקידוד ובשגיאות אפשריות.
שפות כמו ++C ו-TypeScript הציעו הרחבות מבוססות אובייקטים לשפות כמו C ו-JavaScript, מה שהפך את ההגירה אליהן קלה יחסית, מהשפות חפרוצדורליות, חסרות האובייקטים.
בתכנות מבוסס אובייקטים, שבראשי תיבות קוראים לו OOP, מקבצים את כל המשתנים והפונקציות של עניין מסוים אל תוך מחלקה (class).
בדומה לצורת החשיבה שלנו על העולם, האובייקטים בתכנות OOP מתייחסים ומתקשרים אחד עם השני, כשכל אובייקט מתאר מהו ומה הוא יכול לעשות, אבל הידיעה שלנו למי הוא דומה או משתייך, חוסכת הרבה מידע מיותר. אם נראה נשר בשמיים, נזהה מיד שהוא עוף ומכאן צריך רק לדעת מה מיוחד בו לעומת העופות ככלל, בעוד שכנפיים, מקור או נוצות הם ברורים מאליהם.
#יתרונות
יתרונו הגדול של תכנות OOP הוא בכך שאנו מתכנתים בו אובייקטים ומגדירים ביניהם פעולות ובכך מארגנים ומפשטים את הקוד ועושים את העבודה איתו קלה, מדויקת ויעילה יותר.
אבל יש עוד משהו טוב בתכנות כזה. תכנות מונחה עצמים היא שיטה המחקה את החשיבה האנושית. היא אינטואיטיבית וקרובה יותר לדרך החשיבה בה רובנו חושבים ומטפלים בבעיות שבפניהן אנו ניצבים.
למעשה, גם בתכנות וגם בחיים, סידור וארגון המידע בצורה כזו מקלים את השליטה בכמות המידע העצומה שבה אנו מוצפים ומאפשרים לסדר את המידע הזה במוחנו ובמחשב, בצורה נוחה ויעילה מאוד.
באופן כזה ניתן לשלוף ולזהות מידע בקלות, כל אימת שנרצה ולנהל אותו היטב. גם העדכונים והשינויים בקוד כזה הם פשוטים הרבה יותר ומונעים שגיאות.
ניתן לומר שבפרויקטים גדולים, המבוססים על Frameworks קיימים ומעסיקים מספר מתכנתים, הקידוד בתכנות מונחה עצמים מתאים במיוחד ואולי אף הכרחי.
#עקרונות
הפשטה של הנתונים (Data Abstraction) - המתכנת מתרכז במאפיינים הרלוונטיים של העצם.
כימוס (Encapsulation)- הסתרה של פרטי המימוש מהמשתמש בעצם.
מודולריות (Modularity) - מפרידים עצמים ליחידות נושא.
היררכיה, או הורשה (Inheritance) - מגדירים יחסים היררכיים בין העצמים ואובייקט יורש תכונות מהמחלקה שלו.
טיפוסיות חזקה (Strong Typing) - מניעה של בלבול או ערבוב בין טיפוסי עצמים שונים זה מזה.
#האובייקט
בשיטת ה-Object Oriented Programming כל דבר הוא אובייקט.
בתכנות מונחה עצמים מגדירים מחלקות (Classes). לאחר הגדרת מחלקה אפשר לייצר מופעים שלה, שנקראים אובייקטים (Objects).
כך למשל מתכננים ומייצרים מטוס חדש, מחלקים ידועים ומוכרים המרכיבים אותו, שעל גבם תבוא החדשנות של הדגם החדש. איש בימינו לא מתחיל לייצר מטוס מכלום, כי יש הגדרות מוכרות ומוכחות למרכיבים העיקריים שמייצרים מטוס וממרכיבים אלה הוא ייבנה.
כך מחליף סדר וארגון יעיל את הקוד המשוטח, המסורבל והארוך של התכנות הרגיל של פעם (הפרוצדורלי למי שמכיר). במקום רצף הפקודות הענקי והמבולגן יחסית שמאפיין תכנות פשוט, עם המון קודים שחוזרים על עצמם שוב ושוב, מתכננים מחלקה מרכזית לכל דבר וממנה מייצרים בקלות את האובייקטים שנגזרים ממנה, גם עם מאפייניהם היחודיים.
#הגדרות
אם תכנות מונחה עצמים מתמקד בפיתוח של עצמים וביצירת פעולות ביניהם, אז כדאי שנגדיר כמה דברים:
עצם (Object) הוא מעין קפסולת קוד שבתוכה אנו מכניסים שילוב של מידע ופעולות. לרוב זו תהיה מחלקה (Class).
המידע במחלקה ייקרא "תכונות" (Attributes). התכונות שיוצגו הן רק אלה שרלוונטיות לפיתוח או לאפליקציה המסוימת שעליה אנו עובדים.
הפעולות באובייקט שנראות כמו פונקציות ייקראו "שיטות" או "מתודות" (methods). השיטות או המתודות הללו מתארות את מה שאובייקט במחלקה מסוגל לעשות.
ההודעות (Messages) הן מה שמניע את הפעולות. כי השיטות הן בגדר פוטנציאל ובלי הודעה לא תופעל שום שיטה.
#דוגמה
ניתן לראות אובייקט כמו String, בעברית מחרוזת, כשילוב של מידע, שהוא תוכן התווים שמהווה את המחרוזת. יוגדרו גם הפעולות שניתן יהיה לעשות על המחרוזת, כמו הדפסה, חיתוך רשימה, המרה לאותיות גדולות באנגלית וכדומה.
עוד דוגמה? - בתכנות מונחה עצמים ניתן לרשום עובדים למערכת מסוימת. אבל במקום לשמור בנפרד את הנתונים של כל אחד מהם (שם, גיל, תפקיד, השכלה, התמחות וכו') ניצור אובייקט של עובד. מהמחלקה הזו נגזור המון עובדים, על מאפייניהם ותכונותיהם ועל המידע הזה נוכל לבצע פעולות שונות, כמו הדפסה, שאילתות, חיתוכים ועוד.
#סיכום
בתכנות מבוסס עצמים יש תבניות שמתארות סוג של יישות, כמו בחיים עם ישויות כמו מכוניות, בני אדם וכדומה. התבניות הללו נקראות "מחלקות" (Class). תחת ה-Class כהגדרה מרכזית, עם ריכוז של מאפיינים (שהם בעצם משתנים) ומתודות (שהן פעולות שניתן לעשות במחלקה), כל אובייקט שיווצר תחת המחלקה ישאב אותם ממנה.
עוד על המחלקה בתגית "מחלקות".
הנה הסבר התכנות מונחה העצמים (עברית):
https://youtu.be/l6M3qp5Ykus
הסבר לילדים:
https://youtu.be/X3cFiJnxUBY
ההבדל בין תכנות פרוצדורלי של פעם לתכנות מונחה עצמים (מתורגם):
https://youtu.be/OEfSFrk_KEI
4 עמודי התכנות מונחה העצמים:
https://youtu.be/pTB0EiLXUC8
ויסודות התכנות מונחה העצמים עם הדגמות בשפת פייתון (עברית):
https://youtu.be/odRYxQLGb2U?long=yes
מהי מחלקה בתכנות מונחה עצמים?
אבני בניין עיקריות ומשמעותיות במיוחד לכתיבת קוד מובנה בתכנות מונחה עצמים, הן ה-Classes, בעברית "מחלקות". המחלקות מאפשרות לכתוב תכניות מודולריות, יעילות וחסכוניות מאוד בקוד.
המחלקה (class) היא סוג של מנגנון להגדרה של טיפוסים בתכנית. יש בה אוסף של נתונים ולצידם מבחר פעולות שאפשר לעשות עליהם. יש בה שני מרכיבים עיקריים. הראשון כולל את השדות, סוג של משתנים אוגרי נתונים. השני כולל מתודות או שיטות, שהן פונקציות הפועלות על המשתנים הללו.
המחלקה משפרת משמעותית את המבנה של כל תכנית מחשב. במקום לכתוב המון קוד שחוזר על עצמו, מסורבל, ארוך, בעל סיכויים גדולים לטעויות ובחלקו הגדול מיותר ולא יעיל, מהווה המחלקה שיטת תכנות שיוצרת קוד יעיל ופשוט.
#בואו נבחן את העולם לרגע
בואו נביט רגע על ציפורים. לכל הציפורים יש מאפיינים משותפים, כמו מקור, זנב וכנפיים. אבל האם לכולן יש למשל את אותן כנפיים? - התשובה היא כמובן שלא. המאפיינים אם כך, הם בעצם סוג של משתנים (Variables), שיכולים להשתנות מסוג לסוג ואפילו בין ציפורים מסוג זהה. אם נביט על העורב למשל, הרי שהוא אובייקט (Object), כלומר פרט במחלקה הזו של הציפורים. מכאן שיש לו נוצות.
הנוצות בדוגמה של הציפורים הן מאפיינים (properties). לכל החברים במחלקה יש מאפיינים משותפים, שנוצות הוא אחד מהם.
אבל האם כל המאפיינים הללו זהים אצל כולם? - התשובה היא לא. הגדרת המחלקה לא אומרת למשל את הצבע של הנוצות של חבריה.
בתכנות מונחה עצמים הצבע הוא בעצם משתנה (Variable), שיכול לקבל ערכים שונים, כמו הערך (Value) שחור (Black) אצל האובייקט עורב או ורוד אצל אובייקט הפלמינגו.
זוכרים את המאפיינים? - בתכנות מונחה עצמים המשתנה הזה של צבע הנוצה נקרא "מאפיין" (Property). אז ה-Property, כלומר משתנה צבע הנוצה, מקבל אצל העורב ערך (Value) של... שחור.
#התבלבלתם? - עוד דוגמה...
בואו נחשוב על החיים, כשאנו מתארים את המכונית שקנינו. איננו נדרשים בכל פעם לתאר מהי מכונית, איך היא בנויה, כיצד היא נוסעת, עוצרת, ננעלת וכדומה - אנחנו פשוט מספרים שקנינו מכונית פורשה מהירה וחזקה במיוחד. זה מספיק כדי שהשומעים יבינו המון. את המשמעות הכללית של מהי מכונית הם הרי מכירים מזמן. הם יודעים המון על מכוניות. מחלקה חוסכת את ה"חפירה", כלומר את אותו מידע מיותר שניתן היה לפרט בכל פעם שמדברים על מכונית.
#אז מהי מחלקה?
כמו המושג "מכונית", המחלקה היא אבטיפוס של אובייקטים. מגדירים אותה פעם אחת ואז ניתן ליצור ממנה אינסוף אובייקטים.
כל מחלקה מכילה תכונות (attributes) או מאפיינים (properties) ושיטות או מתודות (methods).
המחלקה היא התבנית שממנה בנויים האובייקטים השונים. היחס שבין מחלקה לאובייקטים שלה הוא כמו היחס שבין שרטוט של בית לבתים שנבנים ממנו. השרטוט הוא לא הבית, אבל בית נבנה על פיו.
#אז איך זה יעבוד במחלקה "מכונית"...
יש בהגדרת המחלקה את התכונות, או הפרופרטיז של האובייקט (למשל הדגם, המידה, הצבע של המכונית), אבל בלי הערכים הספציפיים (כמו פג'ו, אקסטרה לארג', צבע כחול).
יש במחלקה גם את השיטות (Methods) של האובייקט, כמו נסיעה, בלימה וכו'.
בשפת תוכנה מונחית עצמים יש המון קלאסז מוכנים, אבל גם המתכנת יכול ליצור לעצמו עצמים חדשים משל עצמו. זה הכוח של התכנות מונחה האובייקטים.
#המחלקה כבלופרינט
מחלקה (Class) בשפת תכנות מונחית עצמים היא סוג של בלופרינט (Blueprint), משהו בין תכנית אב לאבטיפוס בעולם האמיתי.
בלופרינטס הם שרטוטים המשמשים כתכניות להקמה של מבנים. כך יכולה אותה תכנית לשמש לבנייה של בניינים שונים, בעלי מאפיינים משותפים שהוגדרו באותה ארכיטקטורה בסיסית., אך גם דברים ייחודיים של כל אחד לעצמו, שאין למקביליו, שנבנו מאותו בלופרינט.
כל בית שנבנה באמצעות התכנית הזו יכלול את החדרים, אך בבית אחד הקירות יכולים להיות צבועים בצהוב ובאחר הם לבנים. כלומר הם ייחודיים מצד אחד ומצד שני הם עדיין קשורים באמצעות התוכנית. הבתים הללו הם האובייקטים של המחלקה של "מבנים" או "בתים".
#אובייקט הוא יחידה של מחלקה
אם המחלקה בשפת תכנות היא תכנית שממנה ניתן ליצור אובייקטים, אז האובייקט הוא מקרה פרטי, או יחידה של מחלקה. אם הקלאס הוא רעיון, האובייקט הוא הממשות שלו, משהו מעין פיזיקלי שנוצר מקלאס.
המשותף לכל האובייקטים שנוצרו על בסיס מחלקה כלשהי הוא שלכולם אותן תכונות (Properties) וכולם יכולים לבצע פעולות זהות (Methods). לדוגמה, לכל המכוניות יש מנוע וצבע משלהן וכולן יוכלו לנסוע ולבלום.
הגדרת הקלאס מאפשרת לפרט את מאפייני האובייקט ולציין גם את השיטות והפעולות בהן יכול האובייקט להשתמש. המחלקה, כלומר הקלאס (Class), קובעת איך כל אובייקט נראה ואיך הוא מתנהג ואחרי כן ניתן לעשות עליו מניפולציות, באמצעות ערכים (Values) ספציפיים.
#תיאורטית...
הקלאס הוא מרכיב המאחסן משתנים ופונקציות. בקלאסז נשתמש לאחסן את הדאטה ואת הפונקציונליות שרלוונטית לדאטה הזו, כלומר המרכיבים הלוגיים שלה.
הקלאס הוא, אם כן, קטע תוכנה שמגדיר את כל המידע והפונקציות שעובדות עם המידע. מחלקה מכילה אוסף המאוגד במבנה לוגי משותף, של משתנים (פרופרטיז), מאפיינים ופונקציות (מתודות) הפועלים יחד.
כדי להבדיל ביניהם לבין משתנים ופונקציות רגילים, נוהגים לקרוא למשתנה בתוך מחלקה "תכונה" (Property) ולפונקציה בתוך מחלקה קוראים "שיטה" (Method).
#דוגמה אחרונה
אם מחלקה או class היא blueprint, תכנית-אב לאובייקט חדש, אז בואו נגדיר מחלקה של "מטוס נוסעים".
אובייקט שנוצר ממנו הוא ההתממשות הספציפית של רעיון "מטוס הנוסעים". מטוס בואינג דרימליינר, בצבע לבן, עם מנוע סילון מדגם 234 הוא אובייקט, עם מאפיינים וערכים משלו.
הסבר של המאפיינים וכיצד הם משתייכים למחלקות:
https://youtu.be/tE2e9SXLyQs?end=2m14s
סרטון שמסביר את הגדרת המחלקות והשימוש בהן בשפת Java:
https://youtu.be/L5XI50A1az4
למדו על המחלקה בתכנות בשפת פייתון:
https://youtu.be/ZZCnfRmxq6s
והסבר על הגדרת מחלקות ב-Javascript, ביחד עם עוד דברים:
https://youtu.be/Q0IFtEB1RH4
אבני בניין עיקריות ומשמעותיות במיוחד לכתיבת קוד מובנה בתכנות מונחה עצמים, הן ה-Classes, בעברית "מחלקות". המחלקות מאפשרות לכתוב תכניות מודולריות, יעילות וחסכוניות מאוד בקוד.
המחלקה (class) היא סוג של מנגנון להגדרה של טיפוסים בתכנית. יש בה אוסף של נתונים ולצידם מבחר פעולות שאפשר לעשות עליהם. יש בה שני מרכיבים עיקריים. הראשון כולל את השדות, סוג של משתנים אוגרי נתונים. השני כולל מתודות או שיטות, שהן פונקציות הפועלות על המשתנים הללו.
המחלקה משפרת משמעותית את המבנה של כל תכנית מחשב. במקום לכתוב המון קוד שחוזר על עצמו, מסורבל, ארוך, בעל סיכויים גדולים לטעויות ובחלקו הגדול מיותר ולא יעיל, מהווה המחלקה שיטת תכנות שיוצרת קוד יעיל ופשוט.
#בואו נבחן את העולם לרגע
בואו נביט רגע על ציפורים. לכל הציפורים יש מאפיינים משותפים, כמו מקור, זנב וכנפיים. אבל האם לכולן יש למשל את אותן כנפיים? - התשובה היא כמובן שלא. המאפיינים אם כך, הם בעצם סוג של משתנים (Variables), שיכולים להשתנות מסוג לסוג ואפילו בין ציפורים מסוג זהה. אם נביט על העורב למשל, הרי שהוא אובייקט (Object), כלומר פרט במחלקה הזו של הציפורים. מכאן שיש לו נוצות.
הנוצות בדוגמה של הציפורים הן מאפיינים (properties). לכל החברים במחלקה יש מאפיינים משותפים, שנוצות הוא אחד מהם.
אבל האם כל המאפיינים הללו זהים אצל כולם? - התשובה היא לא. הגדרת המחלקה לא אומרת למשל את הצבע של הנוצות של חבריה.
בתכנות מונחה עצמים הצבע הוא בעצם משתנה (Variable), שיכול לקבל ערכים שונים, כמו הערך (Value) שחור (Black) אצל האובייקט עורב או ורוד אצל אובייקט הפלמינגו.
זוכרים את המאפיינים? - בתכנות מונחה עצמים המשתנה הזה של צבע הנוצה נקרא "מאפיין" (Property). אז ה-Property, כלומר משתנה צבע הנוצה, מקבל אצל העורב ערך (Value) של... שחור.
#התבלבלתם? - עוד דוגמה...
בואו נחשוב על החיים, כשאנו מתארים את המכונית שקנינו. איננו נדרשים בכל פעם לתאר מהי מכונית, איך היא בנויה, כיצד היא נוסעת, עוצרת, ננעלת וכדומה - אנחנו פשוט מספרים שקנינו מכונית פורשה מהירה וחזקה במיוחד. זה מספיק כדי שהשומעים יבינו המון. את המשמעות הכללית של מהי מכונית הם הרי מכירים מזמן. הם יודעים המון על מכוניות. מחלקה חוסכת את ה"חפירה", כלומר את אותו מידע מיותר שניתן היה לפרט בכל פעם שמדברים על מכונית.
#אז מהי מחלקה?
כמו המושג "מכונית", המחלקה היא אבטיפוס של אובייקטים. מגדירים אותה פעם אחת ואז ניתן ליצור ממנה אינסוף אובייקטים.
כל מחלקה מכילה תכונות (attributes) או מאפיינים (properties) ושיטות או מתודות (methods).
המחלקה היא התבנית שממנה בנויים האובייקטים השונים. היחס שבין מחלקה לאובייקטים שלה הוא כמו היחס שבין שרטוט של בית לבתים שנבנים ממנו. השרטוט הוא לא הבית, אבל בית נבנה על פיו.
#אז איך זה יעבוד במחלקה "מכונית"...
יש בהגדרת המחלקה את התכונות, או הפרופרטיז של האובייקט (למשל הדגם, המידה, הצבע של המכונית), אבל בלי הערכים הספציפיים (כמו פג'ו, אקסטרה לארג', צבע כחול).
יש במחלקה גם את השיטות (Methods) של האובייקט, כמו נסיעה, בלימה וכו'.
בשפת תוכנה מונחית עצמים יש המון קלאסז מוכנים, אבל גם המתכנת יכול ליצור לעצמו עצמים חדשים משל עצמו. זה הכוח של התכנות מונחה האובייקטים.
#המחלקה כבלופרינט
מחלקה (Class) בשפת תכנות מונחית עצמים היא סוג של בלופרינט (Blueprint), משהו בין תכנית אב לאבטיפוס בעולם האמיתי.
בלופרינטס הם שרטוטים המשמשים כתכניות להקמה של מבנים. כך יכולה אותה תכנית לשמש לבנייה של בניינים שונים, בעלי מאפיינים משותפים שהוגדרו באותה ארכיטקטורה בסיסית., אך גם דברים ייחודיים של כל אחד לעצמו, שאין למקביליו, שנבנו מאותו בלופרינט.
כל בית שנבנה באמצעות התכנית הזו יכלול את החדרים, אך בבית אחד הקירות יכולים להיות צבועים בצהוב ובאחר הם לבנים. כלומר הם ייחודיים מצד אחד ומצד שני הם עדיין קשורים באמצעות התוכנית. הבתים הללו הם האובייקטים של המחלקה של "מבנים" או "בתים".
#אובייקט הוא יחידה של מחלקה
אם המחלקה בשפת תכנות היא תכנית שממנה ניתן ליצור אובייקטים, אז האובייקט הוא מקרה פרטי, או יחידה של מחלקה. אם הקלאס הוא רעיון, האובייקט הוא הממשות שלו, משהו מעין פיזיקלי שנוצר מקלאס.
המשותף לכל האובייקטים שנוצרו על בסיס מחלקה כלשהי הוא שלכולם אותן תכונות (Properties) וכולם יכולים לבצע פעולות זהות (Methods). לדוגמה, לכל המכוניות יש מנוע וצבע משלהן וכולן יוכלו לנסוע ולבלום.
הגדרת הקלאס מאפשרת לפרט את מאפייני האובייקט ולציין גם את השיטות והפעולות בהן יכול האובייקט להשתמש. המחלקה, כלומר הקלאס (Class), קובעת איך כל אובייקט נראה ואיך הוא מתנהג ואחרי כן ניתן לעשות עליו מניפולציות, באמצעות ערכים (Values) ספציפיים.
#תיאורטית...
הקלאס הוא מרכיב המאחסן משתנים ופונקציות. בקלאסז נשתמש לאחסן את הדאטה ואת הפונקציונליות שרלוונטית לדאטה הזו, כלומר המרכיבים הלוגיים שלה.
הקלאס הוא, אם כן, קטע תוכנה שמגדיר את כל המידע והפונקציות שעובדות עם המידע. מחלקה מכילה אוסף המאוגד במבנה לוגי משותף, של משתנים (פרופרטיז), מאפיינים ופונקציות (מתודות) הפועלים יחד.
כדי להבדיל ביניהם לבין משתנים ופונקציות רגילים, נוהגים לקרוא למשתנה בתוך מחלקה "תכונה" (Property) ולפונקציה בתוך מחלקה קוראים "שיטה" (Method).
#דוגמה אחרונה
אם מחלקה או class היא blueprint, תכנית-אב לאובייקט חדש, אז בואו נגדיר מחלקה של "מטוס נוסעים".
אובייקט שנוצר ממנו הוא ההתממשות הספציפית של רעיון "מטוס הנוסעים". מטוס בואינג דרימליינר, בצבע לבן, עם מנוע סילון מדגם 234 הוא אובייקט, עם מאפיינים וערכים משלו.
הסבר של המאפיינים וכיצד הם משתייכים למחלקות:
https://youtu.be/tE2e9SXLyQs?end=2m14s
סרטון שמסביר את הגדרת המחלקות והשימוש בהן בשפת Java:
https://youtu.be/L5XI50A1az4
למדו על המחלקה בתכנות בשפת פייתון:
https://youtu.be/ZZCnfRmxq6s
והסבר על הגדרת מחלקות ב-Javascript, ביחד עם עוד דברים:
https://youtu.be/Q0IFtEB1RH4
מהי פונקציה בתכנות?
מכירים את זה שאתם עושים שוב ושוב, כל יום או כל כמה שעות את אותה פעולה וזה נראה לכם לא הגיוני?
גם מתכנתים לא אוהבים לעשות שוב ושוב את אותה פעולה. לכן הם למשל משתמשים בלולאות (Loops). אבל יש מרכיב שחוסך עוד יותר עבודה וכתיבת קוד מיותר. כי מתכנתים אוהבים לשמור את הקוד שלהם DRY, קיצור של "don’t repeat yourself".
לרכיב מקצר העבודה הזה קוראים פונקציה (Function). הפונקציה היא פלא של ייעול. כל מטרתה היא "לקודד פעם אחת, להשתמש הרבה פעמים".
#אבל מהי פונקציה?
פונקציה היא קוד שמבצע פעולה. הרעיון בכתיבת פונקציה הוא לכתוב פעם אחת קוד והוא יחליף את הצורך לכתוב פעולות דומות שוב ושוב, במקומות שונים בתוכנה.
דמייני שאת מתכנתת פעם אחת קטע של קוד ואחרי כן קוראת לו בתוכנה, בכל פעם שצריך שהוא יבצע את תפקידו.
מדהים לא?
ואכן, פונקציה בתכנות היא מרכיב פשוט אבל משמעותי מאוד, המקל את הקידוד ואת הארגון הנכון של תכנית מחשב. כך הוא מקצר את הקוד, חוסך זמן ומקטין את האפשרויות לשגיאות.
כמו במכשיר מיקרוגל או במכונית, בפונקציה משתמשים בכל פעם שרוצים לבצע את הפעולה שהיא יודעת ותוכנתה לעשות. מכונית תסיע אותנו ומיקרו יחמם לנו או יפשיר את האוכל. כל אחד יודע כמה הם שיפרו את חיינו לעומת העולם שלפני המכונית או המיקרוגל.
במילים פשוטות, הפונקציה היא קטע קוד המבצע פעולה, Action כלשהי. המתכנתים כותבים את הפונקציה פעם אחת ויכולים לקרוא לה בקוד מתי שרק ירצו.
#שיטת התכנות של פונקציות
אז השיטה היא פשוטה - מגדירים ומשתמשים. כלומר, מתכנתים פונקציה ונותנים לה שם. מעתה נוכל להשתמש בה בקוד, כלומר לקרוא לה בכל פעם שנצטרך שהיא תבצע את תפקידה.
#איך פונקציה פועלת?
בקריאה לפונקציה, לעתים נצטרך לתת לה נתונים. בשביל זה לפונקציה יש סוגריים. בתוכן נצרף לה לעתים פרמטרים, כלומר נתונים מסויימים שבהם היא תשתמש כדי לחשב ולבצע את מה שהיא תוכנתה לעשות.
כשהפונקציה תסיים "לעבוד" (וזה יהיה מאוד מהיר כמובן) היא תחזיר את הפלט להמשך התכנית, או תבצע פעולה כמו הדפסה או הפעלה של פונקציות אחרות.
#דוגמה לפונקציות בחיים
נסביר את זה רגע בדימוי מהחיים: דמיינו שאתם בפסטיבל עם המון אנשים ואיבדתם את החברה שלכם. אתם ניגשים לבמה ומבקשים להכריז שאתם ממתינים לה. אומרים לכם לדבר עם שמעון, הכרוז של הפסטיבל. הוא בחור נחמד וענייני ומבקש מכם מידע, דאטה. במילים פשוטות - הוא שואל איך קוראים לה ומה שמכם. כשאתם נותנים את הפרטים הללו, שמעון ממהר להכריז במיקרופון "ברכה לוי, בואי ליד הבמה! יוסי ושרון ממתינים לך". דקות אחר כך ברכה מגיעה אליכם ליד הבמה.
סוף טוב הכל טוב!
כלומר, שמעון הוא פונקציה שיודעת להכריז על אבדות. הוא צריך פרמטרים, דאטה הכרחי שבדוגמה הזו הוא שם הגברת ושמות הממתינים לה. כשהוא מבצע את הפעולה שלו, המשימה מתבצעת. אם הוא היה מחזיר תשובה, כמו" ברכה כבר בבית" זה כנראה היה ארגומנט.
#יתרונות הפונקציה
פונקציה מקצרת את הקוד, חוסכת מאוד בזמן פיתוח ומונעת באגים. במילים פשוטות, הרעיון בפונקציה "קודד פעם אחת, השתמש הרבה פעמים!"
איך זה עובד?
דמיינו שהייתם צריכים גם לתקן בעצמכם את המכונית, גם להכין אוכל, גם לבנות את הבית שלכם, לטפל וללמד את הילדים, לתקן את החשמל, את הביוב וכל הדברים שצריך לעשות. אולי זה אפשרי אבל זה לא חכם, נכון?
קוד ללא פונקציות הוא כמו עולם בלי בעלי תפקידים שיודעים היטב כיצד למלא משימות מוגדרות, בלי אנשי מקצוע שהם מומחים בתפקידם ובלי מכשירים שעושים לנו את החיים קלים ונוחים.
זה עולם מסובך ומבולגן. המתכנתים קוראים לקוד כזה "קוד ספגטי". מרוב שהוא עמוס ומנוהל לא נכון, לא מוצאים בו את הידיים והרגליים...
חישבו על הפונקציה כסוג של מכונה, מתקן או חלק בקוד. כשנותנים להם סוג של אינפוט, מידע, הם יודעים לבצע במידע הזה משימה שהוגדרה להם מראש בתכנות.
פעולה כזו של פונקציה יכולה לפעמים לתת לנו משהו בחזרה, ערך או ערכים מוגדרים. ערך כזה בדוגמה שלנו הוא כמו תשובה ששמעון יכול לתת לנו, שברכה נמצאה וממתינה לנו במקום כלשהו.
לעתים פונקציה יכולה לשנות את הדאטה שנתנו לה ולפעמים לקבל החלטה על בסיס הדאטה הזה. בשפות מונחות עצמים יש בדרך כלל סוגריים אחרי שם הפונקציה. כשמכריזים על הפונקציה, כלומר כשמהמתכנתים מציגים אותה לראשונה, הם מגדירים שבסוגריים האלה יוכנס הדאטה לצורך הביצוע. בכך הם מגדירים באמצעות "פרמטרים" מה יהיה הדאטה המצופה, כדי שהפונקציה תעשה את תפקידה.
כשקוראים לפונקציה, זה כמו למלא טופס. לתוך הסוגריים, מכניסים את הפרמטרים, האינפוט, את המידע שהפונקציה רוצה (כמו ששמעון שואל "איך קוראים לילדה שנעלמה לכם?")
אחרי ביצוע הפעולה, הפונקציה תחזיר את הארגומנט. כלומר, את התוצאה או המידע שביקשנו ממנה לייצר מהפרמטרים שסיפקנו לה בקריאה.
בשפות תכנות נהוג שהסוגריים נכללות בפונקציה בכל מקרה, גם אם אין מידע, כלומר פרמטרים שהפונקציה דורשת כדי למלא את תפקידה, יהיו שם סוגריים ריקות.
ואגב, בשפות התכנות השונות יש פונקציות מובנות, שנכתבו מראש, ברמת השפה כולה. ניתן להשתמש בהן מראש, מבלי שהמתכנת יצטרך לפתח בעצמו או בעצמה פונקציות לדברים שמתכנתים צריכים הרבה. יש גם ספריות שלמות, שאותן תוכלו לייבא לקוד שלכם ולחסוך זמן פיתוח. הן כוללות פונקציות שימושיות, בתחום בו הספריה שימושית.
הנה סרטון שמסביר את הפונקציה בפשטות:
https://youtu.be/3JIZ40yuZL0?end=2m40s
הפונקציה לתלמידי תכנות שפת פייתון (עברית):
https://youtu.be/o0wyYsNbJeY
והסבר הפונקציות ב-javascript (עברית):
https://youtu.be/c7mqY6QtdQQ
מכירים את זה שאתם עושים שוב ושוב, כל יום או כל כמה שעות את אותה פעולה וזה נראה לכם לא הגיוני?
גם מתכנתים לא אוהבים לעשות שוב ושוב את אותה פעולה. לכן הם למשל משתמשים בלולאות (Loops). אבל יש מרכיב שחוסך עוד יותר עבודה וכתיבת קוד מיותר. כי מתכנתים אוהבים לשמור את הקוד שלהם DRY, קיצור של "don’t repeat yourself".
לרכיב מקצר העבודה הזה קוראים פונקציה (Function). הפונקציה היא פלא של ייעול. כל מטרתה היא "לקודד פעם אחת, להשתמש הרבה פעמים".
#אבל מהי פונקציה?
פונקציה היא קוד שמבצע פעולה. הרעיון בכתיבת פונקציה הוא לכתוב פעם אחת קוד והוא יחליף את הצורך לכתוב פעולות דומות שוב ושוב, במקומות שונים בתוכנה.
דמייני שאת מתכנתת פעם אחת קטע של קוד ואחרי כן קוראת לו בתוכנה, בכל פעם שצריך שהוא יבצע את תפקידו.
מדהים לא?
ואכן, פונקציה בתכנות היא מרכיב פשוט אבל משמעותי מאוד, המקל את הקידוד ואת הארגון הנכון של תכנית מחשב. כך הוא מקצר את הקוד, חוסך זמן ומקטין את האפשרויות לשגיאות.
כמו במכשיר מיקרוגל או במכונית, בפונקציה משתמשים בכל פעם שרוצים לבצע את הפעולה שהיא יודעת ותוכנתה לעשות. מכונית תסיע אותנו ומיקרו יחמם לנו או יפשיר את האוכל. כל אחד יודע כמה הם שיפרו את חיינו לעומת העולם שלפני המכונית או המיקרוגל.
במילים פשוטות, הפונקציה היא קטע קוד המבצע פעולה, Action כלשהי. המתכנתים כותבים את הפונקציה פעם אחת ויכולים לקרוא לה בקוד מתי שרק ירצו.
#שיטת התכנות של פונקציות
אז השיטה היא פשוטה - מגדירים ומשתמשים. כלומר, מתכנתים פונקציה ונותנים לה שם. מעתה נוכל להשתמש בה בקוד, כלומר לקרוא לה בכל פעם שנצטרך שהיא תבצע את תפקידה.
#איך פונקציה פועלת?
בקריאה לפונקציה, לעתים נצטרך לתת לה נתונים. בשביל זה לפונקציה יש סוגריים. בתוכן נצרף לה לעתים פרמטרים, כלומר נתונים מסויימים שבהם היא תשתמש כדי לחשב ולבצע את מה שהיא תוכנתה לעשות.
כשהפונקציה תסיים "לעבוד" (וזה יהיה מאוד מהיר כמובן) היא תחזיר את הפלט להמשך התכנית, או תבצע פעולה כמו הדפסה או הפעלה של פונקציות אחרות.
#דוגמה לפונקציות בחיים
נסביר את זה רגע בדימוי מהחיים: דמיינו שאתם בפסטיבל עם המון אנשים ואיבדתם את החברה שלכם. אתם ניגשים לבמה ומבקשים להכריז שאתם ממתינים לה. אומרים לכם לדבר עם שמעון, הכרוז של הפסטיבל. הוא בחור נחמד וענייני ומבקש מכם מידע, דאטה. במילים פשוטות - הוא שואל איך קוראים לה ומה שמכם. כשאתם נותנים את הפרטים הללו, שמעון ממהר להכריז במיקרופון "ברכה לוי, בואי ליד הבמה! יוסי ושרון ממתינים לך". דקות אחר כך ברכה מגיעה אליכם ליד הבמה.
סוף טוב הכל טוב!
כלומר, שמעון הוא פונקציה שיודעת להכריז על אבדות. הוא צריך פרמטרים, דאטה הכרחי שבדוגמה הזו הוא שם הגברת ושמות הממתינים לה. כשהוא מבצע את הפעולה שלו, המשימה מתבצעת. אם הוא היה מחזיר תשובה, כמו" ברכה כבר בבית" זה כנראה היה ארגומנט.
#יתרונות הפונקציה
פונקציה מקצרת את הקוד, חוסכת מאוד בזמן פיתוח ומונעת באגים. במילים פשוטות, הרעיון בפונקציה "קודד פעם אחת, השתמש הרבה פעמים!"
איך זה עובד?
דמיינו שהייתם צריכים גם לתקן בעצמכם את המכונית, גם להכין אוכל, גם לבנות את הבית שלכם, לטפל וללמד את הילדים, לתקן את החשמל, את הביוב וכל הדברים שצריך לעשות. אולי זה אפשרי אבל זה לא חכם, נכון?
קוד ללא פונקציות הוא כמו עולם בלי בעלי תפקידים שיודעים היטב כיצד למלא משימות מוגדרות, בלי אנשי מקצוע שהם מומחים בתפקידם ובלי מכשירים שעושים לנו את החיים קלים ונוחים.
זה עולם מסובך ומבולגן. המתכנתים קוראים לקוד כזה "קוד ספגטי". מרוב שהוא עמוס ומנוהל לא נכון, לא מוצאים בו את הידיים והרגליים...
חישבו על הפונקציה כסוג של מכונה, מתקן או חלק בקוד. כשנותנים להם סוג של אינפוט, מידע, הם יודעים לבצע במידע הזה משימה שהוגדרה להם מראש בתכנות.
פעולה כזו של פונקציה יכולה לפעמים לתת לנו משהו בחזרה, ערך או ערכים מוגדרים. ערך כזה בדוגמה שלנו הוא כמו תשובה ששמעון יכול לתת לנו, שברכה נמצאה וממתינה לנו במקום כלשהו.
לעתים פונקציה יכולה לשנות את הדאטה שנתנו לה ולפעמים לקבל החלטה על בסיס הדאטה הזה. בשפות מונחות עצמים יש בדרך כלל סוגריים אחרי שם הפונקציה. כשמכריזים על הפונקציה, כלומר כשמהמתכנתים מציגים אותה לראשונה, הם מגדירים שבסוגריים האלה יוכנס הדאטה לצורך הביצוע. בכך הם מגדירים באמצעות "פרמטרים" מה יהיה הדאטה המצופה, כדי שהפונקציה תעשה את תפקידה.
כשקוראים לפונקציה, זה כמו למלא טופס. לתוך הסוגריים, מכניסים את הפרמטרים, האינפוט, את המידע שהפונקציה רוצה (כמו ששמעון שואל "איך קוראים לילדה שנעלמה לכם?")
אחרי ביצוע הפעולה, הפונקציה תחזיר את הארגומנט. כלומר, את התוצאה או המידע שביקשנו ממנה לייצר מהפרמטרים שסיפקנו לה בקריאה.
בשפות תכנות נהוג שהסוגריים נכללות בפונקציה בכל מקרה, גם אם אין מידע, כלומר פרמטרים שהפונקציה דורשת כדי למלא את תפקידה, יהיו שם סוגריים ריקות.
ואגב, בשפות התכנות השונות יש פונקציות מובנות, שנכתבו מראש, ברמת השפה כולה. ניתן להשתמש בהן מראש, מבלי שהמתכנת יצטרך לפתח בעצמו או בעצמה פונקציות לדברים שמתכנתים צריכים הרבה. יש גם ספריות שלמות, שאותן תוכלו לייבא לקוד שלכם ולחסוך זמן פיתוח. הן כוללות פונקציות שימושיות, בתחום בו הספריה שימושית.
הנה סרטון שמסביר את הפונקציה בפשטות:
https://youtu.be/3JIZ40yuZL0?end=2m40s
הפונקציה לתלמידי תכנות שפת פייתון (עברית):
https://youtu.be/o0wyYsNbJeY
והסבר הפונקציות ב-javascript (עברית):
https://youtu.be/c7mqY6QtdQQ