作業小結3

来源:https://www.cnblogs.com/HullQin/archive/2018/05/28/9101121.html
-Advertisement-
Play Games

作業小結3 規格化設計的發展歷史 最早的程式設計都是採用機器語言來編寫的,直接使用二進位碼來表示機器能夠識別和執行的指令和數據。簡單來說,就是直接編寫0和1的序列來代表程式語言。例如:使用0000代表載入(LOAD),0001代表存儲(STORE)等。 面向機器的語言通常情況下被認為是一種“低級語言 ...


作業小結3

規格化設計的發展歷史

最早的程式設計都是採用機器語言來編寫的,直接使用二進位碼來表示機器能夠識別和執行的指令和數據。簡單來說,就是直接編寫0和1的序列來代表程式語言。例如:使用0000代表載入(LOAD),0001代表存儲(STORE)等。

面向機器的語言通常情況下被認為是一種“低級語言”,為瞭解決面向機器的語言存在的問題,電腦科學的前輩們又創建了面向過程的語言。面向過程的語言被認為是一種“高級語言”,相比面向機器的語言來說,面向過程的語言已經不再關註機器本身的操作指令、存儲等方面,而是關註如何一步一步的解決具體的問題,即:解決問題的過程,這應該也是面向過程說法的來由。

第一次軟體危機:結構化程式設計。根本原因就是一些面向過程語言中的goto語句導致的麵條式代碼,極大的限制了程式的規模。結構化程式設計(英語:Structuredprogramming),一種編程範型。它採用子程式(函數就是一種子程式)、代碼區塊、for迴圈以及while迴圈等結構,來替換傳統的goto。希望藉此來改善電腦程式的明晰性、質量以及開發時間,並且避免寫出麵條式代碼。

為瞭解決問題,在1968、1969年連續召開兩次著名的NATO會議,會議正式創造了“軟體危機”一詞,並提出了針對性的解決方法“軟體工程”。雖然“軟體工程”提出之後也曾被視為軟體領域的銀彈,但後來事實證明,軟體工程同樣無法解決軟體危機。

結構化程式設計的主要特點是拋棄goto語句,採取“自頂向下、逐步細化、模塊化”的指導思想。結構化程式設計本質上還是一種面向過程的設計思想,但通過“自頂向下、逐步細化、模塊化”的方法,將軟體的複雜度控制在一定範圍內,從而從整體上降低了軟體開發的複雜度。結構化程式方法成為了1970年代軟體開發的潮流。

規格化設計被重視的原因

  • 所有的程式開發手冊都包含了各種規則。一些習慣自由程式人員可能對這些規則很不適應,但是在多個開發人員共同協作的情況下,這些規則是必須的。這不僅僅是為了開發效率來考慮,也是為了後期維護考慮。

  • 代碼規格化設計正是為了培養規範設計和編程,養成良好的習慣,增強軟體產品的穩定,健壯,可靠性;同時也提高了軟體的可讀性,可以讓程式員儘快而徹底地理解新的代碼,使產品可維護性提高。

  • 此外,還有如下好處:
  1. 減少維護成本。一個軟體的生命周期中,80%的花費在於維護,另一方面,幾乎沒有任何一個軟體,在其整個生命周期中,均由最初的開發人員來維護,規範的編碼減少人員變動帶來的維護成本。
  2. 改善軟體的可讀性。可以讓程式員儘快而徹底地理解新的代碼。在一個團隊中,代碼也容易在程式員之間共用。
  3. 維護部門交付產品的規範形象。

規格bug的表格分析

