מטוסים נופלים, כורים מתפוצצים זיכרון אוטומטי מקטסטרופות לומדים בניינים קורסים,

Similar documents
ASP.Net MVC + Entity Framework Code First.

טכנולוגיית WPF מספקת למפתחים מודל תכנות מאוחד לחוויית בניית יישומיי

קשירות.s,t V שני צמתים,G=(V,E) קלט: גרף מכוון מ- s t ל- t ; אחרת.0 אם יש מסלול מכוון פלט: הערה: הגרף נתון בייצוג של רשימות סמיכות.

מבוא לתכנות - פיתוח משחקים ב Action Script 3.0

FILED: NEW YORK COUNTY CLERK 07/16/2014 INDEX NO /2014 NYSCEF DOC. NO. 102 RECEIVED NYSCEF: 07/16/2014 EXHIBIT 5

Practical Session No. 13 Amortized Analysis, Union/Find

ניפוי שגיאות )Debug( מאת ישראל אברמוביץ

Rules Game (through lesson 30) by Nancy Decker Preparation: 1. Each rule board is immediately followed by at least three cards containing examples of

Hebrew Ulpan HEB Young Judaea Year Course in Israel American Jewish University College Initiative

מכונת מצבים סופית תרגול מס' 4. Moshe Malka & Ben lee Volk

תצוגת LCD חיבור התצוגה לבקר. (Liquid Crystal Display) המערכת.

מבוא לתכנות - פיתוח משחקים ב Action Script 3.0

המבנה הגאומטרי של מידה

A R E Y O U R E A L L Y A W A K E?

Patents Basics. Yehuda Binder. (For copies contact:

State Pattern מימוש מכונת מצבים (FSM) מבוא בעיה תמיכה ועדכונים עדכון מס' 48 מאי 2002

THINKING ABOUT REST THE ORIGIN OF SHABBOS

תוכנה 1 בשפת Java "יוצא מן הכלל" שיעור מספר 9: שחר מעוז בית הספר למדעי המחשב אוניברסיטת תל אביב

Structural Vs. Nominal Typing

מבוא למחשב בשפת פייתון

FILED: NEW YORK COUNTY CLERK 07/16/2014 INDEX NO /2014 NYSCEF DOC. NO. 134 RECEIVED NYSCEF: 07/16/2014 EXHIBIT 37

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

המחלקה למדעי המחשב, אוניברסיטת בן גוריון מבני נתונים, סמסטר אביב 2102 עבודת בית מספר - 2 מעשית

אנגלית (MODULE E) בהצלחה!

הקדמה פרופ' מוטי בן-ארי המחלקה להוראת המדעים מכון ויצמן למדע

תמ מהו הקדמה פרופ' מוטי בן-ארי. Peter תמ"ע = עצמים + מחלקות + ירושה. תמ"ע "לייט" לבין תמ"ע אמיתי. Turbo Pascal

Redirection The Input Buffer

מספר ת"ז: יש לסמן את התשובה הטובה ביותר בתשובון. לא יינתן ניקוד על סימון תשובה בטופס הבחינה או במחברת הבחינה.

תוכנה 1 בשפת Java שיעור מספר 8: "ירושה נכונה" בית הספר למדעי המחשב אוניברסיטת תל אביב

פולימורפיזם. blog.csit.org.il מדעי המחשב

byte code :(compiler) .class מהדר בתהליך עורך, סייר, קומפיילר,,JRE וכו'. למשל: אקליפס. נקודות חשובות: חסכון בהקצאת זיכרון.

Advisor Copy. Welcome the NCSYers to your session. Feel free to try a quick icebreaker to learn their names.

מבוא לתכנות ב- JAVA תרגול 7

Design Patterns מאיר סלע מהדורה ראשונה 2004 הדפסה 1 כל הזכויות שמורות

Name Page 1 of 6. דף ט: This week s bechina starts at the two dots in the middle of

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

A JEW WALKS INTO A BAR: JEWISH IDENTITY IN NOT SUCH JEWISH PLACES

אנגלית שאלון ז' ג רסה א' הוראות לנבחן בהצלחה! )4( ההנחיות בשאלון זה מנוסחות בלשון זכר ומכוונות לנבחנות ולנבחנים כאחד. (MODULE G)

שיעור מספר 6: מקושרים

ANNEXURE "E1-1" FORM OF IRREVOCABLE STANDBY LETTER OF CREDIT PERFORMANCE OF CONTRACT (WHERE PRICES ARE NOT LINKED TO AN ESCALATION FORMULA)

Reflection Session: Sustainability and Me


תרגול 8. Hash Tables

פרק עצמים א. טיפוסים חדשים ב. מצב של עצם

תכנית סטארט עמותת יכולות, בשיתוף משרד החינוך א נ ג ל י ת שאלון א' Corresponds with Module A (Without Access to Information from Spoken Texts) גרסה א'

זה. Nir Adar

Expressions (ex 8) Wild World (ex 7) Cars (ex 9)

שאלון ד' הוראות לנבחן

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

הרצאה מספר 10 נושאים לשיעור זה: סיכום הפקודות עד לשיעור זה *** )S-Q( = מקומות בהם ניתן לשלב תתי שאילתות

חוק זכויות הסוכן חוק חוזה סוכנות )סוכן מסחרי וספק(

Genetic Tests for Partners of CF patients

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

עד כה עסקנו בתוכניות שמתקדמות פקודה אחרי פקודה העתק ל- ax את הערך 3 העתק ל- bx את הערך 4 הוסף ל- ax את bx כפול את התוצאה ב- 2 והעתק ל- cx

שאלון ו' הוראות לנבחן

הבסיס כתיבת התכנית הראשונה שימוש במשתנים. הטיפוס הבסיסי object. הטיפוס הבסיסי string משפטי בקרה. שימוש ב- Enumerations. שימוש ב- Namespaces

Software Life-Cycle Models מודלים של מחזור חיי תוכנה - 1

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

בהצלחה! (MODULE C) Hoffman, Y. (2014). The Universal English-Hebrew, Hebrew-English Dictionary

Depth-First Search DFS

A Long Line for a Shorter Wait at the Supermarket

ל"תוכנה" שכותבים, כמו פונקציה זו, קוראים "קוד"

דיאלוג מומחז בין מרטין בובר וקרל רוג'רס

Name Page 1 of 5. דף ז. This week s bechina begins with the fifth wide line at the top of

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

אנגלית שאלון ז' (MODULE G) ג רסה א' הוראות לנבחן )מילון אנגלי-ערבי / ערבי-אנגלי )

