OO_Unit1總結

来源:https://www.cnblogs.com/acyo/archive/2020/03/19/12526280.html
-Advertisement-
Play Games

一、程式結構分析 第一次作業 1.設計構思與自我評價 第一次作業難度不是太高,只需要解析由常數、冪函數簡單組合的表達式。其中每一項都可以看做coef*x**index的固定形式,建立包含coef,index兩個Biginteger屬性的Term類作為最基本的數據結構,並且實現單項求導的方法。在Ter ...


一、程序结构分析

第一次作业

1.设计构思与自我评价

  第一次作业难度不是太高,只需要解析由常数、幂函数简单组合的表达式。其中每一项都可以看做coef*x**index的固定形式,建立包含coef,index两个Biginteger属性的Term类作为最基本的数据结构,并且实现单项求导的方法。在TermList中实现读入表达式后的构建、整体求导与化简。

由于题目中表明空白字符对格式判断的无影响,在读入表达式时就可以将所有空白字符去除,简化拆分表达式的操作。解析表达式时我首先尝试了有限状态机的方法,按字符读入。然而这一方法在后续作业中由于过于复杂,状态太多而容易出错,被其他方法所取代。简化时只需要比较两项的系数是否相同即可。

  这次作业由于没有考虑后续功能增添以及更加复杂的解析处理,采取了不太恰当的处理方式,扩展性不够强,后续的作业中重构花费了较多的时间。并且对与面向对象思想的体现还不够。

 

2.度量工具分析

UML类图:

复杂度与耦合度

  由于主要功能都在TermList中实现,造成TermList类的复杂度和耦合度都比较高。

第二次作业

1.设计构思与自我评价

  这次作业相比上次变化不是太大,增添了对三角函数sin(x),cos(x)的要求。因此每项Term都可以看成是coef * x ** xindex * sin(x) ** sindex * cos(x) ** cindex的格式,每一项需要四个参数,我在这里将每一个因子都包装为一个单独类,采取组合的方式实现Term的结构。其余结构基本上延续了上一个作业的做法。

  同样的,由于空白字符不造成影响,在读入表达式时将所有空白字符去除。解析表达式这一步有了较大的差别,考虑到复杂程度的显著增长,我放弃了有限状态机的解析方式,而是采取正则表达式的方法。通过构造大正则表达式的方式匹配整个式子是否符合format(大正则表达式由诸多小正则按层次相加构成,保证可阅读性,可复用性)。小正则用于从表达式中将每一项每一个因子提取出来,以实例化Term加入TermList。

  求导的思路与上次作业基本一致,整体的求导转化为每一项求导的和,用ArrayList或HashMap储存,按照公式即可。简化时首先比较两项的三种指数是否相同,再考虑sin(x) ** 2 + cos(x) ** 2 = 1,以及x ** 2 = x * x等情况,遍历合并后输出。

2.度量工具分析

UML类图

 

复杂度与耦合度

  由于采取了较上次作业更加面向对象的方式,这次的复杂度和耦合度较上次有所改善。但是由于主要功能并没有单独封装,而是整合在Term或TermList类中,仍然有改善的空间。

第三次作业

1.设计构思与自我评价

  这次作业难度有了较大的提升,括号嵌套的加入带来了迭代的问题,意味着之前的解析、求导方式都不再适用了,需要较大的改动。但也有一部分可以复用。由于写代码前时间不够充分,思考不够充分,面向对象思想的设计没能很好的体现。最终选择了表达式二叉树的方式来建立数据结构。在这次作业中,我将表达式细化为因子之间的二元运算,表达式树的每一个节点都是一种运算或是因子(叶子节点),三角函数的嵌套也看作是一种运算。

  解析表达式时,细分为因子和运算两种元素的组合,避免了大正则的出现,仅用来提去出不同因子。利用栈的思想,定义每一种运算的优先度,构造出表达式二叉树。由于检查格式和二叉树较难结合,我将检查格式的操作单独整合为一个类,在构造数之前就进行检查。

  此次化简主要是简化不必要的运算,比如0,1的乘、幂运算,0的加减等,并且对三代之间的常数运算加以合并,避免出现常数相乘直接输出的情况。

  表达式树的建立对于复杂运算的解析有较好的适应性,思路清晰,有一定的复用性。缺陷主要在于格式检查逻辑有些混乱,没有和树结构很好的联系起来,另外由于时间不足,输出结果的化简上还有较大的优化空间。

2.度量工具分析

UML类图

 

复杂度与耦合度

  由于这次作业难度的增大,情况多变,操作更加复杂,我也没有很好的实现层次性,少数类中实现了过多的方法,造成复杂度和耦合度都不太理想。敲代码前应当更好的去构思我的设计。

二、关于Bugs