規格bug類別 所對應方法的代碼行數 產生原因
第九次作業公測->JSF檢查->不符合JSF規範 4 測試者說REQUIRES必須是一個布爾表達式不能是自然語言
第九次作業公測->JSF檢查->Modifies不完整 5 改了this但沒寫
第九次作業公測->JSF檢查->Requires不完整 8 測試者說有參數必須寫requires
第九次作業公測->JSF檢查->Requires邏輯錯誤 4 測試者說有參數必須寫requires
第十次作業公測->規格檢查->方法規格檢查->JSF不符合規範 7 測試者說我沒使用布爾表達式
第十一次作業公測->規格檢查->抽象對象有效性實現檢查:Overview是否明確抽象對象 - 測試者說Overview過於簡陋,僅是名字的翻譯,未體現出數據抽象思想
第十一次作業公測->規格檢查->抽象對象有效性實現檢查:Overview是否明確抽象對象 - 測試者說您的Taxi類、Settings類、Light類等等,Overview都相當的“抽象”啊,僅僅將名字翻譯過來,或者是名詞,或者是動詞短語,並沒有體現其真正含義所在。
第十一次作業公測->規格檢查->方法規格檢查->JSF不符合規範 1 測試者說規範的表示是:\result==this.point0; 而你是* @EFFECTS: return this.point0;。

前置條件與後置條件案例

前置條件

  1. * @REQUIRES: other != null
    改進:* @REQUIRES: other instanceof TrackableTaxi && other != null
    說明:requires不夠完整,對於某些方法應該更明確表明它的類型。
  2. * @REQUIRES: this != null
    改進:* @REQUIRES: None
    說明:一般情況下this是不會等於null的,這大概是一句廢話。
  3. * @REQUIRES: None
    改進:* @REQUIRES: this.property > 0
    說明:該方法要求其它方法執行過後才能執行,而其它方法執行過後的當且僅當的標誌是某個屬性大於零。於是就這樣子改了。
  4. * @REQUIRES: this.property != null
    改進:* @REQUIRES: None
    說明:類中有一個repOK的方法,要求property不是Null。而property屬性在構造方法中已經保證了不是Null。因此這是廢話。
  5. * @REQUIRES: x >=0 && x <= 79
    改進:* @REQUIRES: x >= 0 && x <= MAP_MAX_LENGTH
    說明:之前定義過常量MAP_MAX_LENGTH,這裡就不適合寫79了,不然以後要改地圖尺寸時得改很多東西。其它所有常量同理。

