האתר הישראלי להנדסת תכנה

דף ראשי | מפת האתר | רשימת מושגים | מקורות נוספים | אודות
המנעות משגיאות תהליכי תכנה אמינים

הסתרת מידע

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

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

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

המנעות משגיאות לתחילת הדף תהליכי תכנה אמינים
©איתן 2003. כל הזכויות שמורות למערכת המידע איתן