日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

      歡迎訪問 生活随笔!

      生活随笔

      當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

      编程问答

      OO第三次博客作业——规格

      發(fā)布時(shí)間:2023/12/2 编程问答 29 豆豆
      生活随笔 收集整理的這篇文章主要介紹了 OO第三次博客作业——规格 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

      OO第三次博客作業(yè)——規(guī)格

      一、調(diào)研結(jié)果:

      規(guī)格的歷史:

      引自博文鏈接:http://blog.sina.com.cn/s/blog_473d5bba010001x9.html

      傳統(tǒng)科學(xué)的特點(diǎn)是發(fā)現(xiàn)世界,而軟件的特點(diǎn)是構(gòu)造世界。軟件的最底層就是0,1,兩個(gè)離散的值。

      程序設(shè)計(jì)語言的三次分離使軟件技術(shù)產(chǎn)生了飛躍

      1950年代,第一次分離,主程序和子程序的分離程序結(jié)構(gòu)模型是樹狀模型,子程序可先于主程序編寫。通過使用庫函數(shù)來簡化編程,實(shí)現(xiàn)最初的代碼重用。產(chǎn)生基本的軟件開發(fā)過程:分析—設(shè)計(jì)—編碼—測試,使大型軟件系統(tǒng)的開發(fā)成為可能

      1975—1980年代,第二次分離,規(guī)格說明(Spec)和體(body)的分離說明是類型定義和操作描述,體是操作的具體實(shí)現(xiàn)。(具體的例子就是C++,Java等面向?qū)ο笳Z言的類說明與類實(shí)現(xiàn)的分離。)解決方案設(shè)計(jì)只關(guān)注說明,實(shí)現(xiàn)時(shí)引用或者設(shè)計(jì)體。體的更改、置換不影響規(guī)格說明,保證了可移植性。支持多機(jī)系統(tǒng),但要同樣環(huán)境。此時(shí)產(chǎn)生了劃時(shí)代的面向?qū)ο蠹夹g(shù)。

      1995—2000年代,第三次分離,對象使用和對象實(shí)現(xiàn)的分離

      基于構(gòu)件開發(fā):標(biāo)準(zhǔn)化的軟件構(gòu)件如同硬件IC,可插拔,使用者只用外特性,不計(jì)內(nèi)部實(shí)現(xiàn)。Web Services:軟件就是服務(wù)。分布式,跨平臺(tái),松耦合。

      為什么規(guī)格很重要?

      這三次分離中的第二次就是OO課程要求我們?nèi)プ龅?#xff0c;也是面向?qū)ο蟮木?。在大型?xiàng)目的開發(fā)中,單個(gè)項(xiàng)目不可能由一個(gè)人完成。多人協(xié)作共同完成任務(wù)就意味著不僅僅需要知道自己的代碼做了什么,還要知道別人的代碼做了什么。自己的代碼是自己寫出來的,具體怎么實(shí)現(xiàn),使用了什么樣的數(shù)據(jù)結(jié)構(gòu),使用了什么樣的算法,當(dāng)然知道自己的程序會(huì)對什么產(chǎn)生影響,需要什么樣的輸入 。假設(shè)有個(gè)人寫了一個(gè)方法,寫好了,實(shí)現(xiàn)了,于是,他交了這份代碼上去,你要使用這個(gè)方法,一看,這什么**玩意?;藭r(shí)間適應(yīng)了代碼風(fēng)格,知道要干嘛之后,寫自己的代碼進(jìn)行測試,一測,bug,找了半天,發(fā)現(xiàn)是他和你的代碼對于某個(gè)變量能不能修改有沖突。浪費(fèi)了很長時(shí)間,再交給上面。。惡行循環(huán)。于是,規(guī)格的誕生可以說是拯救了這個(gè)局面。拿到代碼,看前置條件,副作用,后置條件,就很清晰,永無bug(當(dāng)然是不可能的)。

      軟件工程行業(yè)代碼也越來越復(fù)雜,多人協(xié)作是必不可少,規(guī)格在我看來是代碼風(fēng)格的調(diào)和劑,多人項(xiàng)目運(yùn)作的潤滑油。

      二、功能與規(guī)格BUG:

      第9,10,11次,三次都沒有被報(bào)功能bug和規(guī)格bug(當(dāng)然不是我程序?qū)懙煤?#xff0c;運(yùn)氣運(yùn)氣運(yùn)氣)。

      但是還是想說明一下,自己在規(guī)格上的一些不足和功能上的一些不足。

      JSF上:

      JSFbug原因
      后置條件使用了較多的自然語言因?yàn)椴糠址椒ㄔ谠O(shè)計(jì)的時(shí)候沒有設(shè)計(jì)好,行數(shù)較長,使用布爾表達(dá)式過于繁雜,有點(diǎn)嫌麻煩
      副作用有幾個(gè)函數(shù)存在問題,比如System.out缺失這是我剛和同學(xué)交流時(shí)才發(fā)現(xiàn)的(捂臉),剛開始的時(shí)候?qū)懥?#xff0c;但是JSF檢查工具給我報(bào)wrong,我就一直沒寫emm

      功能上:

      功能bug原因
      (前兩次作業(yè)都存在,第11次作業(yè)修復(fù))接客時(shí)正好處于請求起點(diǎn)時(shí),車輛無法正常運(yùn)行屬于狀態(tài)機(jī)中的邊界狀況,在計(jì)算下一個(gè)到達(dá)位置的時(shí)候,判斷的是下一個(gè)位置與起始點(diǎn),忽略了邊界情況

      三、列舉不好的寫法和改進(jìn):

      前置1:不判斷是否對象是否存在

      1 /** 2 * @REQUIRES: None; 3 * @MODIFIES: this.req; this.position; 4 * @EFFECTS: this.req == req; this.position == position; 5 */ 6 public Record(Request req, Point p) { 7 this.req = req; 8 this.position = p; 9 } 10 //正確寫法 11 /** 12 * @REQUIRES: req != null && p != null; 13 * @MODIFIES: this.req; this.position; 14 * @EFFECTS: this.req == req; this.position == position; 15 */ 16 public Record(Request req, Point p) { 17 this.req = req; 18 this.position = p; 19 }

      前置2:不判斷值是否符合實(shí)際

      /*** @REQUIRES: None;* @MODIFIES:this.index; * @EFFECTS: this.index == index;*/public TaxiCar(int index) { this.index = index;} //正確 /*** @REQUIRES: 0<=index<100;* @MODIFIES:this.index; * @EFFECTS: this.index == index;*/public TaxiCar(int index) { this.index = index;}

      前置3:未使用布爾表達(dá)式

      /*** @REQUIRES: index is in 0-100;* @MODIFIES:this.index; * @EFFECTS: this.index == index;*/public TaxiCar(int index) { this.index = index;} //正確 /*** @REQUIRES: 0<=index<100;* @MODIFIES:this.index; * @EFFECTS: this.index == index;*/public TaxiCar(int index) { this.index = index;}

      前置4:遺漏

      /*** @REQUIRES: req != null;* @MODIFIES: this.req; this.position;* @EFFECTS: this.req == req; this.position == position;*/public Record(Request req, Point p) {this.req = req;this.position = p;} //正確寫法 /*** @REQUIRES: req != null && p != null;* @MODIFIES: this.req; this.position;* @EFFECTS: this.req == req; this.position == position;*/public Record(Request req, Point p) {this.req = req;this.position = p;}

      前置5:布爾表達(dá)式描述邏輯錯(cuò)誤

      /*** @REQUIRES: req != null && index >= 80 || index < 0;* @MODIFIES: this.req; this.index;* @EFFECTS: this.req == req; this.index; */public Record(Request req, int index) {this.req = req;this.index = index;} //正確寫法 /*** @REQUIRES: req != null && (index >= 80 || index < 0);* @MODIFIES: this.req; this.index;* @EFFECTS: this.req == req; this.index; */public Record(Request req, int index) {this.req = req;this.index = index;}

      后置1:未使用布爾表達(dá)式

      /*** @REQUIRES: req != null && p != null;* @MODIFIES: this.req; this.position;* @EFFECTS: this.req = req; this.position = position;*/public Record(Request req, Point p) {this.req = req;this.position = p;} //正確 /*** @REQUIRES: req != null && p != null;* @MODIFIES: this.req; this.position;* @EFFECTS: this.req == req; this.position == position;*/public Record(Request req, Point p) {this.req = req;this.position = p;}

      后置2:使用自然語言

      /*** @REQUIRES: req != null;* @MODIFIES: None;* @EFFECTS: 判斷起始點(diǎn)與目標(biāo)點(diǎn)是否為同一個(gè)點(diǎn)*/public boolean samedest(Request req) {if(req.getSrc().equals(req.getDst())) {return true;}else return false;} //正確 /*** @REQUIRES: req != null;* @MODIFIES: None;* @EFFECTS: (req.getSrc() == req.getDst()) ==> \result == true;* (req.getSrc() != req.getDst()) ==> \result == false;*/public boolean samedest(Request req) {if(req.getSrc().equals(req.getDst())) {return true;}else return false;}

      后置3:未處理異常

      public static int min (int[ ] a) throws NullPointerException, EmptyException /**@ EFFECTS: \result == \min a; */ //正確 public static int min (int[ ] a) throws NullPointerException, EmptyException /**@ EFFECTS: normal_behavior\result == \min a; (a == null) ==> exceptional_behavior (NullPointerException); (a.length == 0) ==> exceptional_behavior (EmptyException); */

      后置4:描述不準(zhǔn)確

      /*** @REQUIRES : None; * @MODIFIES : this.AskList;* @EFFECTS : AskList.contains(ask);*/public synchronized void addAsk(Ask ask){AskList.add(ask);} //修改為 /*** @REQUIRES : None; * @MODIFIES : this.AskList;* @EFFECTS : AskList.contains(ask) && AskList.size == \old(AskList).size + 1;*/public synchronized void addAsk(Ask ask){AskList.add(ask);}

      后置5:多線程規(guī)格

      /*** @REQUIRES : None; * @MODIFIES : this.AskList;* @EFFECTS : AskList.contains(ask) && AskList.size == \old(AskList).size + 1;*/public synchronized void addAsk(Ask ask){AskList.add(ask);} //正確 /*** @REQUIRES : None; * @MODIFIES : this.AskList;* @EFFECTS : AskList.contains(ask) && AskList.size == \old(AskList).size + 1;* @THREAD_EFFECTS : \locked(Asklist);*/public synchronized void addAsk(Ask ask){AskList.add(ask);}

      四、感想與體會(huì):

      首先說一下自己在寫規(guī)格的體會(huì)。即便是知道規(guī)格的重要性,在第一次寫規(guī)格的時(shí)候還是抗拒的,因?yàn)橛绕涫呛笾脳l件,全部寫成布爾表達(dá)式是真的很難受。在OO實(shí)驗(yàn)課上提供的代碼相對來說都比較簡單,所以寫成布爾表達(dá)式相對來說比較容易,使用布爾表達(dá)式來寫具體實(shí)現(xiàn)也比較容易,但是自己寫的代碼有些結(jié)構(gòu)相對來說比較復(fù)雜,除了一些比較簡單的轉(zhuǎn)換函數(shù),JSF寫的感覺很規(guī)范,其他都或多或少存在著問題?;蛘呤菍?shí)在想不到如何用布爾表達(dá)式表示偷摸摸用了自然語言啊,或者就像自己上面列的部分毛病啊,或者是自己對JSF原則上的一些忽略啊,等等。雖然這幾次互測我沒有被報(bào)bug,但是看周圍同學(xué)被報(bào)的BUG,也知道自己的JSF存在很大的問題。

      我在扣別人JSF時(shí)候,還是比較松的,第一次報(bào)了兩個(gè)問題比較嚴(yán)重的,后面兩次就只報(bào)了一個(gè)方法遺漏了JSF的bug。我會(huì)隨機(jī)挑選幾個(gè)函數(shù)的JSF進(jìn)行查看,看能否get到這個(gè)函數(shù)的意思,我覺得能夠讓很多人快速理解代碼的作用而不是每一行看代碼找方法的作用就是JSF的精華。

      還是挺開心的,OO的代碼作業(yè)終于也是結(jié)束了,三次作業(yè)在設(shè)計(jì)上雖然不是十分的滿意,但還是完成了基本的任務(wù)。雖然有一個(gè)邊界條件直到最后一次作業(yè)才解決(其實(shí)我在第10次作業(yè)就發(fā)現(xiàn)了這個(gè)bug,原因是提交之前想測試一下能不能編譯通過,結(jié)果出現(xiàn)了bug,復(fù)現(xiàn)了幾遍都失敗了,但是已經(jīng)沒有了時(shí)間,僅僅是初步判定了bug的可能位置,后來確實(shí)是我想的地方出了問題)。

      最后,我記得第九次作業(yè)測試我的老哥在最后一個(gè)公測點(diǎn),寫了,和諧六系,OO不易,與君共勉,當(dāng)時(shí)很感動(dòng)。然后第10次和第11次作業(yè)都遇到了好人(或者是摸魚測試者)。怎么說呢,雖然感謝老哥給我送分,但是感覺自己的程序的bug也被隱藏了emmmm。其實(shí)自己在課下有時(shí)候也能聽到一些同學(xué)對OO互測的抱怨,有佛系測試者,有對結(jié)果很不滿,有想擊潰對面心理防線的(害怕&&鄙視),有惡意扣分獲利的,怎么說呢,面向運(yùn)氣是一方面,課程的精髓有時(shí)候被掩蓋了。引入公測是好事,雖然我是公測的受害者(為什么呢,因?yàn)榈谌巫鳂I(yè),格式上出了錯(cuò)誤導(dǎo)致公測全WA,被判了無效,如果是后幾次的測試模式,我覺得也就是一個(gè)BUG的事,不至于無效。也不是開脫,畢竟是自己不小心,甚至第四次作業(yè)臨交前,對了十幾遍輸出害怕再無效。要說覺得很難受就是第四次作業(yè)的時(shí)候有同學(xué)甚至輸出了調(diào)試信息,都沒有判無效,覺得很不平emmmm)。

      這句話真的很好,和諧六系,OO不易,與君共勉。一起走向未來,Code the world! Debug the world!

      ?

      轉(zhuǎn)載于:https://www.cnblogs.com/xiaoxin83121/p/9101785.html

      總結(jié)

      以上是生活随笔為你收集整理的OO第三次博客作业——规格的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

      如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。