從零開始編寫自己的C#框架(27)——什么是開發框架

前言

  做為一個程序員,在開發的過程中會發現,有框架同無框架,做起事來是完全不同的概念,關系到開發的效率、程序的健壯、性能、團隊協作、后續功能維護、擴展......等方方面面的事情。很多朋友在學習搭建自己的框架,很多公司也在創建或使用自己的框架,網上開源的框架多如牛毛,每年新上線的各種框架也不知多少。而不停的重復造輪子,也讓更多的朋友鳥槍換炮,越跑越快,工作效率越來越高。那么什么是框架呢?

?

  什么是框架

  度娘上說:框架(Framework)是整個或部分系統的可重用設計,表現為一組抽象構件及構件實例間交互的方法; 另一種定義認為,框架是可被應用開發者定制的應用骨架。前者是從應用方面而后者是從目的方面給出的定義。

  可以說,一個框架是一個可復用的設計構件,它規定了應用的體系結構,闡明了整個設計、協作構件之間的依賴關系、責任分配和控制流程,表現為一組抽象類以及其實例之間協作的方法,它為構件復用提供了上下文(Context)關系。因此構件庫的大規模重用也需要框架。

  應用框架指的是實現了某應用領域通用完備功能(除去特殊應用的部分)的底層服務。使用這種框架的編程人員可以在一個通用功能已經實現的基礎上開始具體的系統開發。框架提供了所有應用期望的默認行為的類集合。具體的應用通過重寫子類(該子類屬于框架的默認行為)或組裝對象來支持應用專用的行為。

  應用框架強調的是軟件的設計重用性和系統的可擴充性,以縮短大型應用軟件系統的開發周期,提高開發質量。與傳統的基于類庫的面向對象重用技術比較,應用框架更注重于面向專業領域的軟件重用。應用框架具有領域相關性,構件根據框架進行復合而生成可運行的系統。框架的粒度越大,其中包含的領域知識就更加完整。

  框架,即framework。其實就是某種應用的半成品,就是一組組件,供你選用完成你自己的系統。簡單說就是使用別人搭好的舞臺,你來做表演。而且,框架一般是成熟的,不斷升級的軟件。

  上面是度娘百科——框架里講的內容,講得挺理論挺全面的,直接復制了一些過來。

?

  簡單來講,軟件開發框架可以理解為我們起樓房時,用梁+柱子+承重墻做起來的鋼筋混凝土結構框架。而實現的軟件功能,也就像在這個框架結構中所要實現的不同類型、功能的房子,比如停車場、商場、酒店、飯店、商住房......

  功能強大,結構扎實的框架,可承載的類型就更多,適用性就更強。

  不論是什么開發框架,都是為現實不同的業務功能而創建的。好的開發框架能提高企業的競爭能力,包括降低開發成本、提高產品質量、改善客戶滿意程度、控制開發進度等。同時,開發框架也是某一領域為實現某種業務的知識積累,它是一種持續性的活動,隨著特定業務功能實現而創建,且跳出軟件開發周期而存活。一個成熟的框架,不單單只是代碼而已,它除了將某一領域業務的基礎功能以代碼的方式實現外,還必須編寫對應的文檔、模型、流程圖、數據字典、開發使用說明.....等一系列的文檔來支撐,這樣的框架才更加成熟和健壯。

?

  為什么要使用框架

  軟件系統隨著業務的發展,變得越來越復雜,不同領域的業務所涉及到的知識、內容、問題非常非常多。如果每次都從頭開發,那都是一個很漫長的事情,且并不一定能將它做好。團隊協作開發時,沒有了統一標準,大家各寫各的,同樣的重復的功能到處都是。由于沒有統一調用規范,很難看懂別人寫的代碼,出現Bug或二次開發維護時,根本無從下手。(無框架不堪回首的黑暗日子請看前面章節的講述)

  而一個成熟的框架,它是模板化的代碼,它會幫我們實現很多基礎性的功能,我們只需要專心的實現所需要的業務邏輯就可以了。而很多底層功能操作,就可以完完全全不用做太多的考慮,框架已幫我們實現了。這樣的話,整個團隊的開發效率可想而知。另外對于團隊成員的變動,也不用太過擔心,框架的代碼規范讓我們能輕松的看懂其他開發人員所寫的代碼。

