官术网_书友最值得收藏!

1.2 面向?qū)ο蠹夹g(shù)基礎(chǔ)

什么是面向?qū)ο蠹夹g(shù)?不同人從不同角度考慮就有不同的理解。可以認(rèn)為,面向?qū)ο蠹夹g(shù)是一種處理計(jì)算機(jī)軟件系統(tǒng)的觀點(diǎn);也可以說是一種系統(tǒng)分析和設(shè)計(jì)的思想,或是一種編程方法;又或者說是一組設(shè)計(jì)原則和模式。

面向?qū)ο蠹夹g(shù)是一系列指導(dǎo)軟件構(gòu)造的原則(如抽象、封裝、多態(tài)等),并通過語言、數(shù)據(jù)庫和其他工具支持這些原則。從定義可以看出,從本質(zhì)上講,對象技術(shù)是對一系列相關(guān)原則的應(yīng)用。有些書中采用“面向?qū)ο蠹夹g(shù)=類+對象+抽象+封裝+繼承+多態(tài)+消息……”這樣更直觀的形式定義面向?qū)ο蠹夹g(shù)。因此如果在應(yīng)用過程中沒有很好地利用這些思想,那么就不是面向?qū)ο蟆>拖竦?.1節(jié)中的Java實(shí)例,雖然定義了類,但是目標(biāo)不是為了抽象、不是為了封裝、不是為了多態(tài),這就不是面向?qū)ο蠹夹g(shù)。

1.2.1 面向?qū)ο蠹夹g(shù)的發(fā)展歷史

在掌握對象技術(shù)的應(yīng)用之前,有必要介紹一下面向?qū)ο蠹夹g(shù)的發(fā)展歷史,特別是幾個(gè)標(biāo)志性事件。

(1)Simula語言:面向?qū)ο蠹夹g(shù)最早起源于1962—1967年出現(xiàn)的Simula 67語言,該語言是由Ole-Johan Dahl和Kristen Nygaard在挪威奧斯陸的國家計(jì)算中心設(shè)計(jì)實(shí)現(xiàn)的,它是世界上公認(rèn)的第一種面向?qū)ο笳Z言,在該語言中第一次提出了類、對象、封裝等基本思想。

(2)Smalltalk語言:使面向?qū)ο蠹夹g(shù)進(jìn)入實(shí)用化的標(biāo)志則是1970年誕生的Smalltalk語言,它是由美國施樂公司的恪洛阿爾托研究中心(PARC)的Alan Kay設(shè)計(jì)實(shí)現(xiàn)的,是第一個(gè)成熟的面向?qū)ο笳Z言,在這個(gè)語言中提供了完整的面向?qū)ο蠹夹g(shù)解決方案(諸如類、對象、抽象、封裝、繼承、多態(tài)等)。該語言的很多思想到現(xiàn)在還被廣泛應(yīng)用(如MVC、重構(gòu)等)。

(3)C++語言:對象技術(shù)能夠發(fā)展到今天這個(gè)地步,離不開1983年誕生的C++語言。正是因?yàn)镃++語言的廣泛應(yīng)用,面向?qū)ο蠹夹g(shù)才真正從實(shí)驗(yàn)室階段走到了商業(yè)化階段,當(dāng)今流行的Java、C#等面向?qū)ο蟮木幊陶Z言都有C++語言的影子。

(4)UML:面向?qū)ο蠹夹g(shù)發(fā)展初期成果還主要體現(xiàn)在面向?qū)ο缶幊陶Z言的應(yīng)用領(lǐng)域。然而隨著軟件工程技術(shù)的日益成熟和受到重視,在20世紀(jì)80年代末、90年代初,面向?qū)ο蟮能浖こ桃驳玫搅搜杆侔l(fā)展。在此期間,各種面向?qū)ο蟮姆椒▽映霾桓F,這給普通用戶的使用帶來了很大的困擾。而1997年統(tǒng)一建模語言(Unified Modeling Language, UML)的產(chǎn)生則標(biāo)志著面向?qū)ο蠓椒▽W(xué)的統(tǒng)一,從而為面向?qū)ο蠹夹g(shù)的應(yīng)用掃清了最后一個(gè)障礙。此后,所有的軟件工程師都可以使用他們的通用語言——UML來表達(dá)面向?qū)ο蟮乃季S。

1.2.2 面向?qū)ο蠹夹g(shù)的優(yōu)勢

作為一種區(qū)別于傳統(tǒng)結(jié)構(gòu)化方法的開發(fā)技術(shù),面向?qū)ο蠹夹g(shù)被廣泛認(rèn)可和應(yīng)用是因?yàn)樗陨淼膬?yōu)勢,這些優(yōu)勢體現(xiàn)在很多方面。

1.溝通——在計(jì)算機(jī)中模擬現(xiàn)實(shí)世界的事和物

和傳統(tǒng)結(jié)構(gòu)化方法更側(cè)重于計(jì)算機(jī)表達(dá)問題的能力不同,面向?qū)ο蠹夹g(shù)更順應(yīng)人類思維習(xí)慣,讓軟件開發(fā)人員在解空間(計(jì)算機(jī)環(huán)境)中直接模擬問題空間(現(xiàn)實(shí)世界)中的對象及其行為。這一特點(diǎn)使得開發(fā)人員能夠更有效地在用戶環(huán)境和實(shí)現(xiàn)環(huán)境之間進(jìn)行轉(zhuǎn)換,從而能夠更加快速、有效地解決用戶問題。

