1. 程式人生 > >淺談基於過程與基於物件

淺談基於過程與基於物件

程式設計的人都知道:C是基於過程的,C++是基於物件的。 那基於過程與基於物件的思維有什麼不同呢? 本文是博主初學時的一點薄見,希望能夠拋磚引玉,也希望大蝦們批評指正。一切都為共同進步。。。 淺顯地說: 基於過程就是將一個任務分解成一個一個的步驟,通過連續的實現步驟最後完成任務目標。 而基於物件則是將整個任務分成一個一個的模組,不同模組之間彼此獨立又有聯絡。 為了方便理解,我舉例來說。 例:編一個黑白棋程式(8橫8縱的方格棋盤上,中間四個方格位置是初始棋子,兩黑兩白相間排布。兩方輪流落子,執黑棋者先,可吃子時必須吃子,不可吃子時輪流填子。吃子條件是——以黑吃白為例——兩黑子間有且只有一串白子,中間不可有空格,黑子落,符合吃子條件的任意兩黑字間的連續的白子全部換黑。直至64格棋盤滿,數子多者勝)。 >>基於過程: 第一步:黑棋落子; 第二步:判斷任意兩黑字間是否滿足吃子條件; 第三步:滿足吃子條件的兩黑子間的白子全部換黑; 第四步:判斷是否滿盤,如滿盤則數子,子多者勝; 第五、六、七、八步參考前四步; 以上各步迴圈直至滿盤判斷出勝負為止。 >>基於物件: 可將整個任務分成幾大模組:棋盤資料程式、落子程式、檢測規則程式、結果判斷程式。 落子程式分黑白兩個棋子物件,黑白子行為相同(輸入為棋盤空位座標;輸出落子顏色和落子位置)。 檢測規則程式判斷落子處是否合法(輸入為落子顏色和落子位置;檢測行為1:是否與上次落子顏色不同?2:是否存在可吃子的空位而未落在此類空位上;輸出為落子合法與落子不合法)。 棋盤資料程式是在落子合法後呼叫(輸入為落子顏色和落子位置;程式行為1:落子位置屬性由空轉為滿,2:任意兩黑子間如為連續白子全部換黑;輸出為棋盤更新顯示)。 結果判斷程式用來判斷是否滿盤,如滿盤則數子,輸出勝負結果;未滿盤則執行空語句。 >>對比兩種設計的實現思路: 面向過程的思路好像更簡單,符合實際行棋過程。 但不妨設想一下:如果像跳棋一樣,不只黑白兩種顏色,程式步驟是否成比例增加? 如果落子規則再增加十條呢?最終結果不止勝負兩種呢? 對於棋來說可能不會如此無限制的增加下去,但迴歸我們的主題:討論基於過程與基於物件兩種思維的不同,進而比較其優劣性: 隨著計算機硬體效能、容量的不斷髮展以及計算機在社會各個層面的深入普及應用,大資料、大規模、高複雜性的軟體工程越來越成為主流需求。 這時如果還是面向過程的思維去設計程式,顯然不是人力所能應對的。 反觀面向物件的思路: 由於它將整個任務分解成了有限的物件類別(如本例中的棋盤資料、落子、檢測規則、判斷結果),就可以將更多的步驟(成百上千或者萬、億步)都簡單的歸為幾大類別的物件(可組織實現大規模軟體開發、利於後期維護)。 每個物件有自己面向的資料和處理行為,只是對外吸收一些必要資訊就可以給出結論,如此就可以被高效的重複呼叫(可重用性)、可以將幾個小物件組合成一個大物件(封裝)、可以在原有物件的基礎上進行二次開發(繼承)、還可以針對不同的輸入給出不同的輸出結果(多型)。 事實上:封裝、繼承、多型正是實現面嚮物件的技術基礎,而利於開發大規模的軟體、便於後期維護與高效重複呼叫正是面向物件的優勢。 基於物件的軟體開發設計思路,正應時代潮流,被越來越多的人所推崇。 >>具體基於基於物件的嵌入式應用例項,請參考接下來的案例分析。