後置條件

  1. * @EFFECTS: return this.property
    改進:* @EFFECTS: \result == this.property
    說明:常見的語法問題。感謝測試者幫我找到這個問題。
  2. * @EFFECTS: \result = this.property
    改進:* @EFFECTS: \result == this.property
    說明:常見的語法問題。感謝我舍友的測試者幫我舍友找到這個問題。
  3. * @EFFECTS: this != null
    改進:* @EFFECTS: this.property == value
    說明:構造方法不能寫的過於簡單。
  4. * @EFFECTS: 初始化該實例
    改進:* @EFFECTS: this.property == value
    說明:構造方法不能寫的過於簡單,即使使用自然語言。
  5. * @EFFECTS: linkedList.contains(request); 改進: * @EFFECTS: linkedList.contains(request) && linkedList.size = \old(linkedList).size + 1`
    說明:沒有列出所有變化。

功能bug與規格bug的聚集關係

方法名 功能bug數 規格bug數
Line 0 1
Taxi 0 2
initTaxis 0 1
checkSameUser 0 1
getPoint0 0 1

看的出來,功能bug數跟規格bug數是相關的。如果一個方法連規格都寫錯了,那麼它的功能是很難正確的。不論是構造方法還是普通的方法,都是這樣子的。當然前提是寫代碼的人是根據規格來寫的代碼。

如果寫規格的人和寫代碼的人不是同一個人,這個結論應該就很顯然了。

我們常常做測試時,就對方法單獨的測試,只要輸入滿足規格的requires,檢查輸出是否滿足effects就好了。如果測試通過,且modifies正確,那麼就較大概率沒bug(因為並未進行完備的測試)。這樣單獨的方法對了,才是對的。

設計規格和撰寫規格的思路和體會

先說體會吧!首先感謝課程組讓我們訓練設計和撰寫規格。

老師課上總是強調設計規格的重要性,雖然大家寫得很累,但是我覺得老師說得很對。設計規格確實是最重要的。尤其是在團隊協作中。

所有的程式開發手冊都包含了各種規則。我們可能對這些規則很不適應,但是在多個開發人員共同協作的情況下,這些規則是必須的。這不僅僅是為了開發效率來考慮,也是為了後期維護考慮。所以我覺得老師說的很對。

關於設計規格和撰寫規格。我的思路如下:

首先,我們要根據設計需求,進行架構,做數據抽象,總結出幾個類,弄清楚各個類的定義,弄清楚各個類之間如何交互,弄清楚各個類如何相互合作最終把這些設計需求來實現。

其次,根據數據抽象,弄清楚各個類需要哪些屬性。

再然後,根據設計需求,弄清楚類需要哪些方法,而這些方法需要被哪個或哪些類調用。又或者它僅僅只是一個內部方法。弄清楚這個方法要實現什麼樣的功能。這裡我想起來老師上課常常講的話,就是寫JSF時千萬別去想演算法。所以,這一步,先不考慮演算法怎麼實現,只考慮這個方法的功能。另外這一步要保證代碼的邏輯是正確的。

再之後,開始寫設計規格。根據上一布自己所想的,寫好設計規格。註意require effect的正確性。

再之後,開始寫代碼,就實現那些方法。這裡要註意演算法的正確性,註意,如果有modify,可能還需要修改一下設計規格。

最後,測試程式,檢查代碼功能是否正確。如果功能錯誤,可能是在設計規格時邏輯錯誤,也可能是代碼在具體實現時演算法錯誤或者編碼錯誤。要從這兩個方向來找bug,最終得到正確的程式。

最後謝謝老師們謝謝助教們謝謝同學們!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • vue Timeline 時間軸不顯示渲染的效果 官網代碼 複製官網代碼之後,顯示效果是,沒有想要的渲染效果 解決辦法:將Timeline改為Time line,TimelineItem改為Timeline Item 完整代碼 參考 "http://www.it399.com/blog/html/2 ...
  • 前言: 在說到實現元素的展開收縮,通常的想法是通過控制display的元素屬性和none之間的切換,雖然說功能可以實現,但是這種展開是沒有任何動畫的效果,只是單純的顯示與隱藏。例外一種方法就是通過JQuery的slideUp()、slideDown()方法,這是jQuery帶有的功能屬性,大家都應該 ...
  • CSS3 邊框 CSS3 邊框圓角 ... ...
  • ``` // 手機號分隔顯示 let tel = this.data.tel_value // 原始手機號 let len = tel_value.length // 原始手機號的長度 let mobile = '' for (var i = 0; i ...
  • 什麼是裝飾者模式 今天我們來講另外一個非常實用的設計模式: 。這個名字聽上去有些莫名其妙,不著急,我們先來記住它的一個別名: 。 我們記著這兩個名字來開始今天的文章。 首先還是上《設計模式》一書中的經典定義: 1. 動態地給一個對象添加一些額外的職責。 2. 就增加功能來說,裝飾者模式相比生成子類更 ...
  • 一、什麼是代理模式 關於代理模式,我們聽到的見到的最多的可能就是靜態代理、動態代理之類的,當然還有大家都知道的Spring Aop,這裡我們先不談這些個代理,先說個簡單的例子。游戲代練應該都聽說過,許多人肯定也找過代練,曾經DNF、LOL、COC等等游戲的代練很多,當然現在各類游戲層出不窮,也都有各 ...
  • 1.模型管理 :web線上流程設計器、預覽流程xml、導出xml、部署流程 2.流程管理 :導入導出流程資源文件、查看流程圖、根據流程實例反射出流程模型、激活掛起 3.運行中流程:查看流程信息、當前任務節點、當前流程圖、作廢暫停流程、指派待辦人 4.歷史的流程:查看流程信息、流程用時、流程狀態、查看 ...
  • 簡介: 動態的給一個對象添加一些額外的職責,就增加功能來說,裝飾模式比生產子類更加靈活——《大話設計模式》; 結構圖: 優點: 缺點: 應用場景: 註意事項: 示例: 1.結構類的實現: 被裝飾抽象類和被裝飾具體類 裝飾抽象類和具體裝飾類 客戶端 執行結果 2.裝飾器模式之DOTA英雄學習技能 英雄 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...