面向對象課程 第三次博客總結

(一)規格化設計的發展編程


  人們在脫離了面向機器的語言,建立了當時看來更高級的面向過程的語言後,大大地提高了編程效率,但一些面向過程的語言中的goto語句極大地限制了程序的規模。規格化程序設計採用子程序(好比函數)、代碼區塊、for循環以及while循環等結構來替換傳統的goto,以此來改善計算機程序的明晰性、質量以及開發時間。dom

  隨着計算機硬件的飛速發展,應用複雜度愈來愈高,原有的程序開發方法已經愈來愈不能知足人們的需求。19世紀60年代爆發了表現爲軟件質量低下、項目沒法如期完成、項目嚴重超支等狀況的軟件危機。模塊化

  通過一段時間的探索,人們提出了「規格化程序設計」來解決軟件危機。1968年戴克斯特拉發表了著名的《GOTO有害論》,引發了人們多方的探討,在這個過程當中,規格化程序設計方法誕生。與此同時,第一個結構化的程序語言Pascal誕生,並迅速流行。函數

 規格化程序設計的主要特色是拋棄 goto 語句,採起「自頂向下、逐步細化、模塊化」的指導思想。規格化程序設計經過「自頂向下、逐步細化、模塊化」的方法,將軟 件的複雜度控制在必定範圍內,從而從總體上下降了軟件開發的複雜度。結構化程序方法成爲了 1970 年 代軟件開發的潮流。測試

(二)規格BUGui


  沒有被報規格bug,多是測試者偷懶,又或者測試者也堅決地維護和諧六系。可是不報不等於沒有,我的檢查發現的bug仍是有。好比有兩個方法的規格是用天然語言寫的。以及,存在不規範的使用現象。this

(三)規格BUG產生的緣由spa


  一、誠如老師所言,許多方法都是先寫了代碼,再回頭寫的規格,因此有差錯;debug

  二、對於JSF規範的掌握不夠牢固,不少時候寫的時候還要對照回去,致使出現語法的錯誤;設計

  三、規格實際上是爲了寫好代碼服務的,但代碼以及寫好了,再回頭寫規格,有種多餘之感,認識上的偏差;

  四、某些狀況不知道如何表達,展開又過於龐大,只好用天然語言代替。

(四)錯誤寫法和改進


 @REQUIRES:
  一、偷懶型

public Taxi(int i,TaxiGUI g,mapInfo map,int _type);
/**
* @REQUIRES:Null * @MODIFIES:this.num * this.state * this.waitTime * this.credit * this.rtime * this.gui * this.taxiCoordinate[0] * this.taxiCoordinate[1] * this.m * @EFFECTS: this.num=i; * this.state=2; * this.waitTime=0; * this.credit=0; * this.rtime=0; * this.gui=g; * this.taxiCoordinate[0]=new Random().nextInt(80); * this.taxiCoordinate[1]=new Random().nextInt(80); * this.m=map; */

顯然在這個構造器中,對於輸入的出租車編號以及地圖是有要求的,無腦寫Null,就爲了簡化工做量。

改進:

public Taxi(int i,TaxiGUI g,mapInfo map,int _type);
        /**
         * @REQUIRES:(0<=i<80 && map is Connecting diagram)
         * @MODIFIES:this.num
         *            this.state
         *            this.waitTime
         *            this.credit
         *            this.rtime
         *            this.gui
         *            this.taxiCoordinate[0]
         *            this.taxiCoordinate[1]
         *            this.m
         * @EFFECTS:    this.num=i;
         *            this.state=2;
         *            this.waitTime=0;
         *            this.credit=0;
         *            this.rtime=0;
         *            this.gui=g;
         *            this.taxiCoordinate[0]=new Random().nextInt(80);
         *            this.taxiCoordinate[1]=new Random().nextInt(80);
         *            this.m=map;
         */

二、自創符號代替規範語法型

public void setCoordinate(int x,int y) ;
        /**
         * @REQUIRES:0<=x<80, 0<=y<80
         * @MODIFIES:this.taxiCoordinate
         * @EFFECTS:set the taxi's coordinate to be(x,y)
         */

其中  「,」  是做者本身想固然使用的表達而且的符號,應該替換爲 「&&」

改進:

public void setCoordinate(int x,int y) ;
        /**
         * @REQUIRES:0<=x<80 && 0<=y<80
         * @MODIFIES:this.taxiCoordinate
         * @EFFECTS:set the taxi's coordinate to be(x,y)
         */

三、天然語言型:

public synchronized int [][] getto(int[] coordinate,Order o,int sta) ;
        /**
         * @REQUIRES:\exist coordinate in map
         *             \exist o
         * @MODIFIES:coordinate,state
         * @EFFECTS:set the taxi to coordinate
         *          record the pass point information in o
         */

