面向對象編程——第一單元回顧與感想

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

一、作業結構分析 第一次作業: 類圖(真·一類到底) 方法複雜度、類複雜度、類間依賴 第二次作業: 類圖 方法複雜度、類複雜度、類間依賴 第三次作業: 類圖 方法複雜度、類複雜度、類間依賴 結果一目瞭然:方法複雜度、類複雜度逐漸減少;類間依賴程度增加、類的層級化更加明顯。 應用工具度量得到的結果和我 ...


一、作業結構分析

  第一次作業:

  

  類圖(真·一類到底)

      

  方法複雜度、類複雜度、類間依賴

 

  第二次作業:

  

  類圖

      

  方法複雜度、類複雜度、類間依賴

 

  第三次作業:

  

  類圖

      

  方法複雜度、類複雜度、類間依賴

  結果一目瞭然:方法複雜度、類複雜度逐漸減少;類間依賴程度增加、類的層級化更加明顯。

  應用工具度量得到的結果和我個人回顧三次作業時的感受是高度一致的:更多的類、單個類的複雜度下降以及類間依賴關係的增長,體現的是更清晰的思路和程式的層次化與模塊化。

但我編程時的思維方式更加“面向對象”了嗎?我覺得很難說,一方面,我在編程的時候會更加註重分而治之簡化問題的理念,註意封裝代碼,避免結構過於複雜——這一點在第三次作業中得到了很好訓練。另一方面,在我主觀地、憑經驗地把問題分解為不同對象的通信和協同工作之後,具體的流程實現依然是“面向過程”的。

  目前我對面向對象的理解是這樣的“通過大量封裝代碼實現復用性和安全性。”復用性,即通過封裝可重用代碼或邏輯結構(使之成為父類抽象類介面)實現;安全性,即將類間通訊的方式加以限制,在保證程式正常工作的前提下嚴格控制類中的數據訪問許可權。我知道目前對於課程的理解依然有點浮於錶面,但希望在之後的學習中能夠更深入全面地瞭解OOP思想。

二、作業bug分析

  首先,前三次作業的程式邏輯是相似的(好吧這裡又面向過程了),即層次構造多項式、項和因數,隨後層次調用求導方法,以及可能的優化方法。根據所在位置,bug可分為構造、求導和優化這三類。相應的,一個bug的誕生與其所在環節的設計是密不可分的。

1)第一次作業

  主要有兩個bug:,分別出現在首項的構造和帶負號項的構造上。程式在“首項前有符號時”會重覆錄入首項(相當於輸入了兩個第一項),因此在第一項不為常數時出錯;此外程式在“最後一項的繫數帶符號且前置的運算符為減號時”會把最後一項前的減號當加號處理,因此求導時出現負號錯誤。

Bug的產生主要歸咎於第一次糟糕的設計——類似自動機的項匹配方法,導致Poly類的構造方法極為冗長,可讀性較差。設計風格也幫了倒忙——整個項目里只有一個長達三百行的類。

  我匹配項的思路是:找到兩個運算符,將它們之間的字元傳遞給check方法構造項。這個思路有兩個主要的問題:找到一個+/-時如何判斷它是不是運算符而不是繫數/指數符號?如果找不到下一個運算符呢?強測和互測的兩個bug,以及中測的無數個bug,都是因為沒能完美地解決這兩個問題。具體而言,是因為在“找不到下一個符號”時,當前符號可能是繫數,可能是指數,也有可能是運算符。相應的,調用check構造項時的處理細節也有不同,因此,在如此多種的情形中,寫錯其中的一兩種幾乎是無法避免的。加之我又沒有細緻地列出所有情形,又沒有做自動化測試,僅憑自己對不同情況的判斷和強度不夠的手造數據,是很難發現bug的。

2)第二次作業

  本次作業僅有的一個bug發生在多項式類Poly.java的第128、129行,雖然只是簡單的兩行輸出優化的代碼,卻讓我在強測中取得了61.33分的好成績。我將每一項開頭的“1*”換為“1”,將“-1*”換為“-”,但由於replaceall時的正則里沒有加表示匹配開頭的^,導致前一個因數以“1”結尾碰上後一個因數的前導“*”時發生了錯誤匹配。這和設計結構關係不大,主要是因為自己寫時的疏忽,以及弱爆了的手造數據。

3)第三次作業

  本次作業兩個bug都發生在ITEM類的構造方法里:由於使用正則匹配,有時程式會匹配到有前導負號的項,我採用了把負號換為“-1*”的方法。很有效,然而。。。換的時候matcher中參數的變數名寫錯了。一開始我是直接在傳入的參數字元串item中匹配和替換負號,後來我發現想把“-+”和“--”都替換一下,引入了一個字元串item1(傳入參數不能直接改),但是這樣一來,最後匹配前導負號就應該在item1中進行了。但我修改的時候遺漏了matcher中的參數item,於是乎整個“替換前導負號”這部分功能都沒有正常執行,所有帶前導負號的項我都處理不了了。

  這看似是粗心,其實還是因為命名不規範、隨意修改導致的,很多時候我在replaceall的時候都會命名一些string123什麼的變數,雖然不會寫錯,但後續修改極易犯錯;此外我每一次修改也沒有計劃改什麼,沒有考慮改動可能的影響,從而導致新增bug。今後我會仔細查看修改部分的上下文,保證修改的影響符合預期。

  第二個bug則是只考慮了-sin和-cos沒有考慮-()的情況,屬於拘泥於“表達式因數沒有繫數”這一想法,忘了第一個繫數可以省略(明顯是第三次指導書中與第二次重覆的的部分懶得看了)。

