国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
面向?qū)ο蟮姆治龊驮O(shè)計(jì)-抽象出對(duì)象
摘要:在面向?qū)ο笤O(shè)計(jì)中,如何抽象出對(duì)象。不完善的,想與大家交流的經(jīng)驗(yàn)。
作者:cuichaox@gmail.com
 
軟件分析和設(shè)計(jì)的階段,開(kāi)發(fā)人員學(xué)習(xí)問(wèn)題領(lǐng)域的各種概念,分析系統(tǒng)要完成的功能,思考如何去分割并征服,想象未來(lái)系統(tǒng)的樣子。在整個(gè)過(guò)程中,不斷地學(xué)習(xí),不斷地發(fā)現(xiàn)又不斷地創(chuàng)造。模糊的概念,錯(cuò)綜的流程和捉摸不定的靈感無(wú)序地出現(xiàn)在大腦,就像飄來(lái)浮去的幻影。有時(shí)候感覺(jué)腦中滿滿的,亂的像一鍋粥;有時(shí)候感覺(jué)腦中空空的,沒(méi)有什么明確的思路,無(wú)從著手。
 
思維是十分復(fù)雜的活動(dòng),但仍然有規(guī)律。探索開(kāi)發(fā)過(guò)程的思維規(guī)律,無(wú)疑是有益的。抽象是人類認(rèn)識(shí)復(fù)雜世界的基本方法。同樣,其方法廣泛用于軟件分析和設(shè)計(jì)的過(guò)程中。無(wú)論結(jié)構(gòu)化程序設(shè)計(jì),還是在面向?qū)ο蟪绦蛟O(shè)計(jì)。
 
面向?qū)ο蟮脑O(shè)計(jì),其主要任務(wù)是對(duì)象模型的構(gòu)造。一個(gè)較勁朋友問(wèn)我什么是對(duì)象模型,我的答案是:對(duì)象和對(duì)象之間的關(guān)系組成的系統(tǒng)。在面向?qū)ο蟮募夹g(shù)中,抽象方法是發(fā)現(xiàn)對(duì)象的基本方法,十分重要。一個(gè)巧合:Abstraction 翻譯成中文是“抽象”,就像是“抽取對(duì)象”的縮寫。
 
本文的探討,主要應(yīng)用在面向?qū)ο蟮募夹g(shù)中。當(dāng)然基本原理都是相通的:甚至,你編寫SHELL腳本的時(shí)候,你也能使用面向?qū)ο蟮幕驹韥?lái)提高你產(chǎn)品的質(zhì)量。
什么是抽象
抽象在軟件方法中有著特殊的含義?“抽象”這個(gè)概念有點(diǎn)抽象。
 
現(xiàn)實(shí)世界的東西所以能夠被分類,是因?yàn)橥活惖臇|西表現(xiàn)出相似性,根據(jù)你的思考角度,在一個(gè)較高的層次上,考慮你關(guān)注的共性,忽略不同個(gè)體的個(gè)性。在這個(gè)角度上思考的時(shí)候,你就可以忽略其個(gè)體差異造成的復(fù)雜。這樣,你就得到了一個(gè)東西的抽象。在本文中,“抽象”這個(gè)詞有兩個(gè)含義:一個(gè)代表“思維方法”;一個(gè)代表“抽象出的概念”
 
抽象時(shí)除了關(guān)注東西的本質(zhì)屬性,還要考慮觀察問(wèn)題的角度。在一個(gè)人事管理系統(tǒng)中的人的抽象和在CS游戲中人的抽象,肯定具有不同的行為和屬性。
 
雖然說(shuō)是“發(fā)現(xiàn)”共性。有時(shí)更像是“發(fā)明”。比如:C語(yǔ)言的printf函數(shù)之所以能夠打印所有基本類型的變量,是因?yàn)樵O(shè)計(jì)者創(chuàng)造了格式符的概念。抓住了的所有基本類型的變量有共性:可以根據(jù)指定的格式打印,但設(shè)計(jì)者必須發(fā)明“格式符”的概念來(lái)體現(xiàn)他。這里我使用這個(gè)例子,也是說(shuō)明:抽象不光用在面向?qū)ο蟮念I(lǐng)域。打印字符串、打印整數(shù)和打印小數(shù),本來(lái)是多種行為,但作者發(fā)現(xiàn)(更像發(fā)明)其共性,才設(shè)計(jì)了這個(gè)更加通用的函數(shù)。而不是設(shè)計(jì)一堆函數(shù):printString, printInt,PrintFloat等。
 
