1. 程式人生 > 其它 >BUAA_OO_第一單元總結

BUAA_OO_第一單元總結

目錄

BUAA_OO_第一單元總結與反思

摘要

本單元作業分為3次,主要是考察對錶達式括號的展開和符號的處理。
Homework1:本次作業,難點只是預處理符號和合並同類項,優化效能。當然,從面向過程的思維轉向面向物件是最痛苦的。
Homework2:本次作業在第一次作業基礎上加上了函式表示式,但函式表示式的形參實參代換並不難,這次的作業對實參有嚴格要求,然後加上了sin和cos函式,總的來說只是因子更復雜了,合併同類項的難度更大了。因此誕生了效能分卷怪


Homework3:本次作業就是放寬了形參的限制,可以讓函式之間呼叫函式,只是增加了表示式複雜度,其實不需要怎麼增量開發,只用了一小時不到就改完了。

第一次作業

簡介

沒有一點點防備,也沒有一絲顧慮,第一次作業就出現了
第一次作業本身其實難度不大,但我思考了很久才開始寫程式碼,為了偷懶採用了逆波蘭表示式中綴轉字尾(咱對遞迴下降不熟悉啊)。
本次作業第一個難點:多餘的加號和減號和帶符號的整數。這裡思考一會兒,我發現多餘的加號本身沒有影響,減號的影響只跟減號個數的奇偶性有關,奇數個減號就是減,偶數個減號就是加。然後就處理完了,over。
第二個難點也是重中之重:合併同類項,當然要用我們的HashMap啦,把指數作為key,常數項係數就是0次,value就是係數啦(當然要把符號帶上),然後就可以用迭代器合併了。

效能分策略

本次作業效能分僅取決於輸出的正確字串的長度,因此必須關注以下幾點:

  • 合併同類項
  • 係數1不輸出,$-1*$僅保留-號
  • 0項直接跳過
  • 正項先輸出(畢竟負項會在最開始多個負號)
  • $x**2$寫成$x*x$

Bug解析

本次作業bug幾乎就跟效能優化相關:

  • 不少人用的正則表示式(包括我)去消除的1,結果導致$21x$這種資料輸出的$2x$。
  • 合併同類項時忽略了單個x這種因子,HashMap裡存的時候係數存成0了。
  • 對於輸出0的結果沒有任何輸出,沒有檢查答案字串的長度。

效能分:猶豫就會敗北,果斷就會白給

本次作業UML圖

架構分析

  • 第一步:預處理得到的字串,首先用正則表示式消去所有的空白符,再將多餘的運算子消滅する。
  • 第二步:將處理後的字串轉為字尾表示式,資料結構大法牛逼
  • 第三步:開始計算,加法能係數相加的係數相加,不能就不管,丟到項裡去,乘方多次呼叫乘法,乘法就不斷生成新的項,減法就把被減數係數改成負的,繼續丟,這樣我們就得到了多個項。
  • 第四步:合併同類項over,我的常數處理單獨寫了個類,因為當時思路下先寫了合併常數,後來發現其實不用單獨寫。

度量分析

中綴轉字尾用棧實現導致用了大量的if-else語句,複雜度過高,這的確沒法優化,但是穩定的,另外,getFactor方法的複雜度也過高,其實可以優化。

可以看到我的LCOM值還是很小的,說明我的內聚度較高,耦合度較低。

Hack策略

沒hack過。

心得體會

隨機測試!隨機測試!隨機測試!
不要自己想幾個測試點測了就結束了。

第二次作業

簡介

第二次作業引入了函式表示式和三角函式,這次作業對實參和三角函式裡的因子限制很多,估計是為了方便大家進行增量開發,因為要加更多的方法和類。難度上了一個檔次,要注意的細節就很多了。

效能分策略

  • 將$sin(0)$替換成0,$cos(0)$替換成1
  • 項裡能合併的因子合併
  • 其餘優化同第一次作業

Bug分析

  • 做減法暴力變符號的時候沒有注意到三角函式裡因子符號不能變,導致強測因為這個炸了三個點。
  • 暴力去零的時候把三角函式裡的0也去掉了,強測因為這個也炸了三個點。
  • 有些同學讀題不仔細,sum的上下界相同時預設為0。

強測分:暴力出奇跡

本次作業UML圖

架構分析

  • 在運算裡新增加了一個SinCos類,因為我把Sin和Cos視為運算子,且是運算級別最高的運算子。
  • 增加了一個Replace類,用來實現函式表示式的替換,裡面一個Summation類,用來實現sum求和函式的功能,一個function類,用來實現f,g,h函式的對應替換。
  • 有個關鍵的新加類是matching,它是為了正確的匹配左括號和右括號,避免替換錯誤。
  • 因為sin和cos的特殊性,所以專門寫了個MergeSincos類來合併。

度量分析

由於是增量開發,所以作業1中留下的方法的圈複雜度沒有改變,但新增的方法的圈複雜度都很低,封裝度很高,用起很舒服。

LCOM值還是都比較小,耦合度低,很舒服。

Hack策略

沒hack過

心得體會

沒有多做測試,以至於強測bug全是第一次作業留下來的祖傳bug,所以就算完成了上一次作業的測試,也不代表架構沒問題,相反,可能會有一堆bug。

第三次作業

簡介

第三次作業放開了資料的限制,函式之間可以呼叫函式,三角函式裡的因子可以有表示式,第二次架構好的話其實不需要大改。

效能分策略

  • 三角函式裡的括號只保留必需的,儘量化簡掉表示式。
  • 其餘同第二次作業。

Bug分析

  • 求和函式的上下限是大整數,沒有用大整數型無法解析。
  • 三角函式裡缺少必要的括號,如$sin((-x))$,不少人缺少一對括號。

本次作業UML圖


第三次作業的類與第二次基本無差別,就是重寫了類裡的一些方法。

架構分析

  • 對三角函式裡的因子要換成表示式型別,不是原來的冪函式因子或者常數因子。所以對於三角函式合併同類項的方法要重寫。
  • 其他地方與第二次作業無異。

度量分析

仍舊是老問題,沒有能力對中綴轉字尾的方法進行優化...

耦合度依舊較低,符合“高內聚低耦合”

心得與體會

第一單元終於結束,最後在hack和優化上都擺爛了,但還是沒有深刻理解到面向物件的思維,希望第二單元多執行緒能登堂入室吧。