?

  搭建框架時,我們要如何定位

  是不是框架的擴展性、可移值性、功能越強大就越好呢?

  好的框架是相對的,它都有自己特定的應用領域,合適才是最好。

  個人覺得在實際開發中要根據具體情況來看的,因為功能越全面它的復雜度就越大,所需要的開發人員能力和技能就會要求更高,付出的成本也就最大。比如做一個還未發展起來的電商網就想 將系統做成像京東那樣,直接用京東分模塊分布式的框架來開發,那得怎么來組建這個團隊?更不用說開發成本了。就算團隊有能力做到,也沒有那個必要這么去做,因為從成本預算和開發周期等方面來看,得不嘗失,更多的可能項目還未完成公司就給拖垮了。

   一般來說,一個中小型項目,1到5人左右的開發團隊,使用一般的三層結構就可以了,不用去細想框架要分三層還是五層,每個層之間要怎么實現解耦,要用什么設計模式.....因為當今飛速發展的互聯網時代,快才是王道,做一個中小型項目能用一周完成的,絕不能拖了一個月還未做完。人工與時間成本才是重點中 的重點,唯有快才能更好的生存下來并壯大。至于擴展功能、接口、分布式、并發、大數據......等等問題,實際上過早考慮太多并不是好事情,有經驗的程序員在寫這個框架時早已留下擴展方案或思路,而沒到這一層次的開發人員你想再多也可能想不明白,還不如先做出來積累一定經驗后再慢慢學習,慢慢升級框架。

  當然也不是說設計框架時不用考慮高內聚低耦合,而是要根據自己的能力與經驗來設計出自己能把控的框架出來。因為框架不是開發出來后就不再變動,它也需要不停的進行升級,將你所學到的新知識新技術融合到框架中,使它的功能更加強大,更加健壯。而對于自己不能把控的框架,在團隊協作開發和上生產環境后,你就發現有一大堆的坑等著你去填埋,這種框架只能拿來先練練手,有空再慢慢完善。

  框架通過小步快跑,不斷的迭代升級來慢慢擴展的,當項目上生產環境后,根據新的需求和所碰到的問題,去不停的調整,最終越來越強大。所有框架都是從1.0版本到2.0、3.0......發展而來,而不是直接跳過最初版本到最終成熟版本。

   所以說我們在創建一個框架時,必須根據我們當前個人的技術能力、團隊成功技術水平、時間、投入成本、項目現狀(規模與需求復雜程度)、以后的發展前景來決定所要開發的框架的最終設計方案。當然也不是說不能一步到位,心有多大世界就有多大,只要個人能力和團隊能力配得上,老板資金成本雄厚,時間充足,直接上大項目使用超級框架也完全沒有問題。

?

  框架和設計模式   度娘上說:框架、設計模式這兩個概念總容易被混淆,其實它們之間還是有區別的。構件通常是代碼重用,而設計模式是設計重用,框架則介于兩者之間,部分代碼重用,部分設計重用,有時分析也可重用。在軟件生產中有三種級別的重用:內部重用,即在同一應用中能公共使用的抽象塊;代碼重用,即將通用模塊組合成庫或工具集,以便 在多個應用和領域都能使用;應用框架的重用,即為專用領域提供通用的或現成的基礎結構,以獲得最高級別的重用性。   框架與設計模式雖然相似,但卻有著根本的不同。設計模式是對在某種環境中反復出現的問題以及解決該問題的方案的描述,它比框架更抽象;框架可以用代碼表示,也能直接執行或復用,而對模式而言只有實例才能用代碼表示;設計模式是比框架更小的元素,一個框架中往往含有一個或多個設計模式,框架總是針對某一特定應 用領域,但同一模式卻可適用于各種應用。可以說,框架是軟件,而設計模式是軟件的知識。

?

  框架的主要特點和要求

  1、代碼模板化

  框架一般都有統一的代碼風格,同一分層的不同類代碼,都是大同小異的模板化結構,方便使用模板工具統一生成,減少大量重復代碼的編寫。在學習時通常只要理解某一層有代表性的一個類,就等于了解了同一層的其他大部分類結構和功能,容易上手。團隊中不同的人員采用類同的調用風格進行編碼,很大程度提高了代碼的可讀性,方便維護與管理。

