轉(zhuǎn)自:http://www.reibang.com/p/aa3208a1cdd0
首先要明確出于什么目的來寫框架拆祈,這個(gè)框架適用于什么場(chǎng)景,用來做什么的涕刚,框架的用戶對(duì)象是誰交排,他們會(huì)怎么使用,框架由誰維護(hù)扑媚,以后怎么發(fā)展等....
1.對(duì)于設(shè)計(jì)一個(gè)框架要先有一個(gè)初步的定位腰湾,比如它是一個(gè)緩存框架、Web MVC框架疆股、IOC框架费坊、ORM/數(shù)據(jù)訪問框架、RPC框架或是一個(gè)用于Web開發(fā)的全棧式框架旬痹。
2.是否要重復(fù)造輪子附井?除非是練手項(xiàng)目,一般我們是有了解決不了問題的時(shí)候才會(huì)考慮不使用既有的成熟的框架而重復(fù)造輪子的两残,這個(gè)時(shí)候需要列出新框架主要希望解決什么問題永毅。有關(guān)是否應(yīng)該重復(fù)造輪子的話題討論了很多,我的建議是在把問題列清后進(jìn)行簡單的研究看看是否可以通過擴(kuò)展現(xiàn)有的框架來解決這個(gè)問題人弓。一般而言大部分成熟的框架都有一定的擴(kuò)展和內(nèi)部組件的替換能力沼死,可以解決大部分技術(shù)問題,但在如下情況下我們可能不得不自己去寫一個(gè)框架崔赌,比如即使通過擴(kuò)展也無法滿足技術(shù)需求意蛀、安全原因耸别、需要更高的生產(chǎn)力、需要讓框架和公司內(nèi)部的流程更好地進(jìn)行適配浸间、開源的普適框架無法滿足性能需求太雨、二次開發(fā)的成本高于重新開發(fā)的成本等等。
2.主打輕量級(jí)魁蒜?輕量級(jí)是很多人打算自己寫一個(gè)新框架的原因,但我們要明白吩翻,大部分項(xiàng)目在一開始的時(shí)候其實(shí)都是輕量級(jí)的兜看,隨著框架的用戶越來越多,它必定需要滿足各種奇怪的需求狭瞎,在經(jīng)過了無數(shù)次迭代之后细移,框架的主線流程就會(huì)多很多擴(kuò)展點(diǎn)、檢測(cè)點(diǎn)熊锭,這樣框架勢(shì)必變得越來越重(從框架的
3.入口到框架的工作結(jié)束的方法調(diào)用層次越來越多弧轧,勢(shì)必框架也就越來越慢),如果你打算把框架定位于一個(gè)輕量級(jí)的框架的話碗殷,那么在今后的迭代過程中需要進(jìn)行一些權(quán)衡精绎,在心中有堅(jiān)定的輕量級(jí)的理念的同時(shí)不斷做性能測(cè)試來確保框架的輕量锌妻,否則隨著時(shí)間的發(fā)展框架可能會(huì)越來越重進(jìn)而偏離了開始的定位代乃。
4.特性?如果你打算寫一個(gè)框架仿粹,并且只有輕量級(jí)這一個(gè)理由的話搁吓,你或許應(yīng)該再為自己的框架想一些新特性,就像做一個(gè)產(chǎn)品一樣吭历,如果找不出兩個(gè)以上的亮點(diǎn)堕仔,那么這個(gè)產(chǎn)品不太可能成功,比如你的新框架可以是一個(gè)零配置的框架晌区,可以是一個(gè)前端開發(fā)也能用的后端框架摩骨。
5.其它?一般來說框架是給程序員使用的契讲,我們要考慮框架使用的頻度是怎么樣的仿吞,這可能決定的框架的性能需求和穩(wěn)定性需求。還有捡偏,需要考慮框架將來怎么發(fā)展唤冈,是希望走開源路線還是商業(yè)路線。當(dāng)然银伟,這些問題也可以留到框架有一個(gè)大致的結(jié)構(gòu)后再去考慮你虹。
6.通過分析現(xiàn)有框架的功能绘搞,可以制定出一個(gè)新框架要實(shí)現(xiàn)的功能列表。
7.通過分析現(xiàn)有框架的問題傅物,總結(jié)出新框架需要避免的東西和改善的地方夯辖。
8.通過閱讀現(xiàn)有框架的源碼,幫助自己理清框架的主線流程為總體設(shè)計(jì)做鋪墊(后面總體設(shè)計(jì)部分會(huì)更多談到)董饰。
9.如果能充分理解現(xiàn)有的框架蒿褂,那么你就是站在巨人的肩膀上寫框架,否則很可能就是在井底造輪子卒暂。
注意:
(1):新開發(fā)一個(gè)框架的好處是沒有兼容歷史版本的包袱啄栓,但是責(zé)任也同樣重大,因?yàn)槿绻麑?duì)于一開始的定位或設(shè)計(jì)工作沒有做好的話也祠,將來如果要對(duì)格局進(jìn)行改變就會(huì)有巨大的向前兼容的包袱(除非你的框架沒有在任何正式項(xiàng)目中使用)昙楚,兼容意味著框架可能會(huì)越來越重,可能會(huì)越來越難看诈嘿,閱讀至少一到兩個(gè)開源實(shí)現(xiàn)堪旧,做好充分的調(diào)研工作可以使你避免犯大錯(cuò)。
(2):假設(shè)我們?cè)u(píng)估了一些主流框架后已經(jīng)很明確奖亚,我們的MVC框架是一個(gè)Java平臺(tái)的淳梦、基于Servlet的輕量級(jí)的Web MVC框架,主要的理念是約定優(yōu)于配置遂蛀,高內(nèi)聚大于低耦合谭跨,提供主流Web MVC框架的大部分功能,并且易用方面有所創(chuàng)新李滴,新特性體包括:
10:起手零配置螃宙,總體上約定由于配置,即使需要擴(kuò)展配置也支持通過代碼和配置文件兩種方式進(jìn)行配置所坯。
11:除了Servlet之外不依賴其它類庫谆扎,支持通過插件方式和諸如Spring等框架進(jìn)行整合。
12:更優(yōu)化的項(xiàng)目結(jié)構(gòu)芹助,不需要按照傳統(tǒng)的Java Web項(xiàng)目結(jié)構(gòu)那樣來分離代碼和WEB-INF堂湖,視圖可以和代碼在一起,閱讀代碼更便利状土。
13:攔截器和框架本身更緊密无蜂,提供Action、Controller和Global三個(gè)級(jí)別的"攔截器"(或者說過濾器)蒙谓。
14:豐富的Action的返回值斥季,返回的可以是視圖、可以是重定向、可以是文件酣倾、可以是字符串舵揭、可以是Json數(shù)據(jù),可以是Javascript代碼等等躁锡。
15:支持針對(duì)測(cè)試環(huán)境自動(dòng)生成測(cè)試的視圖模型數(shù)據(jù)午绳,以便前端和后端可以同時(shí)開發(fā)項(xiàng)目。
16:支持在開發(fā)的時(shí)候自動(dòng)生成路由信息映之、模型綁定拦焚、異常處理等配置的信息頁面和調(diào)試頁面笼才,方便開發(fā)和調(diào)試葱椭。