天天看點

OO第三階段作業總結

調研:

       最早的程式設計是直接采用機器語言來編寫的,或者使用二進制碼來表示機器能夠識别和執行的指令和資料。機器語言的優點在于速度快,缺點在于寫起來實在是太困難了,程式設計效率低,可讀性差,并且編寫規模大的程式。之後逐漸産生了面向過程和面向對象的程式設計思想,來滿足不同條件下的程式設計方式。1968年《GOTO有害論》這篇著名的論文發表後,引起了許多人的廣泛關注,結構化思想逐漸進入人們的視野。之後在程式設計過程中,程式員越來越對已經産生的抽象水準不滿,不足以滿足他們對規模大的程式編寫的需求,是以出現了一種語言機制,也就是規格化抽象,允許程式員在需要時建構自己的規格化設計方法。規格化抽象是将運作細節(即子產品如何實作)抽象為使用者所需求的行為(即子產品做什麼)。在規格化設計的基礎上,各個子產品表達得簡明扼要,可讀性強,規模大,耦合性好,是以越來越受到人們的重視。規格化是程式發展所必要的條件。

BUG分析:

        第九次作業:

BUG内容 BUG類型 BUG原因
map加載錯誤 crash 在loadfile的時候存取數組越界
計程車運作20s沒有停1s error 在設定計程車行駛方式時疏忽
地圖檔案中有空格 未處理異常情況
計程車運作一邊的時間有可能超過500ms  随機數設定錯誤

        BUG産生原因:這次的BUG最主要的問題在于對新增的要求Loadfile的設計過于粗略,沒有考慮到各種不合理的情況,在功能上的實作不完全,同時也沒有花時間去debug,認為其不重要,這就是自食其果,然後導緻了兩個crash類型的bug,其實測試者很善良,如果再仔細一點,估計還會多很多的crash類BUG。同時由于上次沒有發現這兩個error的BUG,導緻這次被測了出來。總而言之就是設計不夠細緻,同時沒有花時間去debug。

        第十次作業:

沒有選擇流量最小的路徑 在讀取流量檔案時存儲出錯
排程時間少于7.5s 由于整體時間上升,但忘記設定排程時間了

        BUG産生原因:這次的BUG蠢得讓我無話可說,先說排程時間少于7.5s,由于之前改變了計程車行駛地圖一條邊的時間,從200ms增到了500ms,于是計程車排程時間從3s增加到了7.5s,但是我忘記改正這個地方了。不知道為什麼上一次作業沒給我測出來,然後一直錯到了現在。很神秘。

        第十一次作業:

        經過兩次作業的痛定思痛,把前兩次的bug全部de完了,并且這次作業是最後一次程式設計作業,是以格外用心,是以沒有被挑出bug來,可以說結尾得還行了。

JSF的不足和改進:

        前置:

        1. 大量使用None;(本人就喜歡這麼幹)

            例如:方法public boolean judge(String filename)

            改正前:@REQUIRES: None;

            改正後:@REQUIRES: filename != null;

        2. 缺乏類型描述

            改正前:@REQUIRES: map.exist && map.bound <= 80;

            改正後:  @REQUIRES: map.exist == true && map.bound <= 80;

        3. 忽略範圍限制

            例如:方法public BFS(point E, point S)

            改正前:@REQUIRES: E != null && S != null;

            改正後:@REQUIRES: 0<= E.getx() <=79&&0<= E.gety() <=79 && 0<= S.getx() <=79&&0<= S.gety() <=79;

        4. 多餘的前置條件

            改正前:@REQUIRES: num != null && num <= 80;

            改正後:@REQUIRES: num <= 80;

        後置:

        1. 使用自然語言(本人見過直接用中文的)

            改正前:@REQUIRES: 如果a包含了b,則傳回true;

            改正後:  @REQUIRES: a.contains(b) ==> (/result == true);

        2. 考慮得不周到,隻寫了一部分

            改正前:@REQUIRES: a.contains(b);

            改正後:@REQUIRES: a.contains(b) && a.size() = a.size() - 1;

        3. 使用了錯誤的僞布爾式子

            改正前:@REQUIRES: flow.add;

            改正後:@REQUIRES: flow.add == true;

        目前遇到的,并且也隻能想到以上幾點前置條件和後置條件容易出錯的地方。其實使用自然語言是可以的,但是不能大量使用,還是應當使用布爾表達式來表示。其實感覺JSF的撰寫還是十分的有必要的,在debug的時候,JSF能夠起到很好的預覽作用,可以大緻判斷出bug出現的位置。第一次寫可能會出錯或者不适應,到後來就發現了JSF的實用之處。

感想和體會:

        本人在完成作業時,是把整個程式的功能都完成後,再回頭去寫JSF的規格設計,然後發現對于代碼量龐大的方法,需要花大量時間去回憶這個部分的功能和作用才能完成JSF的撰寫。而且再debug階段也很花費時間和精力。是以規格應當是在方法撰寫之前就開始設計,同時在代碼中就應當按照規格來完成方法。這樣不僅在設計時不需要花費大量時間去處理,在debug時也能更快的找到問題出現的位置。OO的程式設計作業終于完結了,撒花撒花。