面向?qū)ο笫钱?dāng)前計(jì)算機(jī)界關(guān)心的重點(diǎn),它是90年代軟件開發(fā)方法的主流。面向?qū)ο蟮母拍詈蛻?yīng)用已超越了程序設(shè)計(jì)和軟件開發(fā),擴(kuò)展到很寬的范圍。如數(shù)據(jù)庫系統(tǒng)、交互式界面、應(yīng)用結(jié)構(gòu)、應(yīng)用平臺(tái)、分布式系統(tǒng)、網(wǎng)絡(luò)管理結(jié)構(gòu)、CAD技術(shù)、人工智能等領(lǐng)域。
不過我想上面說的應(yīng)該是國(guó)外吧!不知道國(guó)內(nèi)的90年代OO是否風(fēng)靡啊。偶是21世紀(jì)才開始接觸電腦的。記得那時(shí)候老師在給我們上C++課的時(shí)候,拼命說什么C++好啊,面向?qū)ο蟀。笳f了一通。總之,給我的感覺是,OO才開始風(fēng)靡。后來,學(xué)校里又開了一門課,叫著面向?qū)ο?#215;××什么什么的,忘了,反正就是在講面向?qū)ο蟆@蠋熞彩且粋€(gè)勁的給我們灌輸OO思想,叫我們區(qū)別好OO與OP的差別。不知道為什么會(huì)有這么一段,可能想說國(guó)內(nèi)的技術(shù)比國(guó)外的慢太多了。很多時(shí)候,其實(shí),語言也是一種原因!畢竟國(guó)內(nèi)好的翻譯太少了!而且不能總是等侯杰大叔叔來翻譯啊。記得以前在論壇上看到一句“名言”啊:不要看國(guó)內(nèi)作者寫的書,不要看國(guó)內(nèi)譯者翻譯的書,括弧(侯杰除外)。看起來似乎有點(diǎn)偏激,不過卻不無道理啊!很多的作者和譯者都是垃圾啊!!!!偶深受其害,因?yàn)榕己軔圪I書(看書就。。。呵呵)。記得我去年看重構(gòu)的時(shí)候,我覺得這個(gè)名詞還是很新的啊,看了那本書之后才發(fā)現(xiàn)原來這本書寫于上個(gè)世紀(jì),昏迷啊,國(guó)內(nèi)的技術(shù)太落后了。偶的e文也太落后了!要多關(guān)注關(guān)注國(guó)外的新技術(shù)。
扯遠(yuǎn)了。回來再談OO。
OO,很早就已經(jīng)學(xué)過了,很早以前就以為自己懂了,今天突然發(fā)現(xiàn)自己還不懂什么是OO,為什么要OO?以前的想法可能太簡(jiǎn)單了一點(diǎn),認(rèn)為只要是全都是對(duì)象就是OO了。
沒錯(cuò),在OO的思想中,所有一切東西都是O!但是,我發(fā)現(xiàn)在實(shí)際編程中,我連這一點(diǎn)都無法保證!而且,我也無法做到理論聯(lián)系實(shí)際,把理論應(yīng)用到實(shí)際。在實(shí)際運(yùn)用中,幾乎沒有考慮過O的問題。更多的時(shí)候是在考慮什么模塊怎么劃分,一個(gè)模塊應(yīng)該有幾個(gè)類阿,每個(gè)類都有些什么功能阿。但是我沒有把那個(gè)類作為一個(gè)對(duì)象來考慮,或者說沒有把那個(gè)類作為一類抽象的對(duì)象來考慮。需要什么東西就直接往里面加。不管加的東西跟那個(gè)類有沒有關(guān)系,都往里面塞!行為相當(dāng)惡劣。簡(jiǎn)直就是OP啊,每個(gè)類都成了一組function的wrapper了,相當(dāng)悲哀!不管function是否應(yīng)該屬于該類(或者說該對(duì)象)。搞不好什么時(shí)候就設(shè)計(jì)出個(gè):一個(gè)人有爬的行為!(結(jié)果肯定會(huì)被一群人狂揍哦)。
OO有什么優(yōu)點(diǎn)呢?為什么要OO?
OO使人們得變成與實(shí)際的世界更加接近,所有的對(duì)象被賦予屬性和方法,結(jié)果編程就更加富有人性化。
維護(hù)簡(jiǎn)單,模塊化是面向?qū)ο缶幊讨械囊粋€(gè)特征。實(shí)體被表示為類和同一名字空間中具有相同功能的類,我們可以在名字空間中添加一個(gè)類而不會(huì)影響該名字空間的其他成員。
可擴(kuò)充性,面向?qū)ο缶幊虖谋举|(zhì)上支持?jǐn)U充性。如果有一個(gè)具有某種功能的類,就可以很快地?cái)U(kuò)充這個(gè)類,創(chuàng)建一個(gè)具有擴(kuò)充的功能的類。
代碼重用,由于功能是被封裝在類中的,并且類是作為一個(gè)獨(dú)立實(shí)體而存在的,提供一個(gè)類庫就非常簡(jiǎn)單了。事實(shí)上,任何一個(gè).NET Framework編程語言的程序員都可以使用.NET Framework類庫,.NET Framework類庫提供了很多的功能。更令人高興的是,我們可以通過提供符合需求的類來擴(kuò)充這些功能。
在實(shí)際的編程中你有考慮過這些問題嗎?Sorry,偶是沒有考慮過。基本上是,維護(hù)很難!擴(kuò)充相對(duì)較容易,因?yàn)橹苯涌截愡^來,在修改(這有算是OO嗎?顯然否)。這種根本就是沒有利用到面向?qū)ο笾械闹赜眯浴U(kuò)充起來也不容易,需要什么功能就胡亂繼承一通,搞得類的層次太多了,無形之中給后人維護(hù)帶來了極大的困難。出現(xiàn)這些情況的原因是什么呢?前面的代碼設(shè)計(jì)的不夠好。面向?qū)ο蟮娜筇攸c(diǎn):封裝,繼承和多態(tài)有沒有都考慮進(jìn)來?面向?qū)ο笫且环N思想,是我們考慮事情的方法,通常表現(xiàn)為我們是將問題的解決按照過程方式來解決呢,還是將問題抽象為一個(gè)對(duì)象來解決它。很多情況下,我們會(huì)不知不覺的按照過程方式來解決它,而不是考慮將要解決問題抽象為對(duì)象去解決它。有些人打著面向?qū)ο蟮幕献樱芍^程編程的勾當(dāng)。
OOA呢?OO對(duì)A有什么幫助呢?
OOA的主要優(yōu)點(diǎn)
· 加強(qiáng)了對(duì)問題域和系統(tǒng)責(zé)任的理解;
· 改進(jìn)與分析有關(guān)的各類人員之間的交流;
· 對(duì)需求的變化具有較強(qiáng)的適應(yīng)性;
· 支持軟件復(fù)用。
· 貫穿軟件生命周期全過程的一致性。
· 實(shí)用性;
· 有利于用戶參與。
OOA方法的基本步驟
在用OOA具體地分析一個(gè)事物時(shí),大致上遵循如下五個(gè)基本步驟:
第一步,確定對(duì)象和類。這里所說的對(duì)象是對(duì)數(shù)據(jù)及其處理方式的抽象,它反映了系統(tǒng)保存和處理現(xiàn)實(shí)世界中某些事物的信息的能力。類是多個(gè)對(duì)象的共同屬性和方法集合的描述,它包括如何在一個(gè)類中建立一個(gè)新對(duì)象的描述。
第二步,確定結(jié)構(gòu)(structure)。結(jié)構(gòu)是指問題域的復(fù)雜性和連接關(guān)系。類成員結(jié)構(gòu)反映了泛化-特化關(guān)系,整體-部分結(jié)構(gòu)反映整體和局部之間的關(guān)系。
第三步,確定主題(subject)。主題是指事物的總體概貌和總體分析模型。
第四步,確定屬性(attribute)。屬性就是數(shù)據(jù)元素,可用來描述對(duì)象或分類結(jié)構(gòu)的實(shí)例,可在圖中給出,并在對(duì)象的存儲(chǔ)中指定。
第五步,確定方法(method)。方法是在收到消息后必須進(jìn)行的一些處理方法:方法要在圖中定義,并在對(duì)象的存儲(chǔ)中指定。對(duì)于每個(gè)對(duì)象和結(jié)構(gòu)來說,那些用來增加、修改、刪除和選擇一個(gè)方法本身都是隱含的(雖然它們是要在對(duì)象的存儲(chǔ)中定義的,但并不在圖上給出),而有些則是顯示的。
OO是個(gè)好東西啊。要理解OO的思想,并能夠在實(shí)際中運(yùn)用它。不過OO現(xiàn)在已經(jīng)不是最熱的了,在現(xiàn)在web2.0的年代,基于網(wǎng)頁上的應(yīng)用會(huì)更火啊。你開發(fā)個(gè)軟件,如果是單機(jī)版的,你都不好意思說!如果是C/S架構(gòu)的,你也是會(huì)被BS的。呵呵。現(xiàn)在什么SOA,AJAX那個(gè)火 啊!SOA是service oriented architecture,AJAX是什么東東?中間件、CRP、CPM等等,現(xiàn)在也是牛一B啊。學(xué)無止盡,學(xué)不能曬網(wǎng)啊;跟上時(shí)代的腳步,對(duì)新技術(shù)保持必要的觸覺。恩。
以上純屬胡言亂語,部分摘自網(wǎng)上。如果有興趣,偶?xì)g迎大家一起來討論啊。