麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Delphi > 正文

真正的Delphi面向?qū)ο缶幊?一)

2019-11-18 18:26:52
字體:
供稿:網(wǎng)友
一.實(shí)現(xiàn)商業(yè)對(duì)象
 
封裝了商業(yè)規(guī)則的類是真正面向?qū)ο缶幊痰幕A(chǔ)
這篇文章我們會(huì)涉及程序設(shè)計(jì)的各個(gè)方面,并對(duì)質(zhì)疑一些我們寫Delphi程序的慣用方式。這些設(shè)計(jì)方法背后的基礎(chǔ)概念是封裝:設(shè)計(jì)一組清楚定義接口(方法)類,由這些方法去操作他們的屬性。這一概念將會(huì)貫串整個(gè)程序并對(duì)數(shù)據(jù)如何保存和呈現(xiàn)有很大影響。我愿意介紹讀者學(xué)習(xí)Francis Glassborow's關(guān)于C++的文章,盡管語言不同,但是優(yōu)秀的類設(shè)計(jì)理念是和語言無關(guān)的。
現(xiàn)今大部分Delphi寫的程序都不是面向?qū)ο蟮摹V皇钦Z言中有對(duì)象的模型并使用了原有的或新的類,這并不意味者程序是真正的面向?qū)ο蟆4a的重用隨著第三方控件被拖到窗口上而結(jié)束,窗口和單元之間的相互依賴卻在迅速擴(kuò)散。(!!!)如果將來要改變程序的基礎(chǔ)(如切換不同數(shù)據(jù)庫或從兩層結(jié)構(gòu)變成三層結(jié)構(gòu))會(huì)嚴(yán)重受阻或花費(fèi)昂貴。如果是真正按面向?qū)ο蟮姆绞綄懙某绦騽t會(huì)很方便而不是受限制。當(dāng)然要寫這樣的程序需要理念的提升,而且開始的時(shí)候缺乏生產(chǎn)力,大部分開發(fā)團(tuán)隊(duì)都不情愿這樣或作考慮。我希望通過這篇文章向大家示范如何能寫出更好的程序。最終使系統(tǒng)更可靠,容易維護(hù),風(fēng)格一致,靈活,可重用,比用傳統(tǒng)方式寫的程序運(yùn)行的更好。特別是對(duì)大型的程序,代碼清晰并真正面向?qū)ο蟮某绦驎?huì)比傳統(tǒng)方式寫的同樣程序需要更少的維護(hù)資源。
面向?qū)ο蟮某绦蚋叩目煽啃詠碜杂跀?shù)據(jù)和操作被封裝在明確定義的類中。編譯器通過強(qiáng)大的類型檢查促使代碼中正確的類、方法和屬性,對(duì)未來一個(gè)改動(dòng)會(huì)影響整個(gè)程序的代碼不應(yīng)讓人有誤解代碼意圖的可能。正確使用類會(huì)是類之間的關(guān)系是自明的,并且大部分的代碼真正關(guān)注程序的關(guān)鍵部分(meat),而不是考慮像數(shù)據(jù)如何持久存儲(chǔ)這樣的細(xì)節(jié)問題。貫串代碼的簡(jiǎn)單性和一致性將使程序的維護(hù)性顯著提高。正如我們將看到的一樣,廣泛使用類繼承增加了生產(chǎn)力和可靠性,并且增強(qiáng)了一致性。這些一致性體現(xiàn)在所展示的代碼中,包括類的行為、數(shù)據(jù)如何存儲(chǔ)和用戶界面如何呈現(xiàn)數(shù)據(jù)。由于大部分功能在基類中提供,可以通過快速改變他們的行為來從根本上改變程序。(如用戶交互界面從窗口驅(qū)動(dòng)形式改為以html為基礎(chǔ))這些基類可以設(shè)計(jì)為與程序無關(guān),這樣第二個(gè)類似的程序?qū)⒃谏a(chǎn)力上立即得到推動(dòng)。對(duì)一個(gè)中等的程序一組優(yōu)秀的基類可以提供高達(dá)%50的顯著提升,從時(shí)間,開支到可靠性。首先要強(qiáng)調(diào)的是切換到真正的面向?qū)ο箝_發(fā)并非瑣碎小事,第一次應(yīng)保證有豐富經(jīng)驗(yàn)的協(xié)助,或者程序較小且沒有緊急的交付期限;還要說明的是一個(gè)面向?qū)ο螅∣O)的解決方案并不是規(guī)定在程序中哪些類該用哪些類不該用。如果一家公司開發(fā)了自己的可視化控件,或者使用第三方的可視化控件,
 
