oo第三次博客-JML規格

這三周的作業主要是圍繞以JML來約束代碼開發,以確保程序的正確性與魯棒性。

Part 1:三次作業的實現與bug

第一次作業沒有任何算法和數據結構上的難度,對于Path和PathContainer的各個方法的實現按照給出的規格復讀即可。唯一的難點(大約也不算難點)便是將NodeId進行映射,用hashmap就好,不過注意不要做一個調包俠,hashmap中有的方法譬如遍歷很慢,雖然看上去只差常數,但是這個常數巨大,如果在第一次作業中不加處理就會在第二次作業中TLE。

第一次作業也讓我們了解了拋異常,我個人認為JML對于拋異常的處理是值得稱道的,通過這樣的約束可以控制程序在犯了一些明顯的錯誤后及時停止而不是越錯越遠浪費計算資源,造成更嚴重的后果。

?

第二次作業是在第一次的基礎上寫一個Graph類,這個類繼承PathContainer,將不同的Path匯總成一個圖,并能夠查詢最短路。

對于第二次作業,首先要吐槽的是給出的接口,在需要繼承的情況下應該聲明為protect,才能更好地實現數據的繼承,而給出的接口使用了private,給我們的選擇便只有重新聲明數據,每當使用的時候get一次以更新或者將第一次PathContainer的代碼復制到Graph中,我為了偷懶選擇了后者,結果第三次就只能靠瘋狂壓行來改正代碼風格。

對于第二次圖的實現,介于圖中邊權均為1,求最短路和是否連通均可以使用BFS。在BFS中將查找到的點均進行更新就好,這樣,在詢問兩點是否連通或者他們的最短路時,可以先查找對應圖中兩點間值是否為初始值,若是則BFS查找更新,否則直接返回結果。同時只有當需要查找兩點間最短路或者連通情況且Path有過remove或add且上一次Path改變后沒有更新才更新圖。

?

對于第三次作業,其實是在求帶權最短路。這里再使用BFS就不太合適了。

對于連通塊數量,可以使用并查集,也可以選擇圖中一個點開始BFS,終止后若沒有遍歷所有點則選擇一個未遍歷的點繼續BFS,如此往復至圖中所有點被搜索過即可。這兩者后者更快。

對于三種不同的最短路,王嘉儀同學給出的關于圖的數學性質是正確的,利用這個性質我們可以更簡潔的完成最短路。

以最短花費為例,設邊權為1,跨路徑一次消耗2,則最終消耗=邊數+2*換乘數-2,此時,對于同一路徑內任意兩點,我們先求出圖內floyd最短路圖,將其中的值全部加上2,再將這些圖合并后使用迪杰斯特拉求出兩點間最短路,得到的值減去2就是正確答案。注意求起點a到終點b的最小花費時,使用迪杰斯特拉算法更新的點答案均是正確的,所以若是詢問的兩點的最短路值不是初始值就可以直接輸出了。其余幾種最短路可以類推。

?

這三次作業只有最后一次有bug,我將最短路的圖設置為了1000,沒想到UnpleasentValue的最小值超過了1000.

關于這三次作業的不足,我覺得最大的問題在于繼承復用上。因為接口里給出的類型是private,沒有辦法使用protected繼承數據,導致繼承時需要把所以數據使用時get一次,而我選擇了偷懶的辦法,直接將被繼承的代碼寫入了新的代碼中,這導致我第三次作業的Railway很長很丑。

Part 2:關于JML

?JML(Java Modeling Language)是用于對Java程序進行規格化設計的一種表示語言。

JML能夠用形式化語言來規范代碼,提高代碼可維護性。

