文章出處

話不多說!先上圖!!!!看看我和小伙伴認真學習的照片(你懂得

左:13061212賴彥諭 右:13061203徐丞

首先按照要求分析一下自己的優缺點!

賴彥諭:

  優點:服從安排合作 愿意提出想法 敢于接受任務

  缺點:拖延癥晚期  手癌晚期 代碼能力并不是很強大

徐丞:

  優點:編程能力還可以,對C++掌握比較好;細致認真,查到好多bug;邏輯嚴密

      缺點:面向過程的編程思想比較嚴重,函數體一般比較長,而且有大量的if-else邏輯判斷

1.結對編程的優點和缺點:

優點:

  (1)從結對編程的這一個詞語的分析來看就知道,結對編程比較考驗大家的配合,合作能力。有一定的機會鍛煉大家的團隊協作能力

  (2)提高了個人學習能力,因為有機會向對方學習編程的一些技巧。

  (3)有助于編程過程中的注意力集中,因為結對編程可以在一定程度上督促對方進行程序的閱讀和理解。

缺點:

  (1)性格差異,導致合作會有些問題

  (2)有時候難分工作量的大小,因為都不好意思推脫任務。

2.說明怎樣利用好這些設計:

 Information hiding:顧名思義,信息隱藏就是將我們的數據進行封裝,以保證一定的安全性,也就是說外部不能夠對我們內部的數據進行修改,以此完成數據的封裝。在數據隱藏的過程中,我們也為外部提供了接口,讓外部可以直接使用這個提供的接口,然后達到不改變內部數據就能夠使用的目的。這就好比之前我們所學過的面向對象編程,在面向對象的編程的過程中,數據的封裝,安全性都是一個很重要的地方,在類間的調用中,我們需要保證外部不會修改我們內部的數據造成我們的數據不安全,所以通過數據隱藏的這樣的方法,來確保類各自的安全性并且也保證了方便調用的可能。

 Interface design:借口在編程時,一般都是定義了一種行為,對于這種行為,需要類去實現這個借口,然后我們就可以使用這個統一的標準,這在很大程度上減輕了代碼的復雜度,因為我們使用時不需要考慮具體的實現。

   Loose coupling:首先我們在編寫代碼的時候應當讓每個模塊都少些依賴性,因為這符合松耦合的原則,我們在松耦合的原則看到,要求的是供應者與用戶之間其中一個發生了問題時都應該不影響到另一方,并且在相關模塊進行修改的時候,不會影響到其他模塊的正常運行,然后通過提供API來供外部調用,利用接口的實現調用,降低各個模塊的依賴性。

3.Design by Contract&&Code Contract

  契約式編程的構成是前置條件與后置條件還有不變式組成的,契約可以在代碼實現前建立好,并且保證之后的代碼時符合條件的。

優勢:在一定程度上保證了代碼的可靠性,因為我們所契約的操作都是一致的,前后的狀態以及不變時都能夠幫助我們清楚我們程序在調用什么后會出現什么樣的結果。也提高了代碼的依賴性、復用性和替換性,也讓程序的結構變得更加清晰。

劣勢:契約的構成中,如果有遺漏,沒有遵守契約的情況,會帶來更多的工作量和任務。

  Formula,StuCaluator還有Operand都是我們這次編程設計的三個類,并且我們也實現了借口,是在StuCalulator的類中提供的。就是提到封裝后,通過接口的調用就無需擔心內部的數據被改變,更好的封裝了內部的變量和實現細節,并且通過這樣的設計方法,我們實現了calc和Generate還有check三個接口。

4.單元測試

   我們的程序有三個類Formula,Operand,StuCalculator,我們對每個類都有測試文件進行測試,一共使用了90個單元測試用力。

  在我們的測試中也發現了許多BUG,然后按照老師的要求,我們也給出了我們的代碼覆蓋率-95.23%,在我們分析的過程中發現我們沒有達到100%的主要原因就是我們生成表達式的時候采用的是隨機算法,并且種子不唯一,在生成的過程中,隨機數會有不一樣的分支進入,我們沒法控制這一點,所以導致最后的覆蓋不能全滿。下面我們也給出了我們的代碼覆蓋率的截圖。

5.UML圖

6.算法說明:

1.生成表達式算法的整體思路:首先對操作數進行隨機生成,對運算符進行隨機生成,最后將生成的操作數和運算符拼到一起形成一個前綴表達式,再轉換為中綴表達式輸出。之所以先生成前綴表達式,是因為要檢測生成的表達式是否滿足需求,需要進行一步步計算,這里因為我們直接生成了前綴表達式,所以可以直接進行計算。對于去重的檢測,我們放棄了檢測這一思路,我們的想法是生成的表達式絕不會出現交換重復的情況。為實現這一點,當發現生成的表達式中有‘+’或‘*’時,我們會對操作數做一次排序,就是說是操作數符合有序性,因為交換重復會打破有序性,這樣我們保證操作數一定是有序的那么就不會有重復。(這里有一點例外,就是生成的操作數有相同的,所以我們再加一條限制,就是操作數排完序后不允許出現連續三個數相等的情況),操作數有序的做法不能避免產生一模一樣的表達式,所以采用哈希值來記錄生成的表達式,若出現重復的哈希值則說明生成了一模一樣的表達式,則重新生成。

2.對于不同參數組合的支持:這里我們確立了一條規定:允許有負數,就一定允許有括號;不允許有括號,就一定不允許有負數。因為負數輸出時都是加括號輸出的,所以我們的邏輯導致必須有這條規定。由于我們是隨機產生操作數,對于不同的參數就在隨機生成的時候根據不同的條件隨機生成即可。對于不允許有括號的情況,只要規定隨機產生的運算符有序就不需要括號了。

3.對中綴表達式的計算算法:這個沒什么創新點,就是兩個棧,通過彈棧壓棧實現運算即可。


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()