萬物皆對象——第一單元學習小結

来源:https://www.cnblogs.com/cherishlove/archive/2019/03/27/10606884.html
-Advertisement-
Play Games

一、前言 經過一個月來的學習,我從對面向對象一無所知到逐漸入門,圍繞著“多項式求導”,對面向對象的特性進行了探索。 我對面向對象印象最深的兩句話就是“萬物皆對象”和“高內聚、低耦合”,這三次作業也是儘量貫徹了這兩句話。 我們的作業從第一次的僅含冪函數的求導,到第二次包含正餘弦函數,再到最後函數可以嵌 ...


一、前言


 

經過一個月來的學習,我從對面向對象一無所知到逐漸入門,圍繞著“多項式求導”,對面向對象的特性進行了探索。

我對面向對象印象最深的兩句話就是“萬物皆對象”和“高內聚、低耦合”,這三次作業也是儘量貫徹了這兩句話。

我們的作業從第一次的僅含冪函數的求導,到第二次包含正餘弦函數,再到最後函數可以嵌套。一步步走來,面向對象的優點也逐漸浮現出來。

 

二、分析工具


 

本次作業我們用複雜度分析和UML類圖對代碼進行度量,首先介紹複雜度分析:

複雜度分析是對方法的圈複雜度進行分析,有三個衡量指標:ev(G), iv(G), v(G)

  • Cyclomatic Complexity (v(G)) 圈複雜度
  圈複雜度是用來衡量一個模塊判定結構的複雜程度,數量上表現為獨立路徑的條數,即合理的預防錯誤所需測試的最少路徑條數,圈複雜度大說明程式代碼可能質量低且難於測試和維護,經驗表明,程式的可能錯誤和高的圈複雜度有著很大關係。獨立路徑組成的集合稱為基本路徑集合,獨立路徑數就是指基本路徑集合中路徑的數量。基本路徑集合不是唯一的,獨立路徑數也就不唯一。因此,圈複雜度是最大獨立路徑數。   圈複雜度可以通過程式控制流圖計算,公式為:V(G) = e + 2 - n   e : 控制流圖中邊的數量   n : 控制流圖中節點的數量
  • Module Design Complexity (iv(G))模塊設計複雜度

  模塊設計複雜度是用來衡量模塊判定結構,即模塊和其他模塊的調用關係。軟體模塊設計複雜度高意味模塊耦合度高,這將導致模塊難於隔離、維護和復用。

  模塊設計複雜度是從模塊流程圖中移去那些不包含調用子模塊的判定和迴圈結構後得出的圈複雜度,因此模塊設計複雜度不能大於圈複雜度,通常是遠小於圈複雜度。

  • Essential Complexity (ev(G))基本複雜度
  基本複雜度是用來衡量程式非結構化程度的,非結構成分降低了程式的質量,增加了代碼的維護難度,使程式難於理解。因此,基本複雜度高意味著非結構化程度高,難以模塊化和維護。實際上,消除了一個錯誤有時會引起其他的錯誤。   將圈複雜度圖中的結構化部分簡化成一個點,計算簡化以後流程圖的圈複雜度就是基本複雜度。  

下麵我們結合代碼對其進行說明:

這是第一次作業列印多項式的一部分,可以看到它的複雜度是

首先我們來看v(G)的計算,畫出流程框圖,可以看出這個圖共有10個點,14條邊,則v(G) = 14+2-10 = 6

然後我們來計算iv(G),把沒有調用子方法的模塊簡化成一個點,這段代碼中只有for迴圈里if內部沒有調用子方法,因此只有這個if被簡化,簡化後的圖如下

其中有點9個,邊12條,iv(G) = 12 + 2 - 9 = 5 

  最後計算ev(G),我們要把原來流程圖結構化的部分簡化,這裡的結構化的部分指的是只有if/for只有一個入口點,我們代碼中的for迴圈就有兩個入口點,因此不能簡化(若把原代碼的break去掉就可以簡化了),具體可以查看Essential complexity - Wikipedia

所作流程圖如下,ev(G) = 8 + 2 - 7 = 3

UML類圖則是描述類與類之間關係的圖,其關係共有繼承、實現、依賴、關聯、聚合、組合六種,而這三次作業我僅用到了三種依賴,聚合與包含,其他的以後用到了再做總結。