核心類
設(shè)計(jì)任何面向?qū)ο蟪绦虻牡谝徊绞强紤]哪些必須的類。這是絕對(duì)基本的一步,要有其他各種開發(fā)的技術(shù)保證,因?yàn)樵缙陔A段的錯(cuò)誤要改正將花費(fèi)昂貴。在設(shè)計(jì)我們的類時(shí)我們一般努力實(shí)現(xiàn)低耦合高內(nèi)聚-類與類之間盡量地獨(dú)立,但又可以通過某種強(qiáng)大地方式復(fù)合。實(shí)現(xiàn)這一目標(biāo)地一個(gè)方式是把類按照在它們程序中所扮演地不同角色來劃分成不同地類別。對(duì)這些角色的正確選擇將會(huì)形成一組內(nèi)聚的類。
在對(duì)類的角色設(shè)計(jì)中有一個(gè)貫串始終的基本原則:把類的責(zé)任分為表現(xiàn)、應(yīng)用和持久化存儲(chǔ)數(shù)據(jù)(典型地在數(shù)據(jù)庫中)。雖然這和三層數(shù)據(jù)庫程序地劃分是一樣的,要提示的是這種劃分的概念可以在多種環(huán)境中實(shí)現(xiàn):從單片機(jī)程序到分布式多層程序。組成應(yīng)用邏輯的這一組類負(fù)責(zé)最為困難的工作,例如響應(yīng)用戶操作和處理數(shù)據(jù)的請(qǐng)求。這一層類中有一部分類表現(xiàn)了真實(shí)世界的實(shí)體,并被系統(tǒng)所模型化。這些類常被稱為“商業(yè)類”或“問題域類”。它們構(gòu)成任何面向?qū)ο蟪绦蛑陵P(guān)重要的部分,因?yàn)槠渌念悓⑼ㄟ^某種方式支持這些類,它們成為所有開發(fā)者關(guān)注的焦點(diǎn)。
識(shí)別一個(gè)特定程序中有哪些商業(yè)對(duì)象一般是經(jīng)驗(yàn)的本能,雖然這過程里面有一個(gè)完整的學(xué)科(或是藝術(shù)?)面向?qū)ο笈c傳統(tǒng)技術(shù)如SSADM(1)相比的優(yōu)點(diǎn)貫串于整個(gè)分析設(shè)計(jì)和維持實(shí)體的過程:可以通過面向?qū)ο蠓治觯∣OA)、面向?qū)ο笤O(shè)計(jì)(OOD)和面向?qū)ο缶幊?OOP)來表現(xiàn)每個(gè)商業(yè)對(duì)象。我們會(huì)在后面探尋識(shí)別合適的商業(yè)對(duì)象的部分技巧。首先我們假設(shè)下面這些過程已經(jīng)完成。
不同層(表現(xiàn)、應(yīng)用和持久)間的類的互相通信已經(jīng)清楚定義并且相互連接。這些類的關(guān)系如圖1
 
圖中的箭頭顯示同一個(gè)層中的類可以調(diào)用另一個(gè)類中的方法。這張圖同時(shí)說明表現(xiàn)層(用戶界面)的類可以操作應(yīng)用層或用戶界面中的其他類,應(yīng)用層(商業(yè)對(duì)象)可以操作應(yīng)用層的類和調(diào)用持久層的方法,持久層只回應(yīng)應(yīng)用層的請(qǐng)求。
 
