(一)規格化設計的發展編程
人們在脫離了面向機器的語言,建立了當時看來更高級的面向過程的語言後,大大地提高了編程效率,但一些面向過程的語言中的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能夠很好地表現一個方法的特性,就像是這個方法的使用說明書,也是編程者的生產設計圖。不管是本身再看代碼,或者其餘使用者使用你的方法,都會十分便捷。