依賴關係是一個類使用了另外一個類。

聚合關係是一個類內部有另外一個類,即has-a關係。

繼承關係是一個類繼承了另外一個類。

圖示:

依賴:

聚合:

繼承:

 

三、代碼分析


 

1. 第一次作業

  第一次作業的思路挺清晰的,只知道“萬物皆對象”,就把表達式分成一個個項,把表達式抽象成一個對象,把每個項抽象成一個對象,然後用正則表達式去匹配每一項,提取x的指數和繫數,然後對對每一項求導並加在表達式對象上,輸出就完事了。化簡也需要合併同類項,把正項放在第一位,繫數為1或-1不輸出,指數為1不輸出。

圈複雜度:

可以看出有幾個方法的圈複雜度挺高的,計算指數和繫數,列印多項式,因為這幾個方法都有很多需要判斷繫數為不為1,指數為不為1,導致有許多if-else結構。

 UML類圖:第一次作業還是挺簡潔的。

第一次作業算是入門了面向對象了,我努力的運用OO的思想去做這次作業,避免了一main到底的情況,我還學到了正則表達式的使用,java語法結構等。

但是這次作業我出了好幾個BUG,1. 沒想到他們會用\f來hack,2.合併完同類項忘記刪除繫數為0的項。

這兩個BUG分別出在分析表達式和計算表達式上,都是因為沒考慮清楚才導致錯誤的。

在找BUG階段,我也使出渾身解數,第一次作業基本就是找WrongFormat大賽,畢竟這次求導太簡單了。用各種多符號,少數字的表達式去測試他們,還有合併同類項為0、爆棧的數據,比如:

1231323 + 3131321++32131++661656161
2132*x+- 13213213++2313132*x^3213132
q123213+31321*x
x+x+x+x+x+x+x+x++x++x+-x+- x
313132x^100+x^100+x^99--x^99
3*x^-1+2*x^2
+ + x + + x ++ 2131 * x ^ 2236
321321*x^x
+
-

x^

500個+x

1000個1

x+x-x-x

這次作業相對簡單,可以通過閱讀代碼來構造相應的數據來hack,有一位同學就是用“ | ”作為項與項之間的分隔,然後我構造了一個“|x”的數據他就錯了。

 

2.第二次作業

  第二次作業和第一次作業特別相似,僅僅在因數中加入了sin(x),cos(x),其他和第一次作業是一樣的,每一項都可以用“a*x^b*sin(x)^c*cos(x)^d”來表示,因此我用了和第一次作業一樣的結構而沒有去為了相容第三次而重構代碼(主要是懶)。

圈複雜度:

 可以看到這次的圈複雜度還是在列印表達式和判斷表達式的方法比較高,依舊是那個問題需要判斷繫數為不為1,指數為不為1,導致有許多if-else結構。

UML類圖:和第一次作業差不多

  這次的化簡主要是運用cos(x)^2+sin(x)^2 = 1這個式子及變式進行化簡,用迴圈找出可以化簡的項然後合併就OK。這次作業主要是鞏固了一下麵向對象的知識點,鞏固一下正則表達式的使用,為下一次作業做準備。

這次因為和上次的題目比較像,所以寫的挺完善的也沒被找出BUG。

找BUG階段則是閱讀別人的代碼,然後構造出相應的測試點。

 

3. 第三次作業

  第三次作業的難度陡增,它從表達式的加減乘變成了可以嵌套的模式,這就只能重構代碼了,這也揭示了一個問題:前兩次作業的代碼耦合度過高,難以修改。這次作業的思想主要是把表達式按加減號拆開,得到各個項,再把項按乘號拆開,得到因數,因數有括弧,數字,x,sin,cos五種,其中sin,cos,括弧可以嵌套表達式,然後遞歸。

圈複雜度:

圈複雜度高的依舊是識別函數的方法,這次BUG就出在了識別上。

UML類圖:結構比前兩次作業複雜了許多

  這次作業用到了繼承的思想,因數有5種,就用5個子類去繼承因數這個父類,這樣做的好處也很明顯,項是由因數構成的,可以用一個ArrayList<Factor>去存儲五種因數,而不要分開存,求導也可以直接調用重寫的求導方法Factor.derivation()。本次作業讓我對面向對象的理解又深了許多,也複習了一下遞歸的使用,遞歸真的好用

