結對程式設計_1
崔強(187) 仇棟民(168)
一、 我對結對程式設計的看法,我對同伴的看法以及我們的工作。
結對程式設計優點:
1.分工合作,每人負責自己的部分,效率高。
2.不想坑隊友,工作時會比較認真。
3.兩個人寫的子產品會互相調用,開發過程中會不斷的對同伴的代碼進行複審,提高了程式運作的正确性和穩定性。
4.降低開發時間成本。
結對程式設計缺點:
1.分工容易出現失衡,能者多勞可能變成不能者不勞。
2.代碼風格迥異的兩人可能互相看不懂代碼,拖慢開發程序。
3.程式中總會出現公用代碼,一旦出現意見分歧,比較難解決。
4.增加了資源利用的成本。
我的同伴的優點:
1.程式設計能力極強。。。
2.性格很好,很容易溝通。
3.代碼風格跟我差不多,這點很欣慰~
我的同伴的缺點:
1.缺點跟我差不多,十一出去玩了,最後兩天才回來一起繼續工作。。。
工作照片:
二、 Information Hiding、interface design、loose coupling- Information Hiding:
資訊隐藏原則,是面向對象程式設計的基礎。資訊隐藏的好處是可以保護資料随意被修改,隻有擁有權限才可以通路并修改程式内的資料。這樣程式可以相對穩定執行,避免出現資料出錯導緻的程式崩潰。
将程式需要提供的功能子產品化,每個子產品完成各自的功能,每個子產品封裝起自己的資料,隻有自己才能通路并修改,即所有變量采用private型。這便保證了資訊隐藏。子產品之間的互動通過接口完成,也就是隻能通過通路子產品内的public方法,才可以在不通路子產品内任何資料的情況下,能且僅能擷取該子產品的功能(即傳回值)。
- interface design:
接口設計原則,可以令面向對象的程式設計封裝起來更加精簡。子產品化的程式中,每個子產品(即每個類)隻完成一個功能,然而有些時候我們需要許多“小”功能共同作用,完成一個大“功能”。這時候我們需要将所需的所有子產品執行個體化,再取其中的方法,連續調用,過于冗雜。這個時候我們定義一個接口,将所需的方法封在裡面,當需要完成“大功能”的時候,我們隻需調用這個接口就可以了。當然,應該盡量減少通用接口,具體問題具體分析,多提供特定的接口給使用者才更加人性化。
要想設計好的接口,不能再打代碼的過程中才開始規劃,而是要着手操作之前,就預先想好需要什麼接口。接口的設計依賴于“大”功能的數量。是以我們要對使用者要求的功能進行分析,哪些功能可以作為“大”功能,而這個大功能分别需要什麼“小”功能(即類),這樣在打代碼的過程中,我們才能邏輯清晰,高效完成。
- loose coupling:
松耦合高内聚。即子產品之間盡可能獨立,子產品内部資料聯系緊密。要想做到這點,必須在開始寫程式之前,将功能細化(子產品化),把使用者要求實作的功能分析清楚,盡可能獨立出各種“小”功能。使可以完成這些“小“功能的子產品,隻要求盡量少的輸入,即可傳回相應輸出,并且不依賴于其它子產品。
三、 Design by Contract, Code Contract
我認為有2個有點。
第一, 明确了使用者和開發者的義務和權利(即使用者提供正确輸入或輸入狀态即可獲得程式運作結果,開發者收到正确輸入并處于正确等待運作狀态便提供正确運作結果)後,開發者在開發過程中隻需要考慮正确的輸入即可,一切不正确的輸入(不滿足前置條件),都将報錯。精簡了程式邏輯,縮短了開發周期。
第二, 混在整段程式的冗雜判錯代碼段去除後, 清晰的程式邏輯架構有助于開發者Debug,一方面縮短開發周期,更重要的是有效減少了程式運作的安全隐患,因為開發者調試更加簡單,調理更加清晰。
缺點:
對使用者要求較高,雖然可以單獨提供判錯子產品對使用者的輸入及輸入狀态進行判斷,但是時間成本不一定比原本低。
我感覺實際上把契約思想加到這次作業中還是比較簡單的,這次作業中隻有一個子產品的前置條件比較苛刻,即計算使用者在界面輸入的題目的子產品。該子產品的前置條件是,使用者輸入的計算式符合格式規則。程式中隻需要加入一個判錯子產品,對不符合要求的輸入一律報錯即可。其它子產品因為存在互相調用關系,一個子產品的輸出即為另一個子產品的輸出,因為給定了每個子產品的輸出,是以其它子產品的輸入(前置條件)已預設滿足。
四、 unit test
窗體部分無法進行測試(Form1),且占代碼比例較大,若去掉窗體部分,覆寫率大概在85%~90%左右。
五、 UML
六、 算法實作
界面窗體使用了三個标簽頁來對接不同的功能子產品,界面示例如下:
TabControl作為切換頁
Checkbox作為是否選中某選項
NumericUpDown作為諸如值域以及其他的限制
Button作為啟動的按鍵和電腦的界面
TextBox作為一些輸出參數的顯示和輸入檔案路徑
然後,Generator負責實作根據設定生成題目。内部的core()的設計思路與個人項目相仿,但是因為有了不同的設定參數,是以在生成過程中,我采取的是以同一種大思路的前提下來對不同的情況進行優化設計的方案。
Judger和Calculator這兩個子產品的核心是Calculator子產品,即對輸入的字元串形式的題目進行計算。設計思路是分離判斷格式子產品和真正的計算單元,先判斷是否合法,在進行分析計算,實作起來難度都不大。