下面的這段代碼采用最早的計(jì)算機(jī)語言(匯編語言)編寫而成,它的目標(biāo)是表達(dá)一件現(xiàn)實(shí)世界所發(fā)生的事情。然而,它到底要表達(dá)什么呢?對于普通用戶來說,這段代碼簡直是一段“天書”,恐怕只有專業(yè)的技術(shù)人員才能對它進(jìn)行有效的應(yīng)用和維護(hù)了。

    PUSH EBX
    MOV EBX, EDX
    MOV EDX, EAX
    SHR EDX,1 6
    DIV BX
    …

而同樣的這件事情,采用面向?qū)ο蠹夹g(shù)來描述就變得非常形象和生動(dòng)了。原來它是在描述一件動(dòng)物世界發(fā)生的故事,很形象且很容易理解。

    AHare.Run;
    ALion.Catch(AHare);
    ALion.Kill(AHare);
    AHare.Dead;
    ALion.Eat;
    ALion.Happy;

2.穩(wěn)定——較小的需求變化不會(huì)導(dǎo)致系統(tǒng)結(jié)構(gòu)大的改變

在軟件開發(fā)過程中,需求的不穩(wěn)定性是影響軟件工程的一個(gè)非常重要的因素。社會(huì)在發(fā)展,用戶的要求也在提高,軟件開發(fā)人員不可能要求用戶不進(jìn)行任何需求變更。那么,如何面對這樣的變更呢?面向?qū)ο蠹夹g(shù)的核心思想就是用穩(wěn)定的元素將不穩(wěn)定的元素封裝起來,從而將變更的影響降到最低。在現(xiàn)實(shí)應(yīng)用中,功能是最易變的,數(shù)據(jù)是較易變的,而對象則是較穩(wěn)定的。為此,軟件開發(fā)人員就用較穩(wěn)定的對象將易變的功能和數(shù)據(jù)進(jìn)行封裝,從而保證了系統(tǒng)的穩(wěn)定性。這好比一枚雞蛋,因?yàn)橛辛说皻み@層封裝,蛋清(功能)和蛋黃(數(shù)據(jù))才能夠穩(wěn)定存在。

3.復(fù)用——提高質(zhì)量,降低成本

隨著計(jì)算機(jī)應(yīng)用的日益廣泛,軟件規(guī)模越來越龐大,開發(fā)人員如何能夠快速、有效地構(gòu)造軟件呢?作為一種智力勞動(dòng),構(gòu)造軟件的過程并不是簡單的加減法問題。一個(gè)人需要10個(gè)月時(shí)間才能夠完成的工作,并不等同于10個(gè)人用一個(gè)月時(shí)間就完成了,此種情況下必須采用有效的方法才可能在一個(gè)月內(nèi)完成。Borland公司創(chuàng)始人Philippe Kahn曾經(jīng)說過:“軟件開發(fā)組越大,組中每個(gè)成員的生產(chǎn)率就越低”,他還提出了這樣一個(gè)公式:

該公式的含義:一個(gè)人一年單獨(dú)能夠編寫15000行有效代碼(Ln),但隨著項(xiàng)目組的人數(shù)n的不斷增加,其有效代碼的數(shù)量會(huì)下降。由此可見,構(gòu)造大型的軟件不能僅靠堆人,而需要采取有效的方法——復(fù)用。LOC是Line of Code的縮寫,即軟件規(guī)模性代碼行。

面向?qū)ο蠹夹g(shù)通過封裝、繼承、聚合等手段,提供了各種不同層次的復(fù)用(如基于類庫、框架等的代碼層復(fù)用,基于抽象、多態(tài)、模式等設(shè)計(jì)層的復(fù)用),開發(fā)人員應(yīng)該可以切身體會(huì)到面向?qū)ο髲?fù)用所帶來的好處。例如Java開發(fā)者通過調(diào)用龐大的Java類庫,可以快速實(shí)現(xiàn)很多業(yè)務(wù)功能,而不需要進(jìn)行太多的編碼。這種基于復(fù)用的開發(fā)方法極大地提高了軟件的開發(fā)效率,也大大降低了軟件開發(fā)的難度。

除了上面所提到的3個(gè)優(yōu)勢外,面向?qū)ο蠹夹g(shù)還有其他優(yōu)勢,如改善軟件結(jié)構(gòu)、提高軟件靈活性、增加可擴(kuò)展性、支持增量式開發(fā)、支持大型軟件開發(fā)等。這些優(yōu)勢使面向?qū)ο蠹夹g(shù)得到了更廣泛地應(yīng)用。

主站蜘蛛池模板: 喀什市| 威宁| 建水县| 上蔡县| 宁夏| 广饶县| 西峡县| 漠河县| 论坛| 中江县| 濮阳市| 色达县| 桦南县| 日土县| 万年县| 彩票| 鹤壁市| 仁布县| 望谟县| 绥芬河市| 元阳县| 仪陇县| 杨浦区| 璧山县| 台南市| 衡阳县| 郯城县| 东方市| 新疆| 抚松县| 会宁县| 舞阳县| 贵州省| 嘉义县| 安溪县| 博兴县| 浑源县| 通榆县| 故城县| 临朐县| 全椒县|