Bug分析

  前两次作业中自己的Bug主要出现在WF的判断,特殊情况没有考虑到,其实都是很容易避免的。第三次作业还出现了越界的情况。复杂度提高的情况下,对细节的把握不太到位,还是没有耐心做到充分的测试,周全地考虑问题,造成了不少bug的出现。

测试

  互测中我发现的bug并不太多,一部分原因在于没有搭建出良好的评测程序,造成测试效率不高,但还是总结出以下常用的测试思路。

  a.无脑使用数据生成器,生成覆盖功能较广的数据,进行黑盒测试,以快速找到bug。

  b.结合自己完成作业时的情况,尝试容易犯下的错误和边界值。

  c.阅读对方代码,从代码逻辑上找出错误。

三、对比与心得体会

  初来乍到,从面向过程转到面向对象还有些不适应的地方,很多思路需要转变。之前就听说OO的恐怖,现在也算是深有体会了。但是遇到的挑战越大,战胜挑战的收获也越多。

  三次Homework的难度逐渐增大,不断地查阅新的java语法,学习新的容器的使用方法,了解Factory等设计模式,让我慢慢地向面向对象的正轨上转变。通过各种渠道看到大佬们的设计,只能觉得自愧不如,自己的代码比起来还是太幼稚了。无论是架构还是优化,还是bug率,我都还有很大的进步空间,需要学习的还有很多。在今后的作业中,我会更加注重面向对象的思维方式,在架构设计方面投入更多的精力,做到良好的可扩展性、真正意义上的高内聚低耦合。

  既然选择了远方,便只顾风雨兼程。做好准备,迎接接下来的挑战吧。


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

-Advertisement-
Play Games
更多相關文章
  • vue的組件傳值分為三種方式:父傳子、子傳父、非父子(同級)組件傳值 引用官網的一句話:父子組件的關係可以總結為 prop 向下傳遞,事件向上傳遞 父組件通過 prop 給子組件下發數據,子組件通過事件給父組件發送消息,如下圖所示: 1、父傳子 子組件的代碼: 1 <template> 2 <div ...
  • 隨著多屏互動和多端相容友好的界面變得越來與重要,前端工程師也成為了熱門的研發技術崗位之一。隨著就業市場大環境的改變,一方面是前端人才的緊缺,另一方面是對前端求職者的要求增高,所以我們需要學的東西也不能僅僅只停留在基礎層面。那麼,我們應該如何學習前端呢?下麵為大家總結了一條前端學習路線,大家可以參考一 ...
  • video視頻是通過編輯器在後臺上傳的,上傳視頻時編輯器要求必須傳入視頻的寬高,而且必須是數字,不能是百分比 實在太不智能了,傳具體數字怎麼適配各種型號的設備呢??? 在前臺顯示視頻的時候,所有的video標簽都有設置好的width和height屬性 我首先移除了視頻設置的寬高屬性 $(functi ...
  • BFC是什麼? BFC(Block Fomatting Context)為塊級格式化上下文的的簡稱。 簡單點說,把BFC看成一個渲染區域或者容器,在BFC這個容器內部的的元素無論如何佈局都不會影響其外部的元素。 並且BFC還有它自己的一些特性,下麵會說到。 BFC模式的形成條件如下(滿足以下任意一條 ...
  • 網站是用的kindeditor編輯器,今天測試上傳視頻功能,提示說上傳失敗,容量超出 打開upload_json.php 修改$max_size $max_size = 100000000; 成功上傳視頻後,發現生成的格式是embed,而且前臺並不能顯示播放 於是決定將原來系統中的embed標記更改 ...
  • 很多人不明白同樣身為web前端工程師,可為什麼薪資待遇卻是大不相同,web更註重的在於技術。那麼初級web前端應該懂什麼?零基礎入門web前端應該學什麼? 零基礎入門web前端 初級web前端應該懂什麼 可以把前端工程師分為了入門、初級、中級、高級這四個級別,入門指的是瞭解什麼是前端(前端到底是什麼 ...
  • router-view是一個 functional 組件,渲染路徑匹配到的視圖組件。<router-view> 渲染的組件還可以內嵌自己的 <router-view>,根據嵌套路徑,渲染嵌套組件 它只有一個名為name的props,這個name還有個預設值,就是default,一般情況下,我們不用傳 ...
  • [toc] 領域驅動設計 運用領域模型 綁定模型和實現 聰明的項目組成員花費了幾個月的時間進行仔細的研究並且開發出了詳盡的領域模型(類圖)。然而對類圖研究不能讓我深入地瞭解該應用程式的代碼和設計,這讓我備感困擾。當開發人員開始實現應用程式時,他們很快就發現,儘管分析人員說得頭頭是道,他們依然無法將這 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...