基本介紹
- 書名:面向對象項目開發經驗大成:基於。NET實現
- 作者:牛樹長 楊海波 俞丹琛 黃智洪 著
- ISBN:9787121083983
- 頁數:892頁
- 定價:¥98.00元
- 出版社:電子工業出版社
- 出版時間:2009-4-1
- 開本:16
宣傳語,適用人群,序,前 言,目 錄,
宣傳語
從簡單的對象封裝開始,逐步到快速開發的平台。
適用人群
序
推進工業化與信息化的融合,需要工業領域和信息領域的工作者共同創新,離不開每個行業、每個企業中專職人員的探索與實踐,所謂的成果就是這些精英在解決具體問題時所迸發出的智慧之光。《“面向對象”項目開發經驗大成:基於.NET實現》一書則是中核集團核工業計算機套用研究所的專家們的智慧,是長期科研、實踐中積累的開發思想、實踐經驗及失敗教訓的總結與升華出來。
中國核工業集團公司秉承集團化、專業化的運作理念,積極推進科研院、所的成果迅速轉化成主導產業的生產力,是集團公司持續發展的重要策略之一。核工業計算機套用研究所是集團中唯一的信息化產業單位,為了有效實現各企業的套用系統研發,構建“構件化軟體開發平台”則是我們科研的重點課題。經過幾年的潛心努力,我們取得了一些卓有成效的成果,現出版的《“面向對象”項目開發經驗大成:基於.NET實現》則是該成果中的一部分。
面對全國核工業迅速發展的形勢,中核集團核工業計算機套用研究所在引進國外先進、成熟的信息技術產品的同時,針對核工業的特殊性不斷地提升自己在關鍵技術上自主的能力。在企業套用層面如何推動信息技術套用的課題上勇於探索、大膽實踐並取得了長足的進展。“構件化軟體開發平台”是我們自行研製、具有自主智慧財產權的高效開發工具,特別便於迅速搭建符合於企業自身特點的信息管理系統。通過該平台所開發的各套用項目,能夠與核燃料企業的生產、管理過程密切貼合,便於套用並有利於普及。該成果現已經推廣到其他的能源行業,同樣體現出良好的套用效果並得到用戶的高度評價。該平台不僅為中核集團信息化工程、核燃料生產企業的套用提供了有力的支撐,同時也在實踐的過程中得到完善與深化。
盈利是企業的宗旨。對於信息技術服務企業來說,能否實現技術復用與套用模式復用應當是實現盈利的關鍵所在。《“面向對象”項目開發經驗大成:基於.NET實現》一書中為技術體系的建立、設計方案的有效復用、套用系統模型的有效復用的提供了思路和實現的具體方法。
讀者可以本書來體會面向對象理念的具體實踐,從而使軟體架構設計不再神秘,面向對象不再抽象,軟體開發不再是因人而異,軟體工程管理不再是一團亂麻,軟體明星與一般程式設計師在技術層面上有機融合,從而使整體團隊的創造力更加協調、高效。
核工業計算機套用研究所長
肖心民 2009-2-19
前 言
本人在軟體行業磨練了很多年,歷經的大大小小軟體項目(管理類、ERP類)不下幾十個,其中自有一些酸甜苦辣的感受可以與讀者交流。很多編程人員迫切希望提高應對實戰的能力,但苦於市面上很難找到這方面的參考書籍,這種感慨在職業圈中普遍存在。身邊同仁的熱情邀請與一些善意蠱惑促成了本書的寫作,說是個人體會也罷,說是經驗之談也罷,總歸是十年磨一劍,香自苦寒來,目的是與大家分享一些個人的感悟而已。
讀者群體
本書基於開發過程的各個環節,總結篩選了一批經常可以被“復用”的命題素材,並將其創造成極具代表性的設計樣例。以此來由淺入深地詮釋面向對象的設計理念是如何被套用於實踐的問題。這些設計過程基本可以做到與語言無關,但本書中則是基於.NET C#實現的具體樣例。
這些樣例並不局限於某個項目的具體套用,而是側重於通用、共性的特點,當把這些通用、共性的設計成分組織成一個相對完整的體系之後,就可以形成一個具有“復用”價值的開發工作環境。以這些通用設計為基礎進行套用項目的開發,可以大大提高開發效率、降低對人員素質的要求,也可以在減少測試工作量的同時保證開發質量。
只要能夠堅持面向對象的設計理念,做到自定義“構件”一點也不難,在你設計了一批“構件”並能形成體系的時候,自然就會發現“構件”化的設計體系也不過如此。同時也會感慨:面向對象的殿堂原來是如此壯觀與輝煌。
本書涉及軟體工程的各個方面:從基本規範到數據構造,從對象設計到系統框構,從項目組織到實施交付等各個層面。如果你正置身於軟體行業之中,不管你在擔當著哪種角色,都會或多或少地得到一些有價值的參考。
編程人員:本書系統性地介紹了一大批非常經典的“自定義類”及“公用方法”,編程人員可以從中選擇一些自己感興趣的設計樣例作為突破點,通過模擬實現或直接引用來解決實戰中的真實命題。因為這些樣例就是針對那些實戰中帶有普遍性的問題而設計的,只有能夠回歸實戰才會有實際意義。通過這個過程可以儘快達到領悟設計理念、提高技術水平、解決實戰問題的多重目的。
架構設計:架構設計是項目的難點,也是質量優劣的關鍵。因為它是將抽象思維付諸實踐的過程,經常是代碼不多,但其作用會遍及整個系統。如果單純地介紹這種存在於有形無形之間的構思會很困難,也不容易被套用於實踐。本書則特別注重了架構在體系中的形成過程與作用方式,並且通過各個層面上的設計樣例來描述這些基於“控制項思維”的各種具體實現,其中既包括簡單的控制項對象,也包括各種元素的作用關係,還包括整個系統的狀態控制與功能組配。在設計樣例中不乏那些貫穿於系統、要求適應性、富於變化而又基於代碼難以窮盡的各種命題,只有通過抽象構思、架構方案才有可能徹底解決。比如:容器類的封裝、授權機制、審計機制、選單管理、熱鍵配置等類似的命題都是在架構設計過程中所要面對的實際命題。
開發管理:通過全面理解面向對象的開發特點,對把握規範的執行、理解設計難度、合理指派人力資源、合理安排任務的實現順序等問題會有更明確的認識。尤其是如何避免主觀理解的差異、溝通中的偏差等常見問題,這些都需要具體的措施與策略。通過對象的封裝與模板的使用,可以達到簡化設計任務描述、精確控制設計目標與設計過程的目的。
項目實施:設計方案的“可配置”性是一種系統化的構思,這樣的設計得益於面向對象的封裝,也得益於系統架構的體系完整。基於這樣的構思可以在極大程度上改善實施過程對編程人員的依賴性。設計過程側重於業務邏輯的控制,實施過程則側重於外在的數據表現及簡單的參數調整。很多需求變化完全可以通過現場的參數配置來適套用戶需求的各種變化,甚至能在現場實現套用功能的“重載”。
經營決策:如何減少對自然人的依賴程度,把歷史上的技術過程積澱成企業的技術積累是企業所關心的問題。只要組織得當,通過面向對象的設計過程,不但能夠有效形成企業的技術積累,還能形成“套用模型”的有效積累。一旦積累形成,就能形成有效的“復用”,也會減少對自然人的過度依賴。在技術層面上對人力資源的細分,有助於降低成本與提高效率。這些經驗都已納入本書的闡述目標,並且形成了可被復用的具體模式。
工程監理:本書涉及軟體工程的大部分通用性問題(而不是針對某個具體項目),從中所能得到的規律性內涵對把握軟體項目的關鍵節點能夠起到重要的作用。這些工程理念對準確理解甲方意圖、準確分辨設計方案的優劣、清晰控制進度節點、敏感發現項目中的癥結所在等都會有所幫助。
面向對象之領悟
“對象”以真實的事物(不是抽象概念或通俗比喻)為原型,通過封裝與繼承來解決事物規律(類)與真實套用(實例)中可能出現的差別,這就是把錯綜複雜的命題變成整體打包的“封裝”過程。由於這個過程必須要強調對事物過程的歸納與抽象,所以必然會提高設計“對象”的門檻,也正是因為“類對象”存在著這樣的抽象過程,所以才有可能降低套用實例的實現難度,並能具備較大的適用範圍。
很多程式設計師對“對象”概念的理解是“霧裡看花”的狀態,似乎能理解,但又不知道該怎樣套用。只會使用系統提供的基本“對象”,卻不會(或根本就不知道)設計或封裝屬於自己的“自定義對象”。僅僅會使用別人提供的工具幹活,只是一個勞動者,並不能成為一個名副其實的“設計”者。
客觀地說,“面向對象”的設計理念聽起來容易做起來難。經常見到一些自認為“精通”面向對象理念的程式設計師卻從來沒有實現過“對象”的設計與封裝,此間不乏帶有一些啼笑皆非的意味。如果把面向對象的理念比作一個殿堂,很多徘徊在門口的人都自以為早已身居殿堂之中,其實這是一個誤解。
編程的意義並不在於通過“代碼(或簡單的套用系統對象)”來描述需求,更主要的是要通過符合“設計理念”的方式,將原始需求轉變成能夠體現“設計思想”的“對象(最貼近於事物自身特性的設計單元)”並通過這種代表著需求內涵的“對象”來完成“設計”。
如果要判別是否真正理解了“面向對象”的開發理念,最簡單、最直接的方式就是看他是否實現過“自定義對象”的封裝,因為這是對面向對象理念的初衷與歸宿。
開發環境為我們提供了設計、封裝、引用各種“對象”的技術手段,如何在這個舞台上抽象、構造、設計、使用屬於我們自己的各種套用“對象”,才是真正展示我們駕馭“面向對象”能力的具體體現。
不要以為“面向對象”就是那么深奧、那么難以理解,其實它就像一層“窗戶紙”,只要你輕輕地“捅”一下,一切問題就會迎刃而解。關鍵是是否意識到了這層“窗戶紙”的存在,並要伸出手指即可。相反,如果沒有意識到它的存在,或不願意為此有所付出,那也只能是在殿堂的門口“霧裡看花”了。
面向對象之設計
面向對象的魅力在於真實與抽象之間的演變。
管理信息系統是個強調個性化的主題,但應當明確的是:這種個性化所對應的是系統功能,而不一定是軟體的設計元素與設計過程。當我們把設計粒度降低到各個“對象”元素的時候,就會驚奇地發現,絕大部分對象具備相同的形態與操作邏輯。
把問題的普遍性抽象成“類”,它將表示一個獨立的事物單元,在“實例化”的過程中將會通過屬性的改變實現個性化功能的引用與設定。這就是我們所說的“自定義控制項”的封裝與引用。這些就是我們設計自定義控制項的意義所在。
項目的設計過程應當理解為事物單元“組裝”過程。事物單元的抽象程度越高、涵蓋能力越強,項目設計就會越輕鬆,可以被引用的事物單元(類)越多,實例級的代碼量就會越少。在設計過程中,面向用戶功能的代碼量可以作為對“面向對象”程度的基本評價。
如果沒有自定義控制項的存在,所有的業務功能都要通過實例級的代碼實現,功能與模式的重複往往會意味著代碼的複製。這種設計方式只是面向過程理念在面向對象環境下的沿用而不是真正的面向對象設計。對於這一點一定要有清醒的認識。
出於事物自身的特點,完全螢幕蔽掉實例級的代碼是不可能的,但如果抽象程度合適,實例級的代碼相當於裝配過程中的連線件,而不再是設計的主體所在。我們的設計目標是:儘量通過封裝與派生的手段來解決問題,在實例化的過程中代碼量越少越好。
代碼量的減少只是一種現象,但它所表現出來的應當是面向對象的構思能力與設計水平。只有高度的抽象與完美的封裝,才有可能在最大程度上減少實例級的代碼量,這才是我們的目的所在。
就項目過程而言,控制項的封裝只是最基本的元素單元,在此基礎上,還有很多可以被抽象、歸納的功能與模式,這些可以理解為更高層次的封裝,它們在解決項目代碼的復用程度上具有更加簡約、有效的表現能力。
規範是建立體系的基本前提,承載能力取決於數據體系的構建,適應能力則取決於參數方案的設計。項目的總體構成基本包括代碼(包括控制項)、數據(包括參數)、服務(參數維護與定式功能),這些就是我們實現每個設計的實際過程。
開發只是項目過程中的一個環節,實施過程中的各種變化與適應性調整也是成本消耗的重要組成部分。完成用戶的功能需求只是最基本的設計要求,高水平的設計應當充分考慮在實施或套用過程中各種可能會出現的變化。這是適應性的起源。基本功能的實現來自用戶的業務要求,而運行狀態下的“柔性”定製則是來源於對規律的抽象與升華。關於適應性的提升是降低成本、提高開發價值的重要課題。
更高層次的設計應當是“模式”的概念,代碼的復用只能解決功能點上的問題,模式的復用則會側重於一類功能或一類實現的共性。控制項基於對代碼層面的封裝,模式則側重於程式結構的復用。自定義控制項與自定義模式共同形成了基於項目定製實現快速開發的“工作平台”。
面向對象之管理
軟體開發商要保證營利,軟體從業人員要體現自身價值,其中具有共性的內涵就是“如何才能快速執行客戶訂單”的核心問題。這也是本書所要解決的核心問題:系統性地介紹軟體開發過程中所遇到的種種難題並翔實地探討實戰應對的具體策略。這裡的目標是如何高效率、高質量地實現各種企業管理套用項目的開發。
朦朧的需求、朦朧的簽約,契約的約束能力形同虛設,這種項目的風險性可想而知。投資人只知道朦朧的管理目標,剩下的全部是開發商的問題了。雙方都有良好的初衷,開發商也會竭盡全力,直到成本消耗殆盡時才發現離項目總體目標的實現仍然很遙遠。這是很多項目過程的真實寫照,也是雙方都要共同面對的尷尬。面對實現難度極大、工作量極為浩繁的代碼設計過程,如何才能規避這些風險,難道不值得我們採取慎重、積極的應對措施嗎?
要想改變投資方的狀態幾乎是不可能的,爭取更大的投資也不現實,剩下的只有一個可能,即“軟體開發商必須要提高自身項目交付的能力”!只有妥善解決了這個問題,才有可能在市場環境下持續生存。所以,每個開發商都希望形成自己的技術積累,都希望形成自己的核心競爭力,但要想實現這個目標並不是一件容易的事,這裡有人才問題、技術問題、成本問題、時間問題等。
軟體工程既是一個強調個人能力的過程,也是一個強調協同效率的過程。既要突出精英的核心作用,又要把精英的設計精華被更多的人來復用。這是平抑成本與工期的主要策略。這裡的核心問題是代碼的“復用”與實施過程的“適應與變通”。形成可被復用的技術積累只是一個基本的層面,如果能把技術積累組織成完整、完備的體系,則會進一步提升積累的市場價值。
很多人把這個過程看成是一個難以達到的境界,其實不然。面向對象的設計理念為技術積累的有效形成提供了最基本的技術保證,只要我們能夠正確理解並能持之以恆地加以運用,形成有效的技術積累只不過是個時間問題,這一點不管對團隊還是對個人,都是相同的。只要認認真真地從一點一滴做起,仔仔細細地研究並能相對完美地解決好每個命題(無論問題的大小,只要有復用價值),就能通過“自定義對象”的方式來形成有效的技術積累並能達到有效復用的目的。積累的對象多了、範圍廣了、解決問題的思路深化了,一個屬於自己的技術體系也就會在自然過程中逐步形成。這就是所謂的“道法自然”。
目前流行的編程環境無一例外地都在支持“面向對象”的開發技術,因為它是迄今為止最能被人公認的一種開發理念,也是最能體現軟體成熟度的一種實現手段。在經歷了幾年的普及過程之後,幾乎所有套用系統都採用了“面向對象”技術,似乎這種技術已是“深入人心”。如果仔細觀察一下就會發現,實際情況並非如此。很多人把使用“面向對象”的開發環境與運用“面向對象”的設計理念混為一談。就如同會“使用汽車”與會“設計汽車”之間的差別類似,從“會用開發環境”到“掌握設計理念”之間確實還存在一個“門檻”,並不是每個程式設計師都能輕而易舉跨過這個“門檻”的。
“面向對象”的理念既是一種思維模式,又是一種實現手段。如果忽略了思維模式的作用,就會以“面向對象”的開發環境實現著“面向過程”設計的不倫不類的開發模式,目前這種開發模式的存在帶有相當範圍的普遍性。
領悟並運用面向對象的開發理念,達到提高設計水平的效果,增加企業或個人的自身價值是貫穿全書的基本宗旨。
關於本書閱讀
本書以.NET C#為實現的開發環境,其中的需求分析、命題構思等與語言環境基本無關,在其他語言環境下仍然具有完整的參考價值。本人曾用Delphi、Visual Basic、Visual Foxpro分別實現過這些設計方案,全都取得了令人滿意的效果。
限於篇幅,本書認為讀者基本具備了使用.NET C#的水平。為了更加通俗易懂,對於有些備受專業人員推崇的接口、虛類、虛方法等設計技巧採取了保守的態度。儘管這些技術可能會帶來一些最佳化設計的效果,但也會增加理解與實現上的難度。在有可能採用簡單技術的時候,儘量地避免了這些抽象設計的採用,這也是迴避技術風險的有效措施。
為了有效利用版面,所以在代碼格式上進行了壓縮,請讀者閱讀時諒解。
1.去掉了代碼之間的間隔行,必要時把多個命令合併到一行,極個別的碼行縮進部分略有壓縮,這對閱讀效果略有影響,但卻節省了版面空間。
2.凡是自動生成且沒有被變更的構造函式“private void InitializeComponent()”則從代碼中刪除,因為這部分代碼可以從再現的過程中自動生成。
3.在前部分的樣例中可能會引用後面一些設計作為樣例,只要理解控制項在樣例中的作用就可以了,這些樣例在後續部分將會給出更詳細的介紹。
本書以通俗的方式對上述各種命題給予了真實的實現。敘述、圖式等各方面都是基於簡單的工作文檔為素材(並非專業級的設計方案)。其中的觀點純屬個人體會,不免存在各種各樣的偏頗之處,懇切希望能夠得到讀者的賜教並請海涵。
與本書相關的設計由俞丹琛、黃智洪主持。系統構思由牛樹長提供,代碼實現主要由楊海波完成,其中的窗體生成器由肖慶實現,幫助文檔生成器由熊峰實現。在此對上述人員及所有參加設計、編寫的人員表示感謝。
作者:牛樹長 2009-1-18
目 錄
第1章 需求分析要略 1
本章從經驗的角度敘述中小企業項目“需求分析”過程中所遇到的具體問題及相應的應對策略。
1.1 概述 1
1.2 素材蒐集 2
1.2.1 素材蒐集 3
1.2.2 素材的局限性 5
1.2.3 素材評價 5
1.3 需求分析 6
1.3.1 把握大局 7
1.3.2 掌握規律 7
1.3.3 體系構造 11
1.3.4 需求分析樣例 14
1.4 需求方案撰寫 16
1.4.1 售前方案 16
1.4.2 需求報告 16
1.4.3 需求規格 18
1.5 需求與項目風險 19
1.5.1 來自用戶的風險 19
1.5.2 來自開發過程的風險 20
1.5.3 需求分析與對象 21
1.5.4 提升需求分析的能力 21
1.6 總結 22
第2章 數據體系與規則 23
本章要解決表、主鍵、內鍵、外鍵、數據欄位的命名規範,以及控制項、屬性、方法的命名規範。數據體系構建策略的優劣對項目影響重大,也是提高團隊開發效率的關鍵。
2.1 概述 23
2.2 命名規範 24
2.3 表結構定義 25
2.3.1 物理表命名 25
2.3.2 欄位命名 26
2.3.3 總體約束 29
2.3.4 命名小結 29
2.4 物理表分類 30
2.4.1 參數表 30
2.4.2 辭彙數據表 31
2.4.3 基礎數據表 31
2.4.4 業務數據表 32
2.5 物理表設計 33
2.5.1 主鍵 33
2.5.2 外鍵設定 35
2.5.3 內鍵設定 39
2.6 關於索引 40
2.6.1 建立索引 40
2.6.2 聯合索引 40
2.6.3 索引套用 41
2.7 實現與版本 41
2.7.1 設計實現 41
2.7.2 數據版本 42
2.8 代碼命名規則 42
2.8.1 規範的意義 43
2.8.2 規範的目的性 44
2.8.3 命名規則定義 44
2.8.4 對象命名 45
2.8.5 類與對象命名 46
2.8.6 自定義類的主題字註冊 47
2.8.7 其他命名規則 48
2.9 代碼書寫規範 50
2.10 總結(規範的作用) 50
第3章 自定義按鈕控制項 51
本章以系統的“Button”類為例講解自定義控制項封裝的實現步驟與方法,針對每個命題詳細講解歸納、抽象、構思、設計、套用的全部過程,最終形成具有通用價值的按鈕類。
3.1 概述 51
3.1.1 解決代碼復用 52
3.1.2 統一設計模式 52
3.1.3 統一設計風格 53
3.1.4 便於系統維護 53
3.1.5 封裝的粒度 54
3.2 自定義類 54
3.2.1 對象與封裝 55
3.2.2 類與繼承 55
3.2.3 類的屬性 56
3.2.4 接口 56
3.2.5 自定義類 56
3.3 接口套用 57
3.3.1 接口實現 57
3.3.2 接口的意義 58
3.3.3 接口繼承示例 58
3.3.4 接口繼承樣例 59
3.3.5 接口套用樣例 59
3.4 錄入輔助按鈕 60
3.4.1 自定義“Button”到“BTN_”基礎類 60
3.4.2 自定義“BTN_展開”子類(輔助編輯) 64
3.4.3 自定義“BTN_唯讀”子類(狀態控制) 68
3.4.4 自定義“BTN_瀏覽”子類(打開檔案) 72
3.4.5 自定義“BTN_上傳”子類(轉儲檔案) 78
3.4.6 自定義“BTN_路徑”子類(檔案位置) 86
3.4.7 自定義“BTN_圖片”子類(圖片管理) 88
3.4.8 自定義“BTN_結構”子類(輔助編輯) 90
3.4.9 “BTN_”類封裝小結 93
3.5 工具列按鈕 94
3.5.1 錄入過程控制 94
3.5.2 實現錄入控制的途徑 96
3.5.3 自定義“ToolStripButton”到“TSB_”類 97
3.5.4 自定義“TSB_退出”子類(關閉窗體) 101
3.5.5 自定義“TSB_增加”子類(數據級聯) 102
3.5.6 自定義“TSB_刪除”子類(數據級聯) 115
3.5.7 自定義“TSB_複製”子類(記錄複製) 119
3.5.8 自定義“TSB_修改”子類(數據維護) 123
3.5.9 自定義“TSB_保存”子類(數據存儲) 125
3.5.10 自定義“TSB_刷新”子類 127
3.5.11 自定義“TSB_查詢”子類(激發條件合成) 127
3.5.12 “TSB_”封裝小結 128
3.6 自定義“Label”到“LBL_”類 128
3.6.1 命題與構思 129
3.6.2 代碼實現 130
3.6.3 套用示例 132
3.7 總結(掌握封裝的理念) 134
第4章 自定義數據控制項 136
數據採集過程最能令人困惑,情況各異的功能性變化遍布於系統之中。如何構造簡單、標準且具有良好的通用性的自定義控制項則是本章所要解決的問題。
4.1 概述 136
4.2 自定義“Textbox”到“TB_”類 137
4.2.1 命題提出 137
4.2.2 代碼實現 138
4.2.3 自動綁定數據源 142
4.2.4 自動生成助記碼 143
4.2.5 套用正則表達式 145
4.2.6 自動生成條件子句 146
4.3 由“TB_”封裝的子類 149
4.3.1 自定義“TB_定位訪問”子類 149
4.3.2 自定義“TB_定位插入”子類 159
4.3.3 服務:FRM_重碼選擇 168
4.3.4 自定義“TB_數值”子類 174
4.3.5 自定義“TB_統計”子類 178
4.3.6 自定義“TB_取值”子類 182
4.3.7 由“TB_”封裝的套用類 183
4.3.8 小結 188
4.4 自定義“Textbox”到“TB_票號”類 189
4.5 自定義“ComboBox”到“CBX_”類 197
4.5.1 命題提出 197
4.5.2 設計構思 198
4.5.3 代碼實現 199
4.6 自定義“CBX_”的子類 212
4.6.1 封裝子類的意義 212
4.6.2 自定義“CBX_辭彙”子類 213
4.6.3 自定義“CBX_集合填寫”子類 216
4.6.4 自定義“CBX_物理表”子類 220
4.6.5 自定義“CBX_表欄位”子類 221
4.6.6 自定義“CBX_Grid列”子類 224
4.6.7 自定義“CBX_Grid數值列”子類 225
4.6.8 自定義“CBX_顏色選擇”子類 227
4.6.9 小結 230
4.7 自定義“Listbox”到“LB_”類 231
4.7.1 代碼實現 231
4.7.2 自定義“LB_物理表”子類 232
4.7.3 自定義“LB_表欄位”子類 233
4.7.4 自定義“LB_Grid列”子類 234
4.7.5 自定義“LB_同比”子類 237
4.8 服務:FRM_結構字元串 242
4.9 自定義“DateTimePicker”到“DTP_”類 247
4.9.1 命題與思路 248
4.9.2 代碼實現 250
4.9.3 套用樣例 254
4.10 自定義“CheckBox”到“CKB_”類 256
4.10.1 命題提出 257
4.10.2 設計構思 257
4.10.3 代碼實現 258
4.10.4 套用樣例 261
4.11 自定義“RadioButton”到“RB_”類 263
4.12 總結(封裝的成本價值) 265
第5章 自定義Grid控制項 267
封裝Grid控制項需要更多的經驗、歸納、抽象與參數,封裝向著功能化發展。經過完善、強化的Grid控制項集中解決了數據編程的難點問題,同時提升了數據的表現能力與控制能力。
5.1 概述 267
5.2 自定義“DataGridView”到“GDV_”類 268
5.2.1 命題提出 269
5.2.2 總體構思 270
5.2.3 總體效果 272
5.3 數據裝載 282
5.3.1 命題提出 282
5.3.2 設計構思 283
5.3.3 綜合樣例 293
5.4 樣式與規則 295
5.4.1 命題提出 295
5.4.2 構思與實現 296
5.4.3 套用樣例 311
5.4.4 正則驗證 313
5.5 動態設定 316
5.5.1 左側鎖定(隨機定義鎖定) 316
5.5.2 主從聯動(設定) 319
5.5.3 主從聯動(撤銷) 321
5.5.4 同步刷新(數據集聯合動作) 323
5.5.5 欄位隱藏(設定可見與次序) 328
5.5.6 卡片控制 334
5.5.7 欄位值統計(隨機統計計算) 336
5.5.8 增加選擇列(全選與撤銷) 340
5.5.9 懸停提示(輔助提示) 341
5.6 格線參數 342
5.6.1 參數表(局部) 342
5.6.2 窗體與代碼 342
5.6.3 數據集命名 345
5.6.4 約束表達式(記錄級驗證) 347
5.6.5 警示表達式(記錄級警示) 351
5.6.6 判重表達式(欄位聯契約束) 352
5.6.7 強調色表達式(強調格線行) 355
5.7 數據服務 357
5.7.1 批量查找(逐個定位) 357
5.7.2 聯合排序(動態組合欄位) 364
5.7.3 動態過濾(動態條件設定) 367
5.7.4 欄位賦值(初始化輔助) 371
5.7.5 批量替換(按特徵值替換) 374
5.8 總結(封裝與服務) 379
第6章 數據對象服務 381
本章集中解決了一些幾乎任何系統都會碰到的數據套用問題,這裡儘量從通用的角度給出了解決相對經典的方案。
6.1 概述 381
6.2 格式化輸出 382
6.2.1 列印樣式管理方案 382
6.2.2 套用Excel樣式 394
6.2.3 自定義圖形展示 399
6.3 導入與導出 403
6.3.1 導出(窗體數據到Excel等檔案) 403
6.3.2 導入(從Excel等檔案導入數據) 412
6.3.3 方案化導入導出(電子票據輔助處理) 419
6.3.4 模式化的數據導出(財務接口輔助) 420
6.3.5 SQL直接導出(從查詢導出Excel檔案) 422
6.4 相關性的遍歷 426
6.4.1 窮盡“誰與我相關”(對主鍵引用的遍歷) 427
6.4.2 窮盡“我與誰相關”(對引用外鍵的遍歷) 431
6.5 主鍵值替換(遍歷式變更) 436
6.5.1 命題提出 437
6.5.2 解決思路 437
6.5.3 窗體與實現 438
6.5.4 套用樣例 442
6.6 主從鍵值設定(內鍵關係設定) 446
6.6.1 命題提出 446
6.6.2 設計與實現 446
6.6.3 套用樣例 449
6.7 數據審計(日誌自動化) 452
6.7.1 問題提出 452
6.7.2 解決思路 453
6.7.3 審計歷程 454
6.7.4 審計查詢 459
6.8 數據體系初始化 461
6.8.1 命題提出 461
6.8.2 窗體與實現 461
6.8.3 套用樣例 463
6.9 關於數據結構的文檔 464
6.9.1 基於代碼方式的實現 466
6.9.2 基於參數方式的實現 468
6.10 數據備份與恢復 470
6.10.1 實現方案 470
6.10.2 代碼實現 471
6.10.3 套用樣例 473
6.11 TSB_提交(按鈕) 473
6.11.1 命題提出 473
6.11.2 設計構思 474
6.11.3 代碼實現 474
6.11.4 套用樣例 476
6.12 業務計算器 476
6.13 總結(功能抽象與實現) 478
第7章 設計模式與容器控制項 480
本章將從具體實現向模式化實現過渡、從簡單的控制項封裝向組件化封裝過渡,從功能化實現向自動化實現過渡。本章的控制項設計對複雜的套用系統將會起到至關重的作用。
7.1 設計模式 480
7.1.1 理解設計模式 480
7.1.2 運用設計模式 481
7.1.3 數據套用模式 481
7.1.4 實現的套用模式 482
7.2 數據衍生 483
7.2.1 自定義“BTN_沖紅”子類(對沖衍生) 483
7.2.2 套用樣例 486
7.2.3 自定義“BTN_拆解”子類(拆解衍生) 489
7.3 自定義“Panel”到“PNL_”類(數據綁定) 496
7.3.1 問題提出 496
7.3.2 解決思路 496
7.3.3 代碼實現 497
7.3.4 套用樣例 502
7.4 填充模式(標註項填寫) 502
7.4.1 自定義“PNL_填充”子類 503
7.4.2 解決思路 503
7.4.3 代碼實現 503
7.4.4 自定義“BTN_填充”子類 504
7.4.5 套用樣例 506
7.5 查詢模式(動態條件) 508
7.5.1 自定義“PNL_查詢”子類(動態條件) 508
7.5.2 自定義“BTN_查詢”子類(查詢按鈕) 511
7.5.3 準動態條件(條件輔助) 513
7.5.4 套用樣例 516
7.6 分組模式 522
7.6.1 自定義“TreeView”到“TV_”類(隨機欄位) 523
7.6.2 命題提出 523
7.6.3 設計構思 523
7.6.4 參數表 524
7.6.5 代碼實現 528
7.6.6 服務:“分組屬性設定” 533
7.6.7 套用樣例 534
7.6.8 小結 540
7.7 自定義“TreeView”到“TV_編碼”類(結構化欄位) 541
7.8 總結(功能中的自動化) 546
第8章 Form封裝與套用模式 548
本章介紹了窗體的封裝及窗體模板;同時介紹了兩個重要套用:線上式的“幫助文檔”撰寫、編譯及具有通用性的工作流程控制器,它們對項目的作用十分明細。
8.1 概述 548
8.1.1 Form封裝 548
8.1.2 套用模式 549
8.1.3 自定義“FORM”到“FRM_”類 549
8.2 如何實現“套用功能” 561
8.2.1 數據採集 561
8.2.2 卡片模式 561
8.2.3 查詢模式 565
8.2.4 查詢模式與數據處理模式的結合 570
8.2.5 複雜套用模式 571
8.3 生成器模式與生成器 572
8.3.1 數據卡片“生成器” 572
8.3.2 自定義“FRM_卡片”子類 574
8.3.3 實現“欄位↔控制項類”映射 577
8.3.4 “生成器”實現 580
8.3.5 “生成器”運用 590
8.3.6 編輯“生成器”結果 595
8.3.7 對生成結果的引用 599
8.3.8 “套用類”生成器 600
8.3.9 小結(生成代碼的代碼) 600
8.4 “線上幫助”生成器 601
8.4.1 幫助文檔製作(常規方式) 601
8.4.2 幫助文檔調用(常規方式) 603
8.4.3 命題提出 604
8.4.4 設計思路 604
8.4.5 關於HTML檔案的粒度 606
8.4.6 自定義“CLS_HTML轉換CHM”類 606
8.4.7 生成器窗體 615
8.4.8 參數檔案生成 618
8.4.9 實現“線上幫助” 620
8.4.10 “線上幫助”部署 620
8.4.11 線上幫助樣例(更新該樣例) 621
8.4.12 支持“線上撰寫” 621
8.4.13 線上撰寫樣例 622
8.4.14 支持“線上編譯” 623
8.4.15 “線上編譯”實現 624
8.4.16 小結 627
8.5 流程控制器 627
8.5.1 總體構思 628
8.5.2 問題提出 628
8.5.3 流程定義數據 630
8.5.4 流程目標數據 633
8.5.5 流程歷程數據 633
8.5.6 節點上的策略 634
8.5.7 自定義“PNL_審批”類 636
8.5.8 流程管理的實現 641
8.5.9 流程構造樣例 643
8.5.10 流程套用樣例 646
8.5.11 小結 651
8.6 總結(設計時序與流程) 651
第9章 運行環境構建與部署 653
本章為套用系統的客戶端構建了一個功能性較強的實現方案,這是有效實現項目復用所要依賴的基礎。最後介紹了系統部署及部署中的一些常見問題。
9.1 概述 653
9.1.1 總體流程 654
9.1.2 原始形態 654
9.1.3 初步構想 655
9.2 實現步驟 656
9.2.1 關於App.config檔案 656
9.2.2 自定義Main到“FRM_主視窗類” 657
9.2.3 全局變數(靜態預置) 664
9.3 外部參數 665
9.3.1 命題提出 665
9.3.2 參數表與參數引用 666
9.3.3 幾個類似的參數表 667
9.3.4 維護窗體 667
9.3.5 套用樣例 667
9.4 身份認證 668
9.4.1 通行字驗證規則 668
9.4.2 用戶註冊 671
9.4.3 許可權委託 679
9.5 許可權策略 685
9.5.1 授權策略綜述 685
9.5.2 授權機制示意圖 687
9.5.3 “功能”授權 688
9.5.4 “欄位”授權 688
9.5.5 “控制項”授權 691
9.5.6 “鍵欄位”授權 694
9.5.7 小結 695
9.6 選單管理 696
9.6.1 命題與構思 696
9.6.2 功能授權 704
9.6.3 選單維護窗體 704
9.6.4 圖形化選單 707
9.6.5 小結 717
9.7 功能管理 717
9.7.1 問題提出 717
9.7.2 解決思路 718
9.7.3 運行效果 723
9.8 自定義ToolStripDropDownButton到“TSD_”類 724
9.8.1 命題提出 724
9.8.2 構思與實現 724
9.8.3 套用效果 727
9.9 輔助控制項 728
9.9.1 主窗體輔助 728
9.9.2 一般窗體輔助 729
9.10 動態屬性 734
9.10.1 自定義“PropertyGrid”到“FPG_”類 734
9.10.2 命題提出 734
9.10.3 設計構思 734
9.10.4 代碼實現 735
9.10.5 窗體與代碼 739
9.10.6 套用樣例 740
9.11 風格管理 741
9.11.1 命題提出 741
9.11.2 設計構思 742
9.12 總結(作用與評價) 747
9.13 套用系統部署 748
9.13.1 實現部署的工具 748
9.13.2 部署策略的制定 749
9.13.3 發布ClickOnce應用程式 749
9.13.4 部署發布的樣例 750
9.13.5 部署發布過程中的常見問題 751
9.13.6 版本更新過程中的常見問題 753
第10章 工作平台構建 755
本章重申上述設計形成開發平台的作用與意義。
10.1 概述 755
10.2 平台構建 756
10.2.1 確定目標 756
10.2.2 轉變觀念 756
10.2.3 制定規範 757
10.2.4 分步實現 757
10.2.5 示意圖 761
10.3 效果與評價 762
10.3.1 改進需求分析 762
10.3.2 強化數據體系 762
10.3.3 代碼與復用 762
10.3.4 可靠性 763
10.3.5 適應性 763
10.3.6 改進項目管理 763
10.3.7 合理支付成本 764
10.3.8 規範實施過程 765
10.3.9 提高綜合效益 765
10.4 形成技術積累 765
10.5 持續與擴充 766
10.6 總結 767
附錄A 方法代碼彙編 768
本書各個設計方案中所引用的公共方法,這是實現控制項設計的基礎。
A.1 概述 768
A.2 方法庫“CLS_公用方法” 769
A.2.1 方法庫的形成 769
A.2.2 方法庫框構 769
A.2.3 方法庫代碼 770
A.3 方法庫“CLS_數據訪問” 848
A.3.1 數據訪問庫的形成 848
A.3.2 數據訪問庫的框構 848
A.3.3 數據訪問庫的代碼 849
A.4 公用變數 862
A.5 公用接口 865
A.6 總結(函式與方法) 866
編後語 867