?

  2、重用

  開發框架一般層次清晰,不同開發人員開發時都會根據具體功能放到相同的位置,加上配合相應的開發文檔,代碼重用會非常高,想要調用什么功能直接進對應的位置去查找相關函數,而不是每個開發人員各自編寫一套相同的方法。

  3、高內聚(封裝)

  框架中的功能會實現高內聚,開發人員將各種需要的功能封裝在不同的層中,給大家調用,而大家在調用時不需要清楚這些方法里面是如果實現的,只需要關注輸出的結果是否是自己想要的就可以了。

  4、規范

  框架開發時,必須根據嚴格執行代碼開發規范要求,做好命名、注釋、架構分層、編碼、文檔編寫等規范要求。因為你開發出來的框架并不一定只有你自己在用,要讓別人更加容易理解與掌握,這些內容是非常重要的。

  5、可擴展

  開發框架時必須要考慮可擴展性,當業務邏輯更加復雜、數量記錄量爆增、并發量增大時,能否通過一些小的調整就能適應?還是需要將整個框架推倒重新開發?當然對于中小型項目框架,也不必考慮太多這些內容,當個人能力和經驗足夠時水到渠成,自然就會注意到很多開發細節。

  7、可維護

  成熟的框架,對于二次開發或現有功能的維護來說,操作上應該都是非常方便的。比如項目要添加、修改或刪除一個字段或相關功能,只需要簡單的操作,十來分鐘或不用花太多的工夫就可以搞定。新增一個數據表和對應的功能,也可以快速的完成。功能的變動修改,不會對系統產生不利的影響。代碼不存在硬編碼等等,保證軟件開發的生產效率和質量。

  8、協作開發

  有了開發框架,我們才能組織大大小小的團隊更好的進行協作開發,成熟的框架將大大減輕項目開發的難度,加快開發速度,降低開發費用,減輕維護難度。

  9、通用性

  同一行業或領域的框架,功能都是大同小異的,不用做太大的改動就可以應用到類似的項目中。在框架中,我們一般都會實現一些同質化的基礎功能,比如權限管理、角色管理、菜單管理、日志管理、異常處理......或該行業中所要使用到的通用功能,使框架能應用到某一行業或領域中,而不是只針對某公司某業務而設定(當然也肯定存在那些特定功能的應用框架,這只是非常少的特殊情況,不在我們的考慮范圍)。

?

  至于框架怎么一步步設計與開發,請看后續章節

?

?

  以上就是我對開發框架的一些理解,如果您覺得有不對的地方,歡迎拍墻

?

?

?

版權聲明:
  本文由AllEmpty原創并發布于博客園,歡迎轉載,未經本人同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,否則保留追究法律責任的權利。如有問題,可以通過1654937@qq.com 聯系我,非常感謝。

?

  發表本編內容,是為了和大家共同學習共同進步,有興趣的朋友可以加加Q群:327360708 ,大家一起探討。

  在佛山工作的朋友也可以加入:佛山IT朋友群 263767221,大家可以共享資源共同進步,有空大家可以約出來認識一下,交流一下技術,哈哈

?

  更多內容,敬請觀注博客:http://www.cnblogs.com/EmptyFS/

?

只有將自己置空,才能裝進更多的東西

轉載于:https://www.cnblogs.com/FinleyJiang/p/7600913.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540563.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540563.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540563.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[轉載] Python 遞歸 深入理解遞歸 Python遞歸剖析,絕對讓你看懂!

參考鏈接: Python | print()中的結束參數 目錄 遞歸剖析 遞歸的兩個過程 return 返回值 詳解 遞歸思路二分法和遞歸尾遞歸遞歸練習題 遞歸剖析 遞歸真的很重要,之前學的時候,學的一知半解,以為真正了解,每次想到遞歸…

laravel 項目遷移_在Laravel遷移

laravel 項目遷移Before moving forward we need to know some facts about it, 在繼續前進之前,我們需要了解一些事實, Resources: In these directories, we have already a js, lang, sass and view page. Where, sass and js file holf their uncom…

Python之list對應元素求和

本次分享將講述如何在Python中對多個list的對應元素求和,前提是每個list的長度一樣。比如:a[1,2,3], b[2,3,4], c[3,4,5], 對a,b,c的對應元素求和,輸出應為[6,9,12].    方法一:   直接求解,按照對應元素相加的…

[轉載] Python中str跟int的轉換

參考鏈接: Python中的類型轉換 字符串str轉換成int: int_value int(str_value) int轉換成字符串str: str_value str(int_value) a100 b666 #int轉str類型 print(int轉str類型) print(int轉str: str(a)) #str轉int類型 print(str轉int類型…

ot協議是什么_OT的完整形式是什么?

ot協議是什么OT:主題外 (OT: Off Topic) OT is an abbreviation of "Off Topic". OT是“ Off Topic”的縮寫 。 It is an expression, which is commonly used in Gmail or messaging platform. It shows that the email that has been sent is irrelev…

[轉載] python中字符串編碼形式及其所占字節