抽象、分類法和層次
這是三個(gè)密切不可分的概念。在已有的抽象上再次抽象,就出現(xiàn)的分類的層次。面向?qū)ο蟮母拍钪?,繼承體現(xiàn)了層次。對(duì)象之間的父子關(guān)系,體現(xiàn)了父類型和子類型的關(guān)系。在對(duì)象建模的過(guò)程中,我常常使用分類法來(lái)激發(fā)靈感。比如思考:我要處理的數(shù)據(jù)一共有幾類,同類的數(shù)據(jù)是否可以統(tǒng)一處理?
 
對(duì)象來(lái)自哪里
對(duì)象可能來(lái)自問(wèn)題領(lǐng)域也可能來(lái)自實(shí)現(xiàn)領(lǐng)域。有下面的幾種情況:
1.       有的對(duì)象直接代表用戶需求描述或功能描述中的概念,這類一般是真實(shí)世界的實(shí)體:如汽車,拖拉機(jī)。
2.       有的對(duì)象直接是功能分割的一個(gè)單元,習(xí)慣結(jié)構(gòu)化編程的人,特喜歡設(shè)計(jì)這種對(duì)象,如文件分析器,數(shù)據(jù)處理器。這種方法很容易誤導(dǎo),要小心使用。構(gòu)造幾個(gè)互相協(xié)作,責(zé)任明確的對(duì)象完成功能。一般使用角色和責(zé)任分配的說(shuō)法,不使用功能分配的方法。細(xì)想起來(lái),模塊化設(shè)計(jì)和面向?qū)ο笤O(shè)計(jì)的本質(zhì)都是“分割并且征服”,有些情況下許多東西也是相通的。
3.       有些對(duì)象直接對(duì)應(yīng)計(jì)算機(jī)上硬件或系統(tǒng)的資源。如內(nèi)存池,日志文件,線程對(duì)象。實(shí)現(xiàn)這些類的時(shí)候,注意設(shè)計(jì)合理的接口,這種類一旦實(shí)現(xiàn),今后可以反復(fù)使用。
4.       用來(lái)實(shí)現(xiàn)其他類的工具對(duì)象。如:C++的各種容器,String等,這些也是可以被反復(fù)重用的對(duì)象實(shí)現(xiàn)。
面向?qū)ο蟮膽?yīng)用。有三個(gè)最為成功的領(lǐng)域:模擬現(xiàn)實(shí)領(lǐng)域、計(jì)算機(jī)圖形領(lǐng)域和圖形界面開(kāi)發(fā)庫(kù)。是因?yàn)檫@三個(gè)領(lǐng)域,很容易抽象出來(lái)對(duì)象。而大多情況下,抽象對(duì)象并不是一個(gè)容易的工作。從這個(gè)角度看:一些傳統(tǒng)的開(kāi)發(fā)人員,特別是UNIX程序員反對(duì)面向?qū)ο蠹夹g(shù),也是有其道理的。
 
避免過(guò)度的抽象
對(duì)象模型本質(zhì)上也是分割并且征服。分割并且征服,是對(duì)付復(fù)雜度的基本方法。但有的時(shí)候過(guò)度分割反而導(dǎo)致復(fù)雜性。Linux之父Linus說(shuō):把一個(gè)復(fù)雜的東西,分割成兩部分,每一個(gè)部分是簡(jiǎn)單了,但多出了要處理兩個(gè)部分關(guān)系的復(fù)雜性。在對(duì)象建模的過(guò)程中,要避免過(guò)度的抽象。
 
比如:“狗和羊,成為不同類的對(duì)象也許是合理的,但花狗和黑狗沒(méi)有必要使用不同的類定義,只需要給狗這個(gè)類型定義一個(gè)顏色屬性就可以了”。
 