找BUG這次也沒什麼很好的方法找,只能構建嵌套多層的因數,加各種指數去測試他們的遞歸會不會有問題,輸出會不會有問題。

這次我被找到了一個BUG,就是識別因數的時候,在很多判斷中漏了一個條件,導致有些因數識別不出來,會報WF,圈複雜度高果然容易出錯。

 

四、心得體會


 

  幾次作業下來對面向對象有一定的瞭解,知道面向過程與面向對象的區別,明白了“高內聚,低耦合”的道理。在編寫代碼時,一定先用清晰的思維去構思好程式的設計框架,這樣在寫代碼的時候就不容易因為思緒混亂而寫出帶BUG的程式。寫完程式後要編寫完備的測試樣例,無論是測試自己的程式還是hack他人的程式都是極好的。

話不多說,繼續努力,面向對象,從我做起。

願諸君共勉!


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

-Advertisement-
Play Games
更多相關文章
  • 一、作業結構分析 第一次作業: 類圖(真·一類到底) 方法複雜度、類複雜度、類間依賴 第二次作業: 類圖 方法複雜度、類複雜度、類間依賴 第三次作業: 類圖 方法複雜度、類複雜度、類間依賴 結果一目瞭然:方法複雜度、類複雜度逐漸減少;類間依賴程度增加、類的層級化更加明顯。 應用工具度量得到的結果和我 ...
  • 深層理解-棧平衡原理-底層是如何實現棧平衡的? 在iOS、android操作系統中,經常會遇到入棧出棧的操作。 那麼現在操作系統已經不需要我們去關心堆棧的操作。 比如:iOS中的ARC模式,android中的JVM都會幫我們自動釋放記憶體,自動保持堆棧平衡。但是對於開發者來說,還是很有必要掌握堆棧平衡 ...
  • 對於一個的坐擁1.4億多用戶,平均日活躍用戶量超過 3400 萬,人均日訪問時長 1 小時,月累計頁面訪問量達到 230 億的大廠來說(數據截止2018年 3 月),知乎的AI都到底應用在了哪些領域,這中間應用到了哪些技術和模型,又產生了哪些作用?今日第1期數智方法論將從內容生產、內容消費與分發、內... ...
  • 那個時候初入java這個大家庭,學習的方向很亂。畢業後,在公司磨練了一年,總想著是該交一份答卷了,可能成績不會很好,但求及格!那麼考試題目呢,我計劃搭建一個橫向可擴展的項目,可以在平臺自擴展各種子項目,包括 後臺許可權控制,日誌分析,秒殺,微信小程式,愛代客(www.idaike.com)項目等等,所 ...
  • OO第一單元作業總結 在第一單元作業中,我們只做了一件事情:求導,對多項式求導,對帶三角函數的表達式求導,對有括弧嵌套的表達式求導。作業難度依次遞增,讓我們熟悉面向對象編程方法,開始從面向過程向面向對象轉變。本文中,我將介紹我個人每一次作業的做法,以及三次作業的分析,互測時策略。 第一次作業 第一次 ...
  • 第一次OO博客作業 前言 面向對象課程已經經過了4周的時間。前三次作業全部是關於多項式求導的相關內容,內容由易到難,同時我也開始逐漸深入感受學習面向對象的各項特征,逐漸將自己的編程風格從C向真正的面向對象語言轉換。同時我還接觸了DEBUG和互測屋這樣嶄新的學習方式,在閱讀別人代碼的過程中不斷增強自己 ...
  • 一、由於項目需要進行手機看板展示設計及開發展示效果圖如下: 上圖為概況(點擊相應模塊進入詳情頁面) 上圖為運營統計(一些統計類圖標狀圖折線圖等......) 車輛分佈狀況(展示在地圖上分佈) 上圖為點擊一輛車的軌跡和運行情況 此產品唯一亮點在於完全可以把利用HTML5和echarts開發大數據大屏展 ...
  • 本文是BUAA OO課程Unit1在課程講授、三次作業完成、自測和互測時發現的問題,以及傾聽別人的思路分享所引起個人的一些思考的總結性博客。本文第二部分介紹三次作業的設計思路,主要以類圖的形式展現,並有簡單的優劣分析;第三部分為程式代碼複雜度的分析(二、三兩部分為基於度量的對自己程式結構的分析);第... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...