CML כנס שנתי של מודעות ל- CML 4-6 לאוקטובר 2018, מלון רמדה, חדרה

דיאגרמה לתיאור Classes

מספר השאלון: הצעת תשובות לשאלות בחינת הבגרות אנגלית (MODULE C) מילון אנגלי-אנגלי-עברי או מילון אנגלי-עברי-עברי-אנגלי قاموس إنجليزي - إنجليزي - عربي

תכנית סטארט עמותת יכולות, בשיתוף משרד החינוך א נ ג ל י ת שאלון ב' Corresponds with Module B גרסה ב' הוראות לנבחן

DNS פרק 4 ג' ברק גונן מבוסס על ספר הלימוד "רשתות מחשבים" עומר רוזנבוים 1

SPSS 10.0 FOR WINDOWS

התכנית הראשונה שלי

שאלון ו' הוראות לנבחן

נספח: כישורי חשיבה )לפרק ראשון ושני( אנגלית (MODULE F) ספרות או: מילון אנגלי-ערבי / ערבי-אנגלי או: מילון אנגלי-אנגלי-ערבי

מספר השאלון: Thinking Skills נספח: כישורי חשיבה )לפרק ראשון ושני( א נ ג ל י ת (MODULE F) ספרות )מילון הראפס אנגלי-אנגלי-ערבי(

interface Student {tag: Student, name: string; age: number;} const makestudent = ( name: string, age: number ) : Student =>

תכנות בטוח חלק ב ' מאת עידו קנר

עבודה מס' 3: תכנות מונחה עצמים ורשימות

Computer Structure. Exercise #1 יש להגיש את התשובות הסופיות על גבי טופס זה.

Summing up. Big Question: What next for me on my Israel Journey?

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

מדריך למשתמש בשירות. yes MultiRoom

הקיטסיגול הרבחה יעדמל בלושמה גוחה

זה אומר שאחרי הכרות עם השפה מה שדורש השקעה אפשר להקדיש את מרבית הזמן לצד המוזיקלי יצירתי ולא התכנותיÆ איזה כיף

מבוא לרשתות - תרגול מס' 11 Transparent Bridges

תכניות סטנדרטיות ב UNIX שרשור פקודות באמצעות Pipeline עבודה ב- bash

(MODULE E) ב ה צ ל ח ה!

ב. משרד החינוך בגרות לנבחנים אקסטרניים א נ ג ל י ת (MODULE B) הוראות מיוחדות: )2( בתום הבחינה החזר את השאלון למשגיח. בהצלחה!

אנגלית ספרות בהצלחה! /המשך מעבר לדף/ נספח: כישורי חשיבה )לפרק ראשון ושני( או: מילון אנגלי-ערבי / ערבי-אנגלי או: מילון אנגלי-אנגלי-ערבי

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

עץ תורשה מוגדר כך:שורש או שורש ושני בנים שכל אחד מהם עץ תורשה,כך שערך השורש גדול או שווה לסכום הנכדים(נכד-הוא רק בן של בן) נתון העץ הבא:

ASTM UL / FM / BS abesco

תורשכ ירפס לכ ץבוק " ב י קלח יללכ רעש

נספח: כישורי חשיבה )לפרק ראשון ושני( אנגלית (MODULE D) ספרות או מילון אנגלי-עברי-עברי-אנגלי

JUDAISM AND INDIVIDUALITY

SHABBAT UNPLUGGING & RECONNECTING

מותאמת לסביבת. Visual C# 2005 Express שונות. ולבצע rename לשם המבוקש

Theories of Justice

NATIONAL COUNCIL OF YOUNG ISRAEL. Shavuot Nation JEWISH EDITION. Compiled by Gabi Weinberg Teen Program Director

Transcription:

2 חלק עצמים ומחלקות

בהנדסה קורות לעיתים קטסטרופות: מטוסים נופלים, כורים מתפוצצים בניינים קורסים, מקטסטרופות לומדים בעולם המחשבים, רוב הקטסטרופות התבטאו בכישלון לפתח תוכנה גדולה או בכישלון להשמיש תוכנה שפותחה; רוב הקטסטרופות נבעו מהגודל של התוכנה הפקת הלקחים כללה את פיתוח המתודולוגיות של תכנות מונחה עצמים, תיכון בעזרת חוזים contract),(design by ביצוע מקסימום בדיקות תקינות בזמן קומפילציה, ניהול זיכרון אוטומטי למה תכנות מונחה עצמים?

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

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

עצמים ומחלקות עצם (object) הוא יחידת תוכנה שמספקת שירותים (methods) מסוימים ושיש לה בכל נקודת זמן מצב רגעי מסוים (state) מחלקה (class) היא קבוצה של עצמים מאותו סוג, כלומר שמספקים את אותם שירותים באותה צורה העצמים הם מופעים (instances) של המחלקה עצמים שונים מאותה מחלקה נמצאים במצבים רגעיים שונים המחלקה היא הישות הסטטית בקוד המקור; העצם הוא הישות הדינמית בזמן הריצה scheme מימשנו גירסא פשוטה של מחלקות ועצמים ע"י פרוצדורות עם משלוח הודעות. 5 ב

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

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

Python, Java, C#, C++, (למשל עצמים בשפות מונחות מחלקות הן גם טיפוסים (Smalltalk המחלקה שאליה הוא שייך טיפוס: לכל עצם בזמן הריצה יש קומפילציה), (בזמן בשפות שבודקות טיפוסים בצורה סטטית אם משתנה טיפוס: מוכרזים עם בתוכנית, שמות משתנים, מהמחלקה המשהו הזה הוא עצם בכלל, מתייחס למשהו המוכרזת בהמשך שתיארנו יש יוצאים מן הכלל שנלמד לחוק ++C; #C, וכמוה גם סטטית, 'אווה בודקת טיפוסים בצורה (scheme (בדומה ל בודקות לא Smalltalk,Python טיפוסים 8 ג

נגדיר מחלקה class VersionedString { } במקום אחר בתוכנית, נגדיר משתנה עם טיפוס מתאים, ומשתנה מטיפוס String (מחלקה קיימת שאין צורך להגדיר): ה משתנה עדיין לא מתייחס לעצם vs; VersionedString כנ "ל ;s String ניצור עצם חדש מהמחלקה, ונקשור את המשתנה vs אליו, vs = new VersionedString(); אבל אי אפשר לקשור שם מטיפוס String לעצם מהמחלקה :VersionedString שגיאת קומפילציה! vs; s = מחלקות וטיפוסים: דוגמה 9

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

11 תוכנה 1: עצמים ומחלקות המחלקה הראשונה: הגדרת השירותים class VersionedString { public void add(string s) { } public int length() { } public String getlastversion() { } public String getversion(int i) { } } אין הגבלת גישה ציבורי, שירות :public שמסמן שהשירות אינו מחזיר ערך ערך חזרה מאומה; :void מספר שלם :int ג'אווה מובנית בשפת מחרוזות, מחלקה לייצוג :String

הדרך הנוחה ביותר להגדיר מה השירותים עושים (ולהוכיח שהם עושים זאת נכון) היא על ידי הגדרת המצב מופשט state) (abstract שהעצם מייצג בעיני הלקוח, עצמים מייצגים מצבים מופשטים המצב המופשט של עצם מהמחלקה VersionedString הוא סדרה ) n (s 1, s 2,..., s כאשר n 0 ו- s i היא מחרוזת את המצב המופשט של העצם נסמן ב-( A(this מה השירותים עושים? מצב מופשט 12

13 תוכנה 1: עצמים ומחלקות מה השירותים עושים? החוזה class VersionedString: Initial State: A(this) == () add(string s): Requires: s!= null Ensures : A(old this) == (s1, s2,..., sn) A(this) == (s1, s2,..., sn, s)

14 תוכנה 1: עצמים ומחלקות מה השירותים עושים? החוזה (המשך) int length(): Requires: nothing Ensures : A(this) == (s1, s2,..., sn) return == n String getversion(int i): Requires: 0 < i <= length() Ensures : A(this) == (s1, s2,..., sn) return == si

15 תוכנה 1: עצמים ומחלקות החוזה (המשך) String getlastversion(): Requires: length() > 0 Ensures : A(this) == (s1, s2,..., sn) return == sn הסימונים: Requires תנאי ק דם, Ensures תנאי א חר, old הערך לפני ביצוע השרות, return הערך שהשרות מחזיר השרות add משנה את המצב המופשט (פקודה), האחרים לא (שאילתות)

לעצמים יש מצב התחלתי לכל שירות מוצמדים שני תנאים תנאי הקדם (precondition) מגדיר מה השירות מצפה תנאי האחר (postcondition) מגדיר מה השירות מספק אם תנאי הקדם מתקיים, השירות חייב לקיים, לאחר שהוא מסיים, את תנאי האחר אם תנאי הקדם לא מתקיים, השירות לא מחויב לכלום; לא לעצור, לא להימנע מלהעיף את התוכנית, לא להימנע מפגיעה במבני נתונים, כלום החוזה: תנאי ק דם ותנאי א חר 16

לחוזה שני צדדים: ספק ולקוח הספק הוא המחלקה שמגדירים; היא צריכה לממש את השירותים בקוד ג'אווה מתאים הלקוח הוא קוד שמשתמש בעצמים מהמחלקה הלקוח מחויב לקיים את תנאי הקדם לפני שהוא קורא לשירות הספק מחויב, אם הלקוח קיים את חלקו ותנאי הקדם מתקיים, לקיים את תנאי האחר ספקים ולקוחות 17

בהרבה מקרים אפשר להגדיר את החוזה תוך שימוש בשאילתות כאשר זה אפשרי כלל; בלי להגדיר את המצב המופשט בלבד, זה לפעמים המופשט; השאילתות חושפות את כל המצב שלא מופיע (פריט הנכונות; והוכחת הגדרת החוזה מקשה על הנה הדוגמה השתנה); בתנאי האחר לא class VersionedString: Initial State: length() == 0 החוזה בלי הגדרת מצב מופשט add(string s): Requires: s!= null Ensures : length() == old length()+1 getversion(length()) == s 18

19 תוכנה 1: עצמים ומחלקות החוזה בלי הגדרת מצב מופשט (המשך) int length(): Requires: nothing Ensures : return==number of calls to add() so far String getversion(int i): Requires: 0 < i <= length() Ensures : return! = null String getlastversion(): Requires: length() > 0 Ensures : return == getversion(length())

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

איך נבדוק נכונות של לקוח? נניח שהלקוח מבצע את סידרת הפעולות הבאה: vs = new VersionedString(); vs.add("the letter A"); vs.add("the letter B"); System.out.println(vs.getVersion(1)); איך ניתן להראות שהפעולות ייתבצעו בהצלחה, ומה יודפס? (השגרה System.out.println מדפיסה את הארגומנט שלה, שצריך להיות מחרוזת, לפלט הסטנדרטי, ועוברת לשורה הבאה. בהמשך הקורס נלמד מה משמעות שם השגרה) 21

ליצירת העצם אין תנאי קדם, ולכן מותר ללקוח לבצע אותה כעת (או בכל מצב אחר) vs = new VersionedString(); לאחריה מתקיים: vs.length() == 0 לשירות add יש תנאי קדם אחד: הארגומנט אינו.null הלקוח העביר התייחסות למחרוזת, לא,null ולכן מילא את תנאי הקדם. vs.add("the letter A"); argument!= null תנאי האחר מבטיחים ש-() length קוּדם ב- 1 ושקריאה ל- getversion(1) תחזיר את המחרוזת שהועברה, כלומר מתקיים: vs.length() == 1 vs.getversion(1) == "The letter A" נכונות של לקוח 22

נכונות של לקוח (המשך) באופן דומה vs.add("the letter B"); argument!= null vs.length() == 2, vs.getversion(2) == "The letter B" עקרונית, יתכן שפקודה מאוחרת יותר תשנה את הערך שיחזיר ;getversion(2) במחלקה שלנו זה לא יתכן, כי הערך של length() יכול רק לגדול, והפקודה היחידה היא,add שקובעת את הערך של getversion עבור הארגומנט length() עכשו מתקיים תנאי הקדם של vs.getversion(1) 0 < 1 <= vs.length() == 2 System.out.println(vs.getVersion(1)); ויודפס A" "The letter 23

החוזה מגדיר את המשמעות של מחלקה ללא תלות במימושה הספק להפריד את הפיתוח והתחזוקה של החוזה מאפשר ההפרדה הזו מהווה מפתח בפיתוח תוכנה הלקוחות; מאלו של רחבת היקף חוזה פורמלי מאפשר להוכיח נכונות של לקוחות בהוכחת בלעדי) (לא נראה שהחוזה הוא מרכיב הקורס בהמשך נכונות של ספק שהגדרת המשמעות של מחלקה על גם בהמשך הקורס נראה חשובה במיוחד בתכנות מונחה עצמים ידי חוזה בהמשך הקורס נציע טוב; כמובן שיש חוזה טוב וחוזה פחות שיטות להגדרת חוזים טובים למה חוזים? 24

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

:(command) במחלקה שהגדרנו הוא פקודה add השירות הוא משנה את מצב מבנה הנתונים הם getlastversion,getversion,length השירותים הם מחזירים מידע אודות מצב מבנה :(queries) שאילתות אבל לא משנים אותו הנתונים, שירותים שהם גם פקודה אין ושאילתות: הפרדנו בין פקודות וגם שאילתה מחלקה, מקילה על הבנת הממשק של ההפרדה: חשיבות מאפשרת שימוש בשאילתא בחוזה החוזה: מקילה על הגדרת לעיתים (רחוקות) יש סיבות טובות לא להפריד בהיעדר סיבה טובה, הפרידו! (ביצועים,...) פקודות ושאילתות 26

VersionedString n: 26 last: 27 Version value: "The letter Z" previous: Version value: "The letter Y" previous: Version value: "The letter A" previous: null תוכנה 1: עצמים ומחלקות מימוש המחלקה: הרעיון

המצב הרגעי של עצם נשמר בשדות, משתנים ששייכים לעצם: class Version { הערך של גרסה זו value; String התייחסות לגרסה הקודמת, אם יש previous; Version מימוש המחלקה: השדות } class VersionedString { מספר הגרסאות n; protected int התייחסות לגרסה אחרונה last; protected Version } 28

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

VersionedString n: 26 last: Version value: "The letter Z" previous: Version value: "The letter Y" previous: Version value: "The letter A" previous: null 30 תוכנה 1: עצמים ומחלקות מימוש המחלקה: הפקודה public void add(string s) { Version l = new Version(); l.previous = last; l.value = s; } last = l; n = n+1;

31 תוכנה 1: עצמים ומחלקות מימוש המחלקה: השאילתות public String getlastversion() { return getversion( length() ); } public String getversion(i) { Version v = last; for (int j = length(); j > i; j--) v = v.previous; return v.value; } public int length() { return n; }

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

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

השמה מעתיקה ערך פרימיטיבי ממשתנה אחד לאחר int x = 5; int y = x; y = 3; הערך של x עדיין 5, משום שהערך שלו רק הועתק למשתנה y ששונה בהמשך משתנה פרימיטיבי הוא מיכל לאחסון ערך לא כמו נוזל, שמוזגים ממיכל למיכל! השמה של ערכים פרימיטביים 34

שינוי מצב העצם דרך t משנה את העצם ש- s מתייחס אליו: t.add("v 2"); s.getlastversion(); // returns "V 2" השמת התייחסות מעתיקה את ההתייחסות, לא את העצם שמתייחסים אליו: VersionedString s = new VersionedString(); s.add("v 1"); VersionedString t = s; אחרי ההשמה, שני המשתנים מתייחסים לאותו עצם בדיוק: השמה של התייחסויות 35

ערכי הארגומנטים נקשרים לשרות, כאשר מתבצעת קריאה ומתבצעת הסדר, לפרמטרים הפורמליים של השרות לפי השרות. השמה לפני ביצוע גוף : בהעברת ערך פרימיטיבי הערך מועתק לפרמטר הפורמלי void f(int y) { y = 3; } int x = 5; f(x); // x still contain 5; equivalent to { y=x; y=3; } לא ההתייחסות, העברת התייחסות כארגומנט מעתיקה את את העצם שמתייחסים אליו call by value נקראת צורה זאת של העברת פרמטרים העברת ארגומנטים 36

במקום מערך ניתן להשתמש בג'אווה בעצמים. מערך של doubles ניתן להשתמש במחלקה למשל, במקום למה יש מערכים בג'אווה? class DoubleArray { public void put(int index, double value) {.} public double get(int index) { } משתני מו פע //... } יעילות, התשובה היא מערכים? כוללת השפה אם כך, מדוע, לפעמים לא חשובה, לעיתים יעילות וזיכרון; מבחינת זמן ריצה אלגנטי פחות יעיל, יותר פשרה: בג'אווה הם מערכים 37