三、互測體會

  因為不瞭解對拍,我在互測階段採用的方法是閱讀代碼、針對性構造樣例。例如第一次互測時閱讀了房間所有人的代碼,仔細研究正則表達式是否有不完善的、項錄入後的處理有沒有問題等等。

  這種策略在第一二次作業還是相對有效的,第一次作業中針對構造的樣例有時還能“命中”其他人,最後刀的人還是挺多的,雖然最後分數一算並沒有多少。

  但是第三次代碼量增大、同時取消WF之後這種方法就非常不實用了。這次根本沒有時間閱讀長代碼,即使讀了理解了也很難馬上指出漏洞(遞歸的執行過程缺少一定規律,只能檢查遞歸的結束條件和每一步執行有沒有問題)。第三次我依然有嘗試結合被測程式結構構造樣例,但效果平平。

四、可能的改進

  以難度最高的第三次作業為例,可以考慮引入簡單工廠模式。我目前在factor這一層,根據因數的不同分為三種情況,構建power/sin/cos類,現在如果引入了因數ln(x),那我不僅需要在最底層加入一個ln類,同時factor中的判斷語句也要修改。因此,如果改為每次建立底層因數時都調用一個工廠類,由工廠類負責判斷生產什麼類,可以避免factor的結構過於複雜。


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

-Advertisement-
Play Games
更多相關文章
  • 1.無限滾動的運用場景: 一般運用在列表展示,有分頁、下拉載入更多的需求中。 2.代碼分析 代碼很簡單,實現了列表分頁,數據載入完之後顯示數據狀態 參考mint-ui官網介紹 1.為HTML元素添加v-infinite-scroll指令即可使用無限滾動。 2.滾動該元素,當其底部與被滾動元素底部的距 ...
  • 這裡先放上官網的教程和說明:點擊這裡,vue導航守衛官方文檔 路由守衛 路由守衛說白了就是路由攔截,在地址欄跳轉之前 之後 跳轉的瞬間 乾什麼事 全局守衛 全局守衛顧名思義,就是全局的,整個項目所有路由,跳轉所用到的守衛(攔截),設置了全局守衛之後,只要路由(瀏覽器地址欄)發生變化就會觸發的事件 全 ...
  • [toc] 1. 搭建環境 2. React知識點 1. 組件 組件:就是將整個UI拆分為很多小的,可重用的UI,每一個小的UI獨立做自己的事情。 1.1 定義一個組件 一個組件需要繼承 重寫 函數,返回 註意點: 1.只要有JSX的地方必須引入 2.返回值中只能有一個元素包裹, 包裹整個JSX,如 ...
  • 該文章用於督促自己學習TypeScript,作為學筆記進行保存,如果有錯誤的地方歡迎指正 2019-03-27 16:50:03 一、什麼是TypeScript? TypeScript是javascript的超集,在ts中可以使用所有的js代碼,並對js進行了擴展,包括類型效驗,數據類型,介面等 如 ...
  • 轉發:https://www.jianshu.com/p/f581cf9360a2 背景介紹 什麼是npm? npm(node package manager)是nodejs的包管理器,用於node插件管理(包括安裝、卸載、管理依賴等), NPM是隨同NodeJS一起安裝的包管理工具,能解決Node ...
  • 微服務這幾年不可謂不火,很多技術團隊都開始在自己的項目上引入了微服務。一方面這些團隊確實很好的推動了微服務的應用和發展,另一方面也可以看到一些盲目追技術熱點的行為所帶來的危害,比如很多中小團隊對微服務的基礎知識只是做了很淺顯的瞭解就開始盲目的推動微服務的實施,最後導致了項目的失敗。 微服務要想做好是 ...
  • 學習一樣東西,我們首先要知道為什麼要學這個,或者說這個東西能起到什麼作用。這樣才能更加有目的、有效率地進行學習。 然後再問為什麼這個東西能實現這樣的效果,從而瞭解其內部的機制。 最後,再弄清楚怎麼使用,這樣才算真正學會了。 換而言之,把要學習的技能比喻成實現某一功能的函數,那麼瞭解函數的功能、函數的 ...
  • 一.自我代碼分析 1.度量: 第一次作業: 第二三次作業(改動很小,給出第三次作業結果): 2.總體自我評價: 第一次作業代碼實現糟糕,可以從代碼統計結果看到這一點,第二三次感覺比較滿意,思路順暢方法簡單可擴展性強但面向對象思想還不夠(甚至沒有繼承和介面),倒算是比較精緻的面向過程,不過類的高內聚低 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...