商業(yè)對(duì)象
為了演示商業(yè)對(duì)象是如何實(shí)現(xiàn)的,我們接下來將看到一個(gè)簡(jiǎn)化的程序,其中有庫存,客戶和訂單實(shí)體(某個(gè)公司提供一定數(shù)量的貨物,客戶來買這些貨物)。我們最初的分析確定需要三個(gè)商業(yè)對(duì)象表現(xiàn)這些實(shí)體。在我們的Delphi程序中將有三個(gè)類:TStockItem, TCustomer 和Torder。清單1中顯示了這些類的公共接口。這里需要指出這些類的特性是通過屬性(PRoperty)暴露給外部的:這是一個(gè)簡(jiǎn)單而有益的類設(shè)計(jì)并且通過屬性控制外部的訪問。還有就是這些屬性應(yīng)該在類的published區(qū)域(原因會(huì)在后面提到),并被賦給合適的默認(rèn)default值。雖然這些屬性限定只在流化類時(shí)被用到,會(huì)給每個(gè)屬性合適的初始值并使代碼更具自描述性。
 
第一個(gè)類框架
在開發(fā)程序的初始階段,我們已經(jīng)識(shí)別并實(shí)現(xiàn)了三個(gè)商業(yè)對(duì)象。這三個(gè)對(duì)象扮演共同的角色:通過某種方式表現(xiàn)真實(shí)世界的實(shí)體。因此我們希望它們和真實(shí)世界的實(shí)體有相似的屬性和適當(dāng)?shù)膶哟巍N覀儗⒔o每個(gè)對(duì)象一個(gè)共同的基類,叫做TPDObject(Problem Domain object)。隨著時(shí)間推移我們會(huì)在這個(gè)類里加入公共的方法和屬性,TPDObject將會(huì)不斷得到擴(kuò)展。需要注意的是TPDObject不要(永遠(yuǎn)不要)有任何跟特定程序有關(guān)的元素。作為一個(gè)程序無關(guān)的類它將放在一個(gè)獨(dú)立的單元并形成框架的基礎(chǔ):一組可以在許多程序中重用的類。在后面我們的框架會(huì)有很大擴(kuò)展,形成提供重要的程序無關(guān)功能的基類,并可以被迅速用于特定的系統(tǒng)。我們TStockItem、TCustomer 和 Torder就是從TPDObject為特定系統(tǒng)定制對(duì)象。
TMyAppPDObject是TPDObject的一個(gè)繼承類,雖然它的實(shí)現(xiàn)部分是空的,但是它是一個(gè)很好的示范;如果我們?yōu)樵谔囟ǔ绦蚣幽承┨囟ㄔ兀⒂绊懗绦蛑兴械膯栴}域類,這樣的類層次應(yīng)該是比較合適的。清單中列出了框架的初期代碼。類TPDObject還只提供一個(gè)只讀屬性ID,它的類型是TobjectID。這個(gè)屬性給了每個(gè)對(duì)象一個(gè)標(biāo)識(shí)符:我們將把相同類型和ID的兩個(gè)實(shí)例認(rèn)為是同樣的對(duì)象。這里ID被故意聲明為自己的類型是為了避免被直接賦給其它標(biāo)準(zhǔn)類型的值。TobjectID的類型并沒有經(jīng)過特別的選擇:在這里我選擇了整形,在特定情況下它也可能是一個(gè)專門的類。雖然用類作ID好像是更純的面相對(duì)象,但基于我們的問題域類在程序運(yùn)行中會(huì)被創(chuàng)建、釋放上千次考慮,為了避免創(chuàng)建和釋放對(duì)象時(shí)額外的負(fù)荷,我并沒有這樣做(作為純粹主義論者我把TobjectID包含在TPDObject中作為復(fù)合的對(duì)象)。在代碼中有一對(duì)函數(shù)用于轉(zhuǎn)換字符串和我們的對(duì)象標(biāo)識(shí)類型,并且有一個(gè)常量作為沒有賦值時(shí)的初始值。有很多課堂會(huì)提到對(duì)象標(biāo)識(shí):有的說所有的商業(yè)對(duì)象都應(yīng)該在創(chuàng)建時(shí)被賦予一個(gè)程序內(nèi)不重復(fù)的標(biāo)識(shí)(甚至是GUID)。實(shí)際上,能在給定的上下文中區(qū)分不同的對(duì)象才是真正重要的,并且保持這一簡(jiǎn)單性將會(huì)在性能和存儲(chǔ)空間上有明顯的好處。
關(guān)于規(guī)范的問題:
為了強(qiáng)化一些設(shè)計(jì)的理念和設(shè)計(jì)類框架時(shí)的做法我將提一些問題,請(qǐng)讀者思考它們后面的基本原理是什么。我曾提到對(duì)于真正的面向?qū)ο笤O(shè)計(jì)并不禁止使用特定的類,但有一個(gè)很重要的例外。這個(gè)例外是什么(答案在圖1中)
((( Listing 1 - An application-specific Problem Domain unit (abridged) )))
unit ProblemDomain;
 