JML以注釋形式存在,每行以@開始,分為行注釋(表示為//@......)和塊注釋(表示為/*@......@*/)。

JML有原子表達式,量化表達式,集合表達式等等,以及約束類型的類型規格和約束方法的方法規格。

原子表達式有\result和\old()兩種,前者用來約束一個方法的返回值,后者用來表示括號內內容在方法執行前的內容。

量化表達式有forall,\exists和\sum,forall表示某范圍內的元素均應滿足某條件,為全稱量詞,相應的\exists為存在量詞,而\sum返回的是給定范圍內表達式的和。

集合表達式則構造一個容器,明確其包含的元素。

操作符包含子類型操作符<,等價操作符<==>,不等價操作符<=!=>,推理操作符==>,上述操作符均返回bool型值。

對于方法規格,我們通過requires語句約束前置條件,通過ensures語句約束后置條件,同時JML也給出了副作用、異常的約束,通過saaignable和modifiable來約束副作用,并利用signals來拋異常。

對于類型規格,主要利用不變式invariant P來進行約束。

部署JML UnitNG/JML Unit

安裝后,編寫測試樣例如下:

測試結果如下:

關于JML的使用,我個人感覺它只應該是一種嚴格的約束。事實上,我們的代碼和JML都是形式化語言,而我們使用JML是為了自然語言表述不清導致代碼bug。

我認為,規格應該是宏觀的,整體的,針對于方法的輸入輸出形式,而不應該是對于代碼實現的全盤描述,若是后者,那寫代碼豈不成為了對于規格的翻譯?那我們為什么不直接寫規格?規格應該是規范而不涉及具體的內部實現。

舉個例子,形式化的規格語言可以作為偽代碼來描述算法,我們利用這種形式化的語言來詳盡的描述算法,在用java語法來翻譯規格語言,這顯然是在做重復無謂的工作。

在這幾次作業中,尤其是最后一次作業,我們可以發現,新增的方法具有大量的規格,不少同學都吐槽過這個規格又臭又長,而我發現這些又臭又長的規格真正有用的部分是在于對于輸入輸出數據合法性判斷以及拋異常的部分,剩下的部分其實是在表達算法思想,而我認為描述算法不應該是規格應該做的。

轉載于:https://www.cnblogs.com/lzyckd1/p/10906394.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277663.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277663.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277663.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kinect開發筆記之一Kinect詳細介紹

畢業設計的課題我選擇了結合Kinect和Unity3D開發體感游戲&#xff0c;這是我十分感興趣的一個課題&#xff0c;所以做好當然責無旁貸。準備再寫一系列Kinect的學習筆記&#xff0c;記錄自己畢設一步一個腳印的歷程。1、Kinect背景介紹眾所周知&#xff0c;Kinect是一款集成了很…

獲取2個地址之間的距離(高德API)

2019獨角獸企業重金招聘Python工程師標準>>> string startLonLat SiteHelper.GetLonLat("大連"); //獲取起始地經度緯度 string endLonLat SiteHelper.GetLonLat("沈陽"); //獲取目的地經度緯度 int distance SiteHelper.GetDistance(star…

WPF屬性學習

一.WPF屬性系統 CLR屬性 .NET中的屬性稱為CLR屬性 轉載于:https://www.cnblogs.com/programme-maker/p/10910166.html

chemdraw怎么連接兩個結構_利用神經結構搜索構建快速準確輕量級的超分辨率網絡...

介紹我們知道&#xff0c;把神經網絡拆解&#xff0c;可以把它歸結為幾個元素的排列組合而成&#xff0c;例如&#xff0c;以卷積神經網絡為例&#xff0c;其主要由卷積層&#xff0c;池化層&#xff0c;殘差連接&#xff0c;注意力層&#xff0c;全連接層等組成&#xff0c;如…

Unity3D學習筆記之六創建更多的Prefab

在寫完第五篇后&#xff0c;因為不知名的原因&#xff0c;我突然不能夠上傳100KB以上的圖片在博客中了。等了幾天還是這樣&#xff0c;所以我用PS把圖片的分辨率一張張調低&#xff0c;讓圖片的大小都在100左右&#xff0c;將積攢了四篇的學習筆記一起發上來&#xff0c;也算彌…

iOS底層探索(二) - 寫給小白看的Clang編譯過程原理

iOS底層探索(一) - 從零開始認識Clang與LLVM 寫在前面 編譯器是屬于底層知識&#xff0c;在日常開發中少有涉及&#xff0c;但在我的印象中&#xff0c;越接近底層是越需要編程基本功&#xff0c;也是越復雜的。但要想提升技術卻始終繞不開要對底層原理的探究&#xff0c;很多資…

四、構建Node Web程序

---恢復內容開始--- 一、HTTP 服務器的基礎知識 1、Node如何向開發者呈現HTTP請求 2、一個用“Hello World”做響應的HTTP服務器 它用了默 認的狀態碼200&#xff08;表明成功&#xff09;和默認的響應頭 3、讀取請求頭及設定響應頭 Node提供了幾個修改HTTP響應頭的方法&#x…

datagrid 什么時候結束編輯_2020年中考結束后,什么時候出分?什么時候報志愿?...

導語7月19日下午16:00&#xff0c;2020年北京中考正式落下帷幕。考試結束后&#xff0c;很多家長和考生都會長舒一口氣&#xff0c;但北京中考在線團隊提醒你&#xff0c;現在還不是放松的時刻&#xff0c;中考結束后&#xff0c;還有成績查詢和填報志愿等重要事件等著你。那么…

Unity3D學習筆記之七創建自己的游戲場景

到現在為止我們已經擁有了比較完備的Prefab&#xff0c;已經可以創建宏大的游戲場景&#xff0c;并以第一人稱視角在場景中漫游了。這里給大家做個小的示范&#xff0c;建一個小場景大家在創建場景的時候需要自由發揮&#xff0c;做個盡量大的場景出來。這一系列教程以及素材均…

excel if in函數_【Excel函數】Small+Index+IF 一對N返回

通常情況下&#xff0c;Vlookup和lookup函數只能返回滿足條件的第一個&#xff0c;剩余的都不會返回。 這也是其函數的一個弊端之一。 若是按照條件&#xff0c;返回所有滿足條件的數據&#xff08;1->N&#xff09;的&#xff0c;可是適用組合函數。 Index返回位置&#xf…

Unity3D學習筆記之八為場景添加細節(一)

這一系列教程以及素材均參考自人人素材翻譯組出品的翻譯教程《Unity游戲引擎的基礎入門視頻教程》&#xff0c;下載鏈接附在第二篇學習筆記中。我花了30分鐘做了一個中等大小的迷宮場景&#xff0c;不知道大家自己發揮&#xff0c;做的場景大小如何。在完成場景之后&#xff0c…

mysql數據庫表的管理(增刪改)

表字段管理1. 添加到末尾alter table 表名 add 字段名 數據類型;2 添加到開頭alter table 表名 add 數據類型 first;3. 添加到指定位置alter table 表名 add 新字段名 數據類型 after 原有字段名&#xff1b;4. 刪除字段alter table 表名 drop 字段名;5. 修改數據類型alter ta…

哪個app最費電_微波爐和烤箱,買哪個劃算?

微波爐和烤箱不能說買哪個劃算&#xff0c;而是看哪個更適合&#xff1f;我家微波爐和烤箱兩個都有&#xff0c;所以這個問題我來回答一下。雖然外形上看起來&#xff0c;微波爐和烤箱似乎沒有多大的區別&#xff0c;從功能上看&#xff0c;它們也都是加熱&#xff0c;但它們側…

MATLAB數值計算與符號運算

符號計算 存放的是精確數據&#xff0c;耗存儲空間 &#xff0c;運行速度慢&#xff0c;但結果精度高&#xff1b; 數值計算則是以一定精度來計算的&#xff0c;計算結果有誤差&#xff0c;但是運行速度快。轉載于:https://www.cnblogs.com/shawnchou/p/10927680.html

Unity3D學習筆記之九為場景添加細節(二)

上節為場景中添加了第一塊帶有碰撞器的石頭&#xff0c;本節我們來利用Prefab&#xff0c;將場景細節都添加進去&#xff0c;并且做的更完善。這一系列教程以及素材均參考自人人素材翻譯組出品的翻譯教程《Unity游戲引擎的基礎入門視頻教程》&#xff0c;下載鏈接附在第二篇學習…

vux Cell組件

Cell 組件一 <style lang"scss">.cell {padding-top: 15px;padding-bottom: 15px;color: #333;img {display: block;margin-right: 15px;}} </style><template><Group><cell class"cell" title"錢包" :border-intent…

wifi名稱可以有空格嗎_收購公司后可以變更公司名稱嗎,變更公司名稱和股權如何處理?...

【點擊文末小程序&#xff0c;免費咨詢法律問題】公司收購是指二手設備收購&#xff0c;指向目標公司的二手設備&#xff0c;廢舊物資&#xff0c;進而獲取目標公司的全部或部分業務&#xff0c;取得對拆除的控制權。那么&#xff0c;收購公司后可以變更公司名稱嗎&#xff0c;…

震驚的網站,都是干貨

分享15個鮮為人知的的小眾網站&#xff0c;每一個可以讓你打開新世界的大門&#xff0c;讓你震驚。 1&#xff1a;仿知網 https://www.cn-ki.net/ 仿知網是一個完全可以代替知網的精品網站&#xff1b;是一個非常強大的論文搜索網站。 首先這個網站的論文檢索結果和知網的搜索結…

Kinect開發筆記之二Kinect for Windows 2.0新特性

這是本博客的第一篇翻譯文檔&#xff0c;筆者已經苦逼的竭盡全力的在翻譯了&#xff0c;但無奈英語水平也是很有限&#xff0c;不對或者不妥當不準確的地方必然會有&#xff0c;還懇請大家留言或者郵件我以批評指正&#xff0c;我會虛心接受。謝謝大家。 原文網址&#xff1a;h…

持久化的基于L2正則化和平均滑動模型的MNIST手寫數字識別模型

持久化的基于L2正則化和平均滑動模型的MNIST手寫數字識別模型 覺得有用的話,歡迎一起討論相互學習~Follow Me 參考文獻Tensorflow實戰Google深度學習框架 實驗平臺: Tensorflow1.4.0 python3.5.0MNIST數據集將四個文件下載后放到當前目錄下的MNIST_data文件夾下 定義模型框架與…