2.8.2 ADT ב-Ada

מבנה נתונים ואלגוריתמים

 

 

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

 

היה צורך בשני מבני Ada על מנת להגדיר ADT: טיפוס המידע והמתודה שלו היו ממוקמים בחבילה (package).

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

ומקשרים יודעים כמה מקום דורש עבור ADT בחבילה שעברה הידור בנפרד - ואשר עבורה ידועות רק ההגדרות).

 

חבילה ב-Ada עבור מספרים מורכבים תיושם באופן הבא:

 

PACKAGE complex_numbers IS
    TYPE complex IS PRIVATE;
    I : CONSTANT complex;    -- 'i'
 
    FUNCTION "-"( complex a ) RETURNS complex; -- Unary minus
 
    FUNCTION "+"( complex a; complex b ) RETURNS complex;
    FUNCTION "-"( complex a; complex b ) RETURNS complex;
    FUNCTION "*"( complex a; complex b ) RETURNS complex;
    FUNCTION "="( complex a; complex b ) RETURNS boolean;
 
PRIVATE
    TYPE complex IS RECORD
        real, imag : FLOAT;
        END RECORD;
    I : CONSTANT complex := (0.0, 1.0);
END complex_numbers;

 

הגוף (body) או היישום ימוקם לרוב בקובץ נפרד ויעבור הידור בנפרד:

 

PACKAGE BODY complex_numbers IS
 
    FUNCTION "-"( complex a ) RETURNS complex IS -- Unary minus
        RETURN complex'(-a.real,-a.imag);
        END "-";
 
    FUNCTION "+"( complex a; complex b ) RETURNS complex IS
        RETURN complex'(a.real+b.real,a.imag+c.imag);
        END "+";
 
    FUNCTION "-"( complex a; complex b ) RETURNS complex IS
        RETURN complex'(a.real-b.real,a.imag-c.imag);
        END "-";
 
    FUNCTION "*"( complex a; complex b ) RETURNS complex IS
        RETURN complex'(a.real*b.real - a.imag*b.imag,
                        a.real*b.imag + a.imag*b.real );
        END "*";
 
    FUNCTION "="( complex a; complex b ) RETURNS boolean IS
        RETURN (a.real = b.real) AND (a.imag = b.imag);
        END "=";
 
END complex_numbers;

 

שים לב כי Ada מספקת יכולת מעולה בהעמסת אופרטורים  (operator overloading), דבר  המאפשר לנו לרשום באופן

מתמטי קוד "טבעי", כגון:

    complex a, b, c, z;
 
    IF a = b THEN
        c := z - a;
        z := -z;
    END IF;

 

 

המשך ל: מיון                   חזור ל: תוכן עניינים