oo到底給我們帶來了什麼影響?本文結合筆者實踐的體會,試圖對此做乙個簡單的**。至於更為深入、細緻、完整的討論,大家自當查閱相關書籍。此外,本文沒有提及oo的負面影響。
這裡採用了一種由特殊到一般,由簡單到複雜的思考方法。
讓我們來考慮一種極端的、也是最簡單的情況,乙個系統中只有乙個類。
此時,將類的屬性和對屬性的操作繫結在一起,使得用這種方法描述的系統,更自然、更具邏輯、更符合人們的思維習慣。這使我們在從物理世界到軟體世界的建模變得相對容易。同時也使實際編寫的**更具可讀性。除此以外,oo所帶給我們的並不比此前的任何一種程式設計方法要多多少。對於易於建模,其實是相對的。對於可讀性,甚至可以認為並非是oo所帶給我們的,乙個缺乏經驗的programmer,使用oo同樣會寫出糟糕的**來。另外,當所有這些,經過compiler加工之後,便又回到了「原始社會」,在那裡,oo世界已經不復存在了。
當系統變得稍微複雜一些時,出現了多個具有橫向關係的類(即不考慮繼承關係,至於繼承則要在晚些時候再提到),oo世界中的另乙個基本要素——類間關係(另乙個當然是類本身了),便出現了。它會以各種可能的形式,滲透在整個系統所包含的類中:類中含有對另乙個類的引用,類中方法的引數和返回值具有另乙個類的型別,等等。
此時,類的對外介面便顯得尤為重要了。對類屬成員可見性的控制,使它更適於描述現實世界中的實體。作為物理世界中的實體在軟體世界中的對應物,類對外表現著一定的功能,它是半封閉的,並保持一定狀態(通過類屬資料體現)。當外界某個條件觸發其功能時(也被稱作訊息傳遞機制),它對其自身屬性的操作,使之從一種狀態遷移到另一種狀態。另外,由於前述類間關係的存在,它也可能通過與之相關聯的類所提供的介面,觸發這些類的功能,進而改變它們的狀態。這樣的事情,在任何乙個oo系統中都相當普遍,功能的觸發以及由耦合所產生的「鏈式」反應時常會發生。
讓我們再來考慮另一種複雜度相當的情況,在這個系統中只包含兩個具有縱向關係的類。
此時,oo的乙個重要特性——繼承,登場了。在這種情形下,我們所能看到的是重用性。把易於復用的,相對穩定的內容,從乙個類中抽取出來,放入另乙個類。前者稱為派生類(或子類),後者稱為基類(或超類)。當系統加進第三個類,並且也需要基類中的**時,它可以選擇從基類派生,並對派生後的行為和屬性做必要的定製(overloading/overriding)。對於乙個持續發展的軟體系統而言,可重用性是至關重要的。同樣,從概念上講,這種重用的方式,較之傳統的類似平面結構的庫函式而言,也更自然,更易於維護。
將前述兩種情形合併,得到了最一般的,也是最複雜的情形,乙個系統中包含多個類,它們彼此間具有橫向和縱向的關係,或者兼而有之,或者沒有任何關係。
此時,oo所帶給我們的好處是:底耦合。在引入繼承後,對於某個基類而言,系統其餘部分可能與之保持著某種聯絡。但對於這些部分,它們只需知道基類即可,而無需認識其派生類。所以,當派生類發生改變時,一般而言,系統其餘相關部分是無需改變的。同時,當引入oo的另乙個重要特性——多型之後,一切變得妙不可言。因為,過載基類的虛函式,外部呼叫這些函式的**無需改動,便會出現不同結果。
此外,對於總是和耦合一起出現的內聚,其實在前面第一種情況中,就可以看到。類中資料在類範圍內是「全域性」的,它們在類範圍內,任何時候任何地方都可以被引用。軟體工程中的耦合和內聚在程式語言中得到了對應實現。這使我們從設計到實現的過渡,變得相對容易。
在前面提到的最後一種情形中,類的封裝性的作用也變得更為突出了。因為,你可以通過控制類屬成員的可見性,使系統耦合得到適當降低,系統其餘部分只需要知道它們該知道的資訊就可以了。
最後指出一點,知道這些,並不等於你永遠不會犯錯誤。儘管你或許深諳理論,卻也難免時常會在**的海洋中迷失方向。這就好像,你看懂了某個數學定理並看懂了其證明過程,為其精妙的思路所嘆服,並深以為然。但你可能仍然無法很好的運用它,在實際解題的過程中發揮作用。只有這些觀念根深蒂固地植入你的大腦,成為你的習慣性思維之後,你才算得上是乙個經驗豐富的programmer。這代表你具有了深邃的洞察力,敏銳的嗅覺。
個人觀點,僅供參考。
OPC給我們帶來了什麼
眾說紛紜opc,說有什麼好處了,好像只要opc了,一下就ok了,冷靜的想一下也沒那麼多好處。opc只是提供了一種廠商之間的介面,尤其是在硬體提供商和軟體提供商之間可以完全實現各自開發自己的產品。大家都符合這個規範,以後用的時候就不用考慮怎麼實現硬體和軟體的互聯,而只用關心系統是如何實現 怎麼能更快更...
遊戲給我們帶來了什麼 ?
我是乙個遊戲愛好者 不是很瘋狂的那種 沒事的時候就玩玩遊戲。不知道是怎麼的玩遊戲的時候時間過的很快 比上課的時間快的多呢 雖然不是樣樣都玩的好,但是至少在這個過程中得到了不少東西 當然有好有壞啦 舉個例子吧,遊戲帶來的大多是快感,玩的時候幾乎什麼事情都忘記了 吃飯有時候都 有個名人說過 由於資金短缺...
CMM到底給我們帶來了什麼?
最近我們部門在努力通過cmm3中,經過一段時間的培訓和實做。發現了一些比較令人困惑的地方,記錄下 來可以 一下。cmm的目標是提高組織的成熟度,利用軟體開發過程通過固化甚至嚴格量化的過程來提高整個組織的成熟 度進而達到較高的專案成功率和客戶滿意度。嗯,通過最初的培訓,經歷了以前開發過程比較混亂,存在...