顯然是假裝成正確語法的天然語言

public synchronized int [][] getto(int[] coordinate,Order o,int sta) ;
        /**
         * @REQUIRES:map.contains(coordinate)
         *              o!=Null
         * @MODIFIES:coordinate,state
         * @EFFECTS:set the taxi to coordinate
         *          record the pass point information in o
         */

四、不完整型

public Order(int scx,int scy,int dcx,int dcy,Taxi[] t,int ind);
        /**
         * @REQUEST:0<=scx,scy,dcx,dcy<80
         * @MODIFIES:Order
         * @EFFECT:initial the order
         */

對照代碼我發現其實實現的功能中對參數的要求不止於此,還有對於t以及ind的要求

public Order(int scx,int scy,int dcx,int dcy,Taxi[] t,int ind){
        /**
         * @REQUEST:0<=scx,scy,dcx,dcy<80 && t!=null && 0<=ind<100
         * @MODIFIES:Order
         * @EFFECT:initial the order
         */

五、忘寫型

public void SetarriveSrctime(long t) ;
//空空如也

改正:

public void SetarriveSrctime(long t) ;
        /**
         * @REQUIRES:None
         * @MODIFIES:arriveSrctime
         * @EFFECTS:arriveSrctime=t
         */

 

@EFFRCTS:(同上)
一、偷懶型:

public void SetarriveSrctime(long t) ;
        /**
         * @REQUIRES:None
         * @MODIFIES:arriveSrctime
         * @EFFECTS:None
         

Modifiels都說有改動,而後騙我說EFFECTS沒有

public void SetarriveSrctime(long t) ;
        /**
         * @REQUIRES:None
         * @MODIFIES:arriveSrctime
         * @EFFECTS:arriveSrctime=t
         */

二、自創符號型:

public int[] getDstCoordinate() ;
        /**
         * @REQUIRES:None
         * @MODIFIES:None
         * @EFFECTS:\result=dstCoordinate
         */

不應是「=」,而是「==」

public int[] getDstCoordinate() {
        /**
         * @REQUIRES:None
         * @MODIFIES:None
         * @EFFECTS:\result==dstCoordinate
         */

三、天然語言型:

public Order(int scx,int scy,int dcx,int dcy,Taxi[] t,int ind);
        /**
         * @REQUEST:0<=scx,scy,dcx,dcy<80 && t!=null && 0<=ind<100
         * @MODIFIES:Order
         * @EFFECT:initial the order
         */

多是由於規範寫的話,要寫的太多了吧

public Order(int scx,int scy,int dcx,int dcy,Taxi[] t,int ind){
        /**
         * @REQUEST:0<=scx,scy,dcx,dcy<80 && t!=null && 0<=ind<100
         * @MODIFIES:Order
         * @EFFECT:
         *          this.srcCoordinate[0]=scx;
         *          this.srcCoordinate[1]=scy;
         *          this.dstCoordinate[0]=dcx;
         *          this.dstCoordinate[1]=dcy;
         *          this.ordtime=System.currentTimeMillis()/500*500;
         */

四、不完整型

public void iteration() ;
        /**
         * @REQUIRES:NONE
         * @MODIFIES:None
         * @EFFECTS:
         *             (type==1)==>\result==iter
         */

事實上,還有一個分支條件

public void iteration() {
        /**
         * @REQUIRES:NONE
         * @MODIFIES:None
         * @EFFECTS:
* (type!=1)==>\result=="the taxi is not vip!" * (type==1)==>\result==iter
*/

五、忘寫型

public void SetarriveSrctime(long t) ;
//空空如也

改正

public void SetarriveSrctime(long t) ;
        /**
         * @REQUIRES:None
         * @MODIFIES:arriveSrctime
         * @EFFECTS:arriveSrctime=t
         */

(五)功能BUG和規格BUG的彙集關係


 

序號 功能BUG 出現BUG的方法
1 邊界的出租車在判斷流量是忘記越界問題,致使CRASH Taxi類,getto函數
2 車輛回頭現象 流量的刷新時間與車輛運行時間不協調

(六)心得體會


 

  一、在寫代碼的時候,應該提早想好本身想要實現什麼,如何實現,一個方法須要哪些數據,他會對個人類產生什麼樣的影響,這樣寫出來的代碼有據可循,不管是debug仍是未來改動都會方便得多;

  二、撰寫JSF能夠很好地表現一個方法的特性,就像是這個方法的使用說明書,也是編程者的生產設計圖。不管是本身再看代碼,或者其餘使用者使用你的方法,都會十分便捷。

相關文章
相關標籤/搜索