參考鏈接: Python中的字節對象與字符串 1.常見字符串編碼錯誤 在使用Python讀文件時經常遇到編碼問題引起的錯誤,比如: UnicodeDecodeError: gbk codec cant decode byte 0x80 in position 30: illegal multibyte sequence 遇到這種異…

[AtCoder-ARC073F]Many Moves

題目大意:   有一排n個格子和2枚硬幣。   現在有q次任務,每一次要你把其中一枚硬幣移到x的位置上,移動1格的代價是1。   兩枚硬幣不能同時移動,任務必須按次序完成。   現在告訴你兩枚硬幣初始狀態所在的位置a和b&#xf…

ScalavsKotlin

Is Scala better that Kotlin? No..., Is Kotlin better than Scala? No... Scala比Kotlin更好嗎? 不...,Kotlin勝過Scala嗎? 沒有... Both programming languages have their own profits and are for a specific set of development. It…

工業智能相機與基于PC的機器視覺的區別比較

隨著科技的日漸成熟,機器視覺得到了飛速發展。由于嵌入式技術的發展,近幾年智能相機性能顯著提高,越來越多必須依賴于PC處理的應用開始向智能相機平臺傾斜。低成本、高可靠性及易于安裝維護等優勢,使得機器視覺在制造業上的規模性應用越來越普…

[轉載] python skimage在圖像處理中的用法

參考鏈接: 在Python中打印單變量和多變量 基于python腳本語言開發的數字圖片處理包,比如PIL,Pillow, opencv, scikit-image等。 PIL和Pillow只提供最基礎的數字圖像處理,功能有限;opencv實際上是一個c庫,只是提供了py…

scala元組 數組_Scala中的數組

scala元組 數組Scala中的數組 (Arrays in Scala) An array is a linear data structure with a fixed number of elements. It is a collection that stores a fixed number Arrays in Scalf elements of the same datatype. In Scala, an array is 0 indexed, i.e. the first …

OpenStack —— DevStack一鍵自動化安裝

一、DevStack介紹Devstack目前是支持Ubuntu16.04和CentOS 7,而且Devstack官方建議使用Ubuntu16.04,所以我們使用Ubuntu 16.04進行安裝。默認無論是Devstack和OpenStack,都是采用Master的代碼進行安裝,這樣經常會出現,今…

[轉載] Python學習筆記——運維和Shell

參考鏈接: 在C / C,Python,PHP和Java中交換兩個變量 目錄 什么是運維 運維第一工具-shell編程 shell歷史 執行腳本 基本語法 Shell腳本語法 條件測試:test [ if/then/elif/else/fi case/esac for/do/done …

scala java混合_Scala特性混合

scala java混合Scala | 特性混合 (Scala | Trait Mixins ) In Scala, the number of traits can be extended using a class or an abstract class. This is known as Trait Mixins. For extending, only traits, the blend of traits, class or abstract class are valid. If …

Scala鑄造

Scala中的類型 (Types in Scala) Type also know as data type tells the compiler about the type of data that is used by the programmer. For example, if we initialize a value or variable as an integer the compiler will free up 4 bytes of memory space and it wi…

/ 卡路里_最大卡路里

/ 卡路里Problem statement: 問題陳述: Shivang is very foodie but he has a diet plan. He has an array of elements indicating the calorie of food he can consume on that day. In his diet plan, he can’t eat on for three consecutive days. But since …

[轉載] Python類中的私有變量和公有變量

參考鏈接: Python中的私有變量 我們這里就直奔主題,不做基礎鋪墊,默認你有一些Python類的基礎,大家在看這篇博客的時候,如果基礎知識忘了,可以去菜鳥教程 從一個簡單的類開始 class A(): #定義一…

OpenCV探索之路(二十五):制作簡易的圖像標注小工具

搞圖像深度學習的童鞋一定碰過圖像數據標注的東西,當我們訓練網絡時需要訓練集數據,但在網上又沒有找到自己想要的數據集,這時候就考慮自己制作自己的數據集了,這時就需要對圖像進行標注。圖像標注是件很枯燥又很費人力物力的一件…

固件的完整形式是什么?

FW:前進 (FW: Forward) FW is an abbreviation of "Forward". FW是“ Forward”的縮寫 。 It is an expression, which is commonly used in Gmail or messaging platform. It is also written as FWD or Fwd or Fw. It shows that the email has been s…

[轉載] python __slots__ 詳解(上篇)

參考鏈接: Python的__name __(特殊變量) python中的new-style class要求繼承Python中的一個內建類型, 一般繼承object,也可以繼承list或者dict等其他的內建類型。 在python新式類中,可以定義一個變量__slots__,它的作…