בנאי (מדעי המחשב)

מתוך ויקיפדיה, האנציקלופדיה החופשית
קפיצה אל: ניווט, חיפוש

בתכנות מונחה-עצמים, בנאיאנגלית: constructor, לעתים נכתב בקיצור: ctor) הוא פיסת תוכנה (דומה לפרוצדורה, פונקציה או מתודה) המאתחלת אובייקט, ונקראת באופן אוטומטי מיד לאחר שהאובייקט נוצר.

בנאי דומה למתודות רגילות, אך תפקידו שונה באופן מהותי. בתחילת הריצה של הבנאי האובייקט אותו הוא צריך לבנות עדיין איננו מוגדר עד תומו[1]. תפקידו של הבנאי הוא למעשה לדאוג לכך שהאובייקט יהיה בנוי היטב (כלומר, שהאינווריאנט של האובייקט יתקיים), למשל עבור אובייקט המגדיר תאריך, לדאוג שהשדה של היום בחודש יכיל ערך חוקי ביחס לחודש אליו האובייקט מאותחל, ולא יכיל "זבל". זאת בניגוד למתודה רגילה המניחה שהאובייקט עליה היא פועלת הוא בנוי היטב, וצריכה רק לדאוג לשמור אותו במצב זה.

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

שמו של הבנאי הוא לרוב כשם המחלקה עבורה הוא מוגדר, אך ישנן שפות תכנות (למשל שפת D) בהן אין לבנאי שם, או שהבנאי נקרא this, על מנת שלא לחזור על שם המחלקה במקומות שונים שלא לצורך.

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

דוגמאות ל- Constructor[עריכת קוד מקור | עריכה]

בשפת התכנות Java[עריכת קוד מקור | עריכה]

public class Example 
{
  //הגדרת הבנאי  
  public Example()
  {
     this(1);
  }
 
  //העמסת הבנאי
  public Example(int input)
  {
     data = input;
  }
 
  //declaration of instance variable(s).
  private int data;
}
//code somewhere else
//instantiating an object with the above constructor
Example e = new Example(42);

בשפת התכנות ++C[עריכת קוד מקור | עריכה]

class Example {
public:

  // בנאי שאינו מקבל פרמטרים
  Example()
  {
    data = 0;
  }
 
  // העמסה של בנאי
  Example(int data)
  {
    this->data = data;
  }
    
private:

  int data;
};
// Code somewhere else
// Instance an object on the stack with the above constructor
Example a(4);

// Instance one on the heap
Example *b = new Example(4);

ראו גם[עריכת קוד מקור | עריכה]

הערות שוליים[עריכת קוד מקור | עריכה]

  1. ^ למשל, בשפת ++C עשויים להיות לאובייקט שדות שערכיהם כלל אינם מוגדרים; בשפת ג'אווה, ערכי השדות מוגדרים על ידי השפה, אך לא בהכרח בעלי ערך משמעותי עבור המחלקה