在實(shí)踐中,我發(fā)現(xiàn)設(shè)計(jì)模式的不當(dāng)使用,常常帶來(lái)過(guò)度抽象。我曾經(jīng)建議一個(gè)新手:減少flag功能的全局變量的使用。后來(lái)這個(gè)認(rèn)真的人,把每一個(gè)flag變化都放到了一個(gè)singleton對(duì)象中封裝起來(lái),這樣看起來(lái)是沒(méi)有全局變量了,卻增加了一堆新的類。哦,天哪!避免全局變量,是要避免使用這個(gè)全局變量的模塊之間的緊耦合,現(xiàn)在全局變量變成singleton對(duì)象了,并且因?yàn)橐粋€(gè)類帶來(lái)的接口要比一個(gè)全局變量復(fù)雜,實(shí)際上是耦合的更緊了。又有一個(gè)同志,對(duì)工廠類模擬虛擬構(gòu)造的原理研究的爐火純青,設(shè)計(jì)中,幾乎要把所有的對(duì)象都使用工廠來(lái)構(gòu)造,給我的感覺(jué):一個(gè)闊少有很多工廠來(lái)給自己造內(nèi)褲,不同的分廠生產(chǎn)不同樣式的內(nèi)褲――有錢燒的。關(guān)于設(shè)計(jì)模式不當(dāng)使用的情況,我今后將有一個(gè)文章詳細(xì)探討。
 
請(qǐng)記住著名的KISS原則:Keep It Simple, Stupid!你能找到很多理由把簡(jiǎn)單問(wèn)題搞復(fù)雜,但往往能找到更好的理由把復(fù)雜問(wèn)題搞簡(jiǎn)單。抽象是為了處理復(fù)雜性,不要越抽象越復(fù)雜。
 
封裝驅(qū)動(dòng)抽象
封裝是面向?qū)ο蟮幕咎卣?。我的一個(gè)經(jīng)驗(yàn),就是借助封裝的思路來(lái)抽象對(duì)象。每當(dāng)碰到復(fù)雜并且容易變化的邏輯,我就想:是不是設(shè)計(jì)一個(gè)對(duì)象把它封裝起來(lái)。我把這種思考設(shè)計(jì)的方法稱為:封裝驅(qū)動(dòng)抽象。
 
在軟件系統(tǒng)中,可以被封裝的東西很多。最常見(jiàn)的是一個(gè)實(shí)體的狀態(tài)和行為可以封裝,抽象出一個(gè)對(duì)象。整個(gè)系統(tǒng)的某個(gè)相對(duì)獨(dú)立的特性和行為也可以被封裝,如:一個(gè)程序中,許多模塊都要記錄日志,就可以把日志抽象成一個(gè)對(duì)象,提供日志記錄的接口。某種容易變化的業(yè)務(wù)邏輯,也可以被封裝。一個(gè)復(fù)雜的算法,也可以被封裝。
 
被封裝和抽象的東西,一般是:直接的概念、可以分離的特性、相對(duì)獨(dú)立的知識(shí)或是容易變化的因素。每當(dāng)看到這種東西,我都下意識(shí)的想到抽象。
 
抽象不一定成為對(duì)象
前面也說(shuō)過(guò),抽象不是面向?qū)ο蠹夹g(shù)中獨(dú)有的方法。甚至在面向?qū)ο蟮脑O(shè)計(jì)中,抽象也不一定成為對(duì)象。使用對(duì)象封裝就是:把知識(shí)和邏輯封裝到對(duì)象中,對(duì)象的使用者就可以變得愚蠢和簡(jiǎn)單;如果設(shè)計(jì)通用的數(shù)據(jù)結(jié)構(gòu)或靈活的配置文件,甚至可以把知識(shí)和邏輯封裝到數(shù)據(jù)或配置中,這樣你的程序就可以變得愚蠢和簡(jiǎn)單,所謂簡(jiǎn)單是可靠之母。我就喜歡傻壯的程序。我的另一個(gè)文章《被忽視的方法mini-language》專門對(duì)這種方法進(jìn)行了介紹。
本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/cuichaox/archive/2006/11/17/1392634.aspx
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
面向?qū)ο蟾菀桩a(chǎn)生糟糕的設(shè)計(jì)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服