interface
 
uses
  Framework;
 
type
  TMyAppPDObject = class (TPDObject)
  end;
 
  TStockItem = class (TMyAppPDObject)
  published
    property Name: String;
    property QuantityInStock: Cardinal default 0;
    property TradePrice: Currency;
    property RetailPrice: Currency;
  end;
 
  TCustomer = class (TMyAppPDObject) … ;
 
  TOrder = class (TMyAppPDObject) … ;
 
implementation
 
end.
((( End Listing 1 )))
 
((( Listing 2 - An application-independent Framework unit )))
unit Framework;
 
interface
 
const
  NotAssigned = 0;
 
type
  TObjectID = type Integer;
 
  TPDObject = class
  private
    FID: TObjectID;
  public
    property ID: TObjectID read FID default NotAssigned;
  end;
 
function StrToID (Value: String): TObjectID;
function IDToStr (Value: TObjectID): String;
 
implementation
 
 
end.
((( End Listing 2 )))
 
 
(1)   SSADM(Structured Systems Analysis & Systems Design)是1981年英國政府的中央電腦及電訊中心 (Central Computer and Telecommunications Agency ,簡(jiǎn) 稱 CCTA ; 網(wǎng) 站 :http://www.ccta.gov.uk )研制的軟件分析設(shè)計(jì)標(biāo)準(zhǔn)方法。
 
Philip Brown is a systems design consultant and active developer, presenter, and trainer. He'll promote the benefits of strong OO techniques to deliver better applications given any opportunity. You can contact him at [email protected].

上一篇:Delphi的消息處理

下一篇:用Delphi編寫數(shù)據(jù)報(bào)存儲(chǔ)控件

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
學(xué)習(xí)交流
熱門圖片

新聞熱點(diǎn)

疑難解答

圖片精選

網(wǎng)友關(guān)注

主站蜘蛛池模板: 久久精品视频3 | 国产精品www | 国产精品一区二区羞羞答答 | 欧美在线观看视频一区 | 成人午夜精品久久久久久久蜜臀 | 久久久成人一区二区免费影院 | 亚洲码无人客一区二区三区 | 国产电影精品久久 | 欧美精品国产综合久久 | 国产精品视频一区二区三区综合 | 狠狠干五月天 | 亚洲天堂成人在线 | 欧美精品一区自拍a毛片在线视频 | 精品亚洲视频在线 | 日日摸夜夜添夜夜添牛牛 | 午夜视频免费播放 | 一区二区三区视频在线观看 | 国产亚洲精品视频中文字幕 | 色淫视频 | 欧美亚洲国产一区 | 毛片一级网站 | 亚洲精品久久久久久久久久久 | 免费黄色小网站 | 717影院理论午夜伦八戒秦先生 | 日本精品免费观看 | av在线更新| 日韩精品羞羞答答 | 欧美三日本三级少妇三级99观看视频 | 国产呻吟 | 久久精品久久精品国产大片 | 狠狠操人人干 | 91精品国产九九九久久久亚洲 | 久久精品亚洲欧美日韩精品中文字幕 | 奶子吧naiziba.cc免费午夜片在线观看 | 一区二区三区在线观看av | 国产91在线高潮白浆在线观看 | 欧美黄一区 | 7777视频 | 国产成人免费精品 | 羞羞的视频在线观看 | 搜一级毛片 |