הסבר על שיוך, צבירה והרכב ב- OOP

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

שיוך בתכנות מונחה עצמים

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

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

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

בכיתה ציבורית BlogAccount

   {

       פרטי BlogEntry [] blogEntries;

       // חברים אחרים בכיתת BlogAccount

   }

כיתה ציבורית BlogEntry

   {

       Int32 blogId;

       כיתוב מחרוזת;

       טקסט מחרוזת;

       // חברים אחרים בכיתת BlogEntry

   }

צבירה בתכנות מונחה עצמים

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

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

בכיתה ציבורית BlogAuthor

   {

       פרטי Int32 authorId;

       פרטי מחרוזת firstName;

       שם משפחה פרטי;

       // חברים אחרים בכיתת BlogAuthor

   }

בכיתה ציבורית BlogAccount

   {

       פרטי BlogEntry [] blogEntries;

       // חברים אחרים בכיתת BlogAccount

   }

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

קומפוזיציה בתכנות מונחה עצמים

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

בית בכיתה ציבורית

{

   חדר פרטי בחדר;

   בית ציבורי()

   {

       חדר = חדר חדש ();

   }

}

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

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

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