תכן תוכנה Software Design תכן תוכנה - 1
CSU Software CSC CSCI System Business פעילות תיכון התוכנה )בגישה מונחית העצמים( מטרת הפעילות הגדרת המודולים )מחלקות מהן יווצרו עצמים( הבונים את התוכנה הקצאת פונקציונאליות למחלקות )מאפיינים ומתודות( קלט ארכיטקטורת התוכנה Diagram) (Component תהליכי התוכנה Diagrams) (Sequence ברמת רכיבים תוצרים מודל מחלקות (Class Diagram) תהליכי תוכנה (Sequence Diagrams) ברמת עצמים תפעול מערכת: שילוב ובדיקות תיקוף אימות מערכת: תהליכים וארכיטקטורה הגדרת דרישות הלקוח ובעלי העניין רמת עניין תוכנה: שילוב ובדיקות אימות תוכנה: תהליכים וארכיטקטורה בניה ובדיקה של רכיבי תוכנה אימות תיכון תוכנה הגדרה ופירוט Definition and Specification זמן מימוש, שילוב ובחינה Implementation, Integration and Testing קידוד ובדיקה של יחידות תוכנה תכן תוכנה - 2
תמונת המצב עד כה בנינו ארכיטקטורה של מערכת התוכנה, המפרטת את הפירוק המערכתי של כל פריט תוכנה )ברמת המערכת( (component diagram) (sequence diagrams) (Use Cases) מטרות: רכיבים: ביצוע תהליכי המערכת Software Components עם תפקידים וממשקים מבנה: הקשרים הפנימיים והחיצוניים באמצעות הממשקים התנהגות: אינטראקציה בין הרכיבים למימוש התהליכים ארכיטקטורה התוכנה מאפשרת גם לתאר את האינטראקציה בין פריטי התוכנה השונים User 1.0 push floor button(dir) Operations Manager :Ongoing Operation Manager El: Request Manager Floor Button Caretaker/Rescuer Commands Operations Manager Direct Direct (elevators) Direct (floors) Testing Manager Technician Commands loop [for all elevators] 1.1 get status(): Floor&Direction 1.2 1.3 El= choose elevator() Floor Buttons on/off Rescue Task Allocation Arrival Reports Status Queries Arrival Reports Status Queries 1.6 Button on() 1.4 new request(int): int 1.5 save request(int) Elev. Button Elev. Buttons on/off Rescue Direct Request Manager Arrival reports Arrival Reports Next Stop Queries Next Stop Queries Status Queries Ongoing Operation Manager Engine Commands Door Commands Emergency Stop Emergency Stop תכן תוכנה - 3
תכן תוכנה )מונחה עצמים( ברמה הבאה בפירוק המערכתי עלינו לפרט עבור כל רכיב component) :(software מטרות : מימוש הפונקציונאליות של הרכיב מרכיבים: מודולי תוכנה )עצמים( מבנה: הקשרים )ההיכרות( בין העצמים השונים התנהגות: האינטראקציה בין העצמים השונים המביאה למימוש הפונקציונאליות Comp1 B A D C a:a b:b c:c B A D C תכן תוכנה - 4
צומת מרומזר לעומת כיכר: מה ההבדל? תכן תוכנה - 5
תוכנה מבנית )structured( ]קלאסית[ מבנה הפרדת המידע )data( מהפונקציונליות ביצוע עץ קריאות בין מודלים כל מודול מבצע מניפולציות על המידע מבני נתונים )מידע( תכנית מבנית )פונקציות/תהליכים( תכנית ראשית קריאות תכנית משנית תכנית משנית תכנית משנית D: מסמך )בעריכה( F: קובץ Open(F) Save(D,F) שגרה / פונקציה שגרה / פונקציה שגרה / פונקציה Open Save תכן תוכנה - 6
תוכנה מונחית עצמים מבנה בתוך המידע והפונקציונליות כמוסים (encapsulated) "עצמים" ביצוע העברת "הודעות" בין אובייקטים שם מידע פעולות שם מידע פעולות הודעות שם מידע פעולות שם מידע פעולות : משתמש...... U D: Save_Yourself : D מסמך... Save F: Open_Yourself F: Save_Me)D( : F קובץ... Open Save תכן תוכנה - 7
מ התבנית מונחית העצמים paradigm( )Object Oriented ושגי יסוד עצם )object( ישות בדידה גבולות וזיהוי מוגדרים מכיל בתוכו )encapsulates( מצב והתנהגות data members, attributes מצב = מבני נתונים - member functions, methods - / התנהגות = פעולות פונקציות מחלקה )class( מחלקות קיימות בקוד אך ורק בזמן ההגדרה עצמים קיימים בזכרון אך ורק בזמן הריצה מתאר )descriptor( של קבוצת עצמים, בעלי מאפיינים משותפים: תכונות פעולות יחסים התנהגות תכן תוכנה - 8
מרכיבי התוכנה: עצמים ומחלקות עצמים (objects) היחידות הבסיסיות של התוכנה כל עצם מנהל את המידע שבאחריותו באמצעות הפונקציונליות שהוקנתה לו עצמים קיימים בזיכרון המחשב בזמן ריצת התוכנית ניתן לבנות/להרוס עצמים באופן דינמי תוך כדי ריצה = constructor פונקציה הבונה עצם חדש = destructor פונקציה ההורסת )מוחקת( עצם קיים מחלקות לכל עצם יש מפתח גישה ייחודי pointer(,)handle, הניתן לו ברגע בנייתו (classes) התבניות על פיהן נוצרים עצמים חדשים התבנית מכילה 3 "תאים" (compartments) המחלקות מוגדרות בקוד עצמים הם מופעים ספציפיים ע"י כותב התוכנה (instances) של מחלקות שם מאפיינים )מבני נתונים( פעולות )פונקציונלי ות( תכן תוכנה - 9
יצירה ותפעול של עצמים Car + maker: string + model: string + licenseplate: string + testdate: Date - owner: Person + sellto(person) : void + getowner(int) : Person + testisvalid(date) : boolean thebluecar : Car maker = mazda model = CX-7 licenseplate = 12-345-67 testdate = 08/09/2010 owner = Lior יצירת עצם "מכונית" חדש thebluecar = new(car) איתחול פרטי המכונית thebluecar.maker = mazda thebluecar.model = CX-7 רישוי וטסט thebluecar.licenseplate = 12-345-67 thebluecar.testdate = 08/09/2010 מכירה thebluecar.sellto(lior) שם המחלקה שם העצם function sellto(x) : owner = X תכן תוכנה - 10
מועמדים לעצמים בתוכנה עצמים המייצגים ישויות פיזיות )מנוע, דלת, עמדת עבודה,...( מאפיינים: פרמטרים ונתונים לגבי הישות, קלט/פלט מתודות: פונקציונלית פיזית העצם המייצג משמש, למעשה, כממשק שבין התוכנה לישות הפיזית עצמים המייצגים ישויות לוגיות )תהליך, שירות,...( מאפיינים: פרמטרים ונתונים לגבי הישות, קלט/פלט מתודות: פעולות המשמשות את התהליך/השירות עצמים המייצגים ישויות מידע )מאגרי נתונים, רשימות, תורים,...( מאפיינים: רכיבי המידע שבאחריות הישות מתודות: פעולות על המידע )אחסון, שליפה, עדכון,...( תכן תוכנה - 11
- תחביר תרשים מחלקות Diagram) (Class מחלקה ClassName - privateattribute: Type + puplicattribute: Type - privatemethod(x:typex, Y:TypeY) : ReturnType + publicmethod(x:typex, Y:TypeY) : ReturnType שם המחלקה מאפיינים מתודות קשרים )משתנים( מאפיין פרטי )-(: ניתן לגשת אליו רק מתוך המחלקה עצמה מאפיין ציבורי)+(: )פונקציות( מתודה פרטית)-(: מתודה ציבורית)+(: ניתן לגשת אליו גם מבחוץ ניתן לקרוא לה אך ורק מתוך המחלקה עצמה ניתן לקרוא לה גם מבחוץ A B זיקה (association) A B ירושה (Inheritance) A B הקבצה (aggregation) תרשים המחלקות מבוסס על עיקרון של רשת סמנטית תכן תוכנה - 12
יחס ירושה )inheritance( / הכללה (Generalization) כאשר מחלקה B יורשת/מכלילה את מחלקה A, אזי A מכילה את כל המאפיינים של B A מכילה את כל הפעולות של B בנוסף, B מכילה מאפיינים ופעולות משל עצמה B is-a-kind-of A ירושה מתארת את היחס הסמנטי A של )sub-class( היא תת-מחלקה B כפתור דולק: }כן, לא{ לחיצה הדלקה/כיבוי מינוח לא מוצלח, כי B מכילה יותר מאשר A יחס הירושה יוצר מבנה היררכי של מחלקות מחלקה אבסטרקטית מחלקה שלא ניתן ליצור ממנה עצמים כל העצמים נוצרים ממחלקות היורשות אותה לדוגמה: "כלי רכב" כפתור מעלית כפתור קומה זיהוי: קומה כיוון: }למעלה, למטה{ תכן תוכנה - 13
בעיות ביחסי ירושה ירושה מרובה inheritance) (multiple מחלקה אחת יורש משתי מחלקות שונות הבעיה: עלולות להיווצר סתירות במאפיינים/פעולות הפתרון: רוב שפות התכנות אינן מרשות ירושה מרובה )מבנה של עץ( ירושה עמוקה מדי X... C B A הבעיה: קושי במעקב אחר הקשר )קשיי תחזוקה( הפתרון: "שבירת" העץ בנקודות בהן הזיקה חלשה יותר ירושה מדומה לדוגמה: ריבוע הוא סוג של מלבן, לכן מלבן ריבוע הבעיה: למלבן יש שני מאפיינים )אורך, רוחב( ולריבוע רק אחד )צלע( הפתרון: להגדיר את הירושה על בסיס תכונות משותפות )מאפיינים/פעולות( תכן תוכנה - 14
זיקה - association (Company,Person) navigability multiplicity Company 0..1 0..* Person +employer employ +employee יחס בין מחלקות המגדיר "היכרות" בין עצמים ממחלקות אלה ה"היכרות" הינה באמצעות מצביעים (pointers,references) name role מאפיינים המאפשרים הגדרה ברורה יותר של זיקה שם היחס )name( עשוי להתפרש בכיוונים שונים "Company employs Person Person employed by Company )role( Company is the employer Person is the employee )multiplicity( Company employs 0 or more Persons Person is employed by 0 or 1 company תפקיד ריבוי ניווט (navigability) Person knows who is its Company Company does not know its Persons תכן תוכנה - 15
הקבצה )aggregation( סוג מיוחד של זיקה )היכרות בין עצמים( מתארת את היחס הסמנטי (B A is_part_of שני סוגי הקבצה: הקבצת הרכ ב aggregation) (composite B A הוא חלק בלתי נפרד מ- B, A קיומו של A תלוי בקיומו של B ורק מ- B שמות נוספים: whole-part aggregation non-shared aggregation B A הקבצת שיתוף (shared aggregation) A משוייך אבל ל- B, קיומו של A אינו תלוי בקיומו של B A יכול להיות משותף, כלומר משוייך בו זמנית גם לעצמים אחרים תכן תוכנה - 16
הקבצה - דוגמה הקבצת שיתוף )shared( לפיסקה יש סגנון-פיסקה אחד סגנון יכול להיות משותף למספר פיסקאות הסגנון הוא ישות עצמאית, וקיומו אינו מותנה בקיום פיסקאות מחיקת פיסקה אינה מוחקת את הסגנון Paragraph Style Paragraph 1..* Word 1..* Font Style Character ניווט )navigation( התו מכיר את הסגנון הסגנון אינו מכיר את התוים המשויכים אליו 1 Style 0..* 0..* 1 1 1 הקבצת הרכב )composite( פיסקה מורכבת ממילה אחת לפחות כל המילים של הפיסקה שייכות אך ורק לפיסקה זו קיומה של המילה מותנה בקיומה של הפיסקה מחיקת פסקה מוחקת את כל המילים המרכיבות אותה. 1. A Numbered Title This is the first paragraph of this document. It contains 17 words and 80 non-blank cha r ac t ers. תכן תוכנה - 17
הקצאת תפקידים לעצמים/מחלקות בדומה לתהליך האנליזה הפונקציונאלית שעשינו בשלבים הקודמים, גם כאן עלינו להקצות פונקציונאליות למרכיבי התוכנה )עצמים/מחלקות( תזכורת: בתוכנה קיימים שני סוגים של דרישות פונקציונאליות דרישות תפעוליות :(OR) מה התוכנה צריכה לעשות דרישות אלה ימומשו באמצעות operations )פונקציות / מתודות( דרישות מידע מקורות לפונקציונאליות סיפור הלקוח :(DR) מה התוכנה צריכה לדעת דרישות אלה ימומשו באמצעות attributes )משתנים / מבני נתונים( מפרט הדרישות/התהליכים Use Case Model, Activity Diagrams - ארכיטקטורת התוכנה מימוש התהליכים באמצעות sequence diagrams בהקצאה הפונקציונאלית יש לשמור על עקרונות המקצוענות והעצמאות לכידות הדוקה: מה המשותף בין כל המאפיינים וכל המתודות שהוקצו למחלקה? צימוד רופף: עד כמה המחלקה תלויה במחלקות אחרות? תכן תוכנה - 18
מערכת המעליות מחלקת "מעלית" Elev ator - direction: Dir - downschedule: intlist - isactive: boolean - isinorder: boolean - laststop: int - upschedule: intlist + emergencystop() + getstatus(): int + newrequest(): int + rescuecall() + startoperation(): void בנוסף למאפיינים אלה יש גם מצביעים למחלקות אחרות, הנגזרים מיחסי זיקה/הקבצה בנוסף למאפיינים ולמתודות אלה יש גם מאפיינים ומתודות דרך ירושה תכן תוכנה - 19
מערכת המעליות - תרשים מחלקות Diagram) (Class חלקי FloorButton 1..2 Floor Door «abstract» TravelButton - LED: boolean + dirlabel: up_down + floorno: int +ServedFloors 10 + isclosed: boolean + open(): void + close(): void + setled(byte): void ElevatorButton serves +MyDoor 1 + floorlabel: int 0..3 1..* 1..* +MyButtons Elev ator «abstract,virtual» Button + press(): void RescueButton 1 StopButton +MyRB 1 +MySB - direction: Dir - isactive: boolean - isinorder: boolean - laststop: int + startoperation(): void + getstatus(): int + emergencystop() + rescuecall() +MyEngine 1 Engine + goto(floor): void + stop() +MySchedule Schedule - upschedule: intlist - downschedule: intlist + getnextstop(): int + newrequest(int) + clearrequest(int) תכן תוכנה - 20
עקיבות הדרישות הפונקציונליות למודל המחלקות המחלקות שבמודל המחלקות אמורות לספק את כל הפונקציונליות המערכתית מכל דרישה פונקציונלית בטבלת הדרישות יש להצביע למחלקה או למחלקות הרלוונטיות משתתפות בדרישה תפעולית )OR( לדוגמה: "אם לא היה דלוק קודם נדלק הכפתור בעקבות הלחיצה" מספקות את מבני הנתונים עבור דרישות המידע )DR( לדוגמה: "בכל קומה יהיו שני כפתורים" קומה כפתור מכל מחלקה במודל המחלקות יש להצביע על הדרישות הפונקציונליות הרלוונטיות לה תכן תוכנה - 21
הפקה אוטומטית של קוד סטטי ממודל המחלקות - Attributes FloorButton 1..2 Floor Door Class + dirlabel: up_down + floorno: int + isclosed: boolean ElevatorButton +ServedFloors 10 serves Role + open(): void + close(): void +MyDoor 1 + floorlabel: int 0..3 1..* 1..* +MyButtons RescueButton +MyRB 1 1 +MySB StopButton Elev ator - direction: Dir - isactive: boolean - isinorder: boolean - laststop: int + startoperation(): void + getstatus(): int + emergencystop() + rescuecall() +MySchedule Schedule - upschedule: intlist - downschedule: intlist + getnextstop(): int + newrequest(int) + clearrequest(int) +MyEngine 1 Engine + goto(floor): void + stop() public class Elevator { מאפיינים שהוגדרו במפורש מאפיינים שנגזרו מהזיקות } private Dir direction; private boolean isactive; private boolean isinorder; private int laststop; private intlist upschedule; private intlist downschedule; Class Role public Door MyDoor; public list MyButtons; public StopButton MySB; public RescueButton MyRB; public list ServedFloors; public Engine MyEngine; public Schedule MySchedule; תכן תוכנה - 22
הפקה אוטומטית של קוד סטטי ממודל המחלקות - Methods Elev ator - direction: Dir - isactive: boolean - isinorder: boolean - laststop: int + startoperation(): void + getstatus(): int + emergencystop() + rescuecall() Constructor Destructor public class Elevator { מתודות שהוגדרו במפורש public Elevator(){ } public void finalize() throws Throwable { } public void startoperation(){ } public int getstatus(){ return 0; } public emergencystop(){} public rescuecall(){} «<<abstract>>» Trav elbutton - LED: boolean + setled(byte): void ElevatorButton «abs tract,virtual» Button + press(): void + floorlabel: int public class TravelButton extends Button { } private boolean LED; public TravelButton(){ } public void finalize() throws Throwable { super.finalize(); } public void setled(byte on_off){ } תכן תוכנה - 23
הפקה אוטומטית של קוד סטטי ממודל המחלקות ירושות «abstract» TravelButton - LED: boolean + setled(byte): void FloorButton + dirlabel: up_down public class FloorButton extends TravelButton { } public up_down dirlabel; public FloorButton(){ } public void finalize() throws Throwable { } super.finalize(); public abstract class TravelButton extends Button { «abstract,virtual» Button + press(): void private boolean LED; public TravelButton(){ } public void finalize() throws Throwable { super.finalize(); } public void setled(byte on_off){ } } public abstract class Button { public Button(){ } public void finalize() throws Throwable { } public void press(){ } } תכן תוכנה - 24
מימוש תהליכי התוכנה מימוש הפונקציונאליות של כל רכיב באמצעות עצמים בתוכנה פונקציונאליות הרכיב תפקודו במסגרת מימוש התהליכים המערכתיים עצמים בתוכנה על בסיס מודל המחלקות A Comp1 B D C a:a b:b c:c תכן תוכנה - 25
ref Trav elling betw een Floors Sequence Diagram ברמת רכיבים User Request Manager Ongoing Operation Manager Door Engine Operations Manager 1.0 ongoingoperation() loop [while not stuck] 1.3 get next stop request(): int 1.1 close() 1.2 1.4 1.5 go to(n) 1.6 opt Normal Arriv al [arrived at floor] 1.7 open() 1.8 1.9 clear request(int) 1.10 button off() 1.11 report arrival(int): int 1.12 wait(t) תכן תוכנה - 26
מימוש פעילות OngoingOperation של רכיב Ongoing Operation Manager באמצעות העצמים המרכיבים אותו Ev: Elevator MyDoor: Door MySchedule: Schedule MyEngine: Engine ElevatorButton[NS]: ElevatorButton DoorHW: DoorEngineHW: Engine Oper. Mgr. UserPanel 1.0 startoperation() 1.1 close() loop [while not stuck] 1.2 CloseDoor(): StatusCode 1.3 1.4 1.5 NS= getnextstop(): int 1.6 1.7 goto(ns) 1.8 SC= goto(ns): StopCause 1.9 1.10 alt [SC=arrived] 1.11 open() 1.12 OpenDoor(): StstusCode תכן תוכנה - 27
[while not stuck] 1.4 מימוש פעילות OngoingOperation של רכיב Ongoing Operation Manager 1.5 NS= getnextstop(): int באמצעות העצמים המרכיבים אותו )המשך( 1.6 1.3 Ev: Elevator MyDoor: Door 1.7 goto(ns) MySchedule: Schedule MyEngine: Engine ElevatorButton[NS]: ElevatorButton 1.8 SC= goto(ns): StopCause DoorHW: DoorEngineHW: Engine Oper. Mgr. UserPanel 1.0 startoperation() 1.9 1.1 close() 1.10 alt [SC=arrived] 1.11 open() 1.4 1.2 CloseDoor(): StatusCode 1.3 1.12 OpenDoor(): StstusCode 1.5 NS= getnextstop(): int 1.13 1.14 1.6 1.7 goto(ns) 1.15 report arrival() 1.16 clearrequest(ns) 1.8 SC= goto(ns): StopCause 1.17 setled(off) 1.9 1.10 alt [SC=arrived] 1.18 wait(t) 1.11 open() 1.19 button off (NS) 1.12 OpenDoor(): StstusCode 1.13 תכן תוכנה - 28
Floor Panel User Panel Caretaker/Rescuer Commands Floor Button Floor Buttons on/off Rescue Elev. Button Rescue Elev. Buttons on/off Rescuer Panel Operations Manager Task Allocation Request Manager Arrival Reports Central Server Direct Direct Elevator Port Server Port Status Queries Direct (elevators) Elevator Controller Arrival Reports Emergency Stop 1..* Next Stop Queries Arrival Reports Arrival reports Direct (floors) Next Stop Queries Testing Manager Emergency Stop Status Queries Status Queries Ongoing Operation Manager Technician Commands Engine Commands Door Commands Technitian Panel Engine Door [Arrived at floor] [Stuck] «structured» System Operation [System in order] [On site repair impossible] [On site repair possible] כל התורה על רגל אחת... ארגון/עסק use 0..* 0..* User 1 push 1 Button No elevator at floor Elavator at floor התנהגות מערכת מבנה «structured» «structured» Using the service System maintenance Arriving for test System Call elevator testing «datastore» Stopping list Test results Ride elevator Elevator Button 10 Stop Button Rescue Button travel between Direction Button 1..2 Rescue Stopping reason? Repair pending Results? Elevator 3 serve 10 Floor Arriving for repair Repair generates fulfills rescues maintains maintains Stop Request Rescuer Technician Start Up starts up / shuts down CareTaker Shut Down «device» Floor Panel 1..* Central Server «CSCI» Server SW 1..* «device» Technician Panel «device» Rescuer Panel פריטים Elevator Controller «CSCI» Elevator SW User «SUC» 1. Call Elevator «SUC» 2. Ride Elevator Elevator System «SUC» 6. Start Up «SUC» 4. System Testing «SUC» 5. Repair Technician «device» User Panel Elevator Controller «CSCI» Elevator SW «device» Engine «device» Door Rescuer «SUC» 3. Rescue «SUC» 7. Shut Down Caretaker Floor Button Floor Buttons on/off Direct Caretaker/Rescuer Commands Operations Manager Status Queries Task Rescue Allocation Arrival Reports Direct (floors) Direct Testing Manager (elevators) Arrival Reports Status Queries Technician Commands רכיבים par [ ] Request Manager User 1.0 push button(int) 1.1 save request(int) 1.2 button off() Ongoing Operation Manager Engine Rescue Direct Elev. Button Request Manager Elev. Buttons on/off Status Arrival Queries reports Arrival Reports Ongoing Operation Next Stop Queries Next Stop Queries Manager Engine Commands Door Commands Request Manager Ongoing Operation Manager Operations Manager 2.0 push stop button() 2.1 emergency stop() 2.3 2.4 clear all requests() 2.2 stop() Emergency Stop Emergency Stop [ ] ref Ongoing Operation «<<abstract>>» Trav elbutton - LED: boolean FloorButton 1..2 Floor + dirlabel: up_down + floorno: int +ServedFloors 10 Door + isclosed: boolean + open(): void + close(): void יחידות + setled(byte): void ElevatorButton + floorlabel: int 1..* +MyButtons 1..* serves 0..3 Elev ator +MyDoor 1 Ev: Elevator 1.0 startoperation() MyDoor: Door MySchedule: Schedule MyEngine: Engine ElevatorButton[NS]: ElevatorButton DoorHW: DoorEngineHW: Engine Oper. Mgr. UserPanel «abstract,virtual» Button + press(): void RescueButton +MyRB 1 1 +MySB StopButton - direction: Dir - isactive: boolean - isinorder: boolean - laststop: int + startoperation(): void + getstatus(): int + emergencystop() + rescuecall() +MyEngine 1 Engine Schedule - upschedule: intlist - downschedule: intlist + getnextstop(): int + newrequest(int) + clearrequest(int) Schedule - upschedule: intlist - downschedule: intlist + getnextstop(): int + newrequest(int) + clearrequest(int) Schedule - upschedule: intlist - downschedule: intlist + getnextstop(): int + newrequest(int) + clearrequest(int) 1.1 close() 1.4 1.5 NS= getnextstop(): int 1.2 CloseDoor(): StatusCode 1.3 + goto(floor): void + stop() 1.6 +MySchedule 1.7 goto(ns) Schedule 1.8 SC= goto(ns): StopCause - upschedule: intlist - downschedule: intlist 1.9 תכן תוכנה - 29 + getnextstop(): int + newrequest(int) + clearrequest(int) alt [SC=arrived] 1.10 1.11 open() 1.12 OpenDoor(): StstusCode 1.13 1.14 1.15 report arrival()