首先要明確出于什么目的來寫框架最岗,這個框架適用于什么場景帕胆,用來做什么的,框架的用戶對象是誰般渡,他們會怎么使用懒豹,框架由誰維護(hù)芙盘,以后怎么發(fā)展等....
1.對于設(shè)計一個框架要先有一個初步的定位,比如它是一個緩存框架脸秽、Web MVC框架儒老、IOC框架、ORM/數(shù)據(jù)訪問框架豹储、RPC框架或是一個用于Web開發(fā)的全棧式框架贷盲。
2.是否要重復(fù)造輪子淘这?除非是練手項目剥扣,一般我們是有了解決不了問題的時候才會考慮不使用既有的成熟的框架而重復(fù)造輪子的,這個時候需要列出新框架主要希望解決什么問題铝穷。有關(guān)是否應(yīng)該重復(fù)造輪子的話題討論了很多钠怯,我的建議是在把問題列清后進(jìn)行簡單的研究看看是否可以通過擴(kuò)展現(xiàn)有的框架來解決這個問題。一般而言大部分成熟的框架都有一定的擴(kuò)展和內(nèi)部組件的替換能力曙聂,可以解決大部分技術(shù)問題晦炊,但在如下情況下我們可能不得不自己去寫一個框架,比如即使通過擴(kuò)展也無法滿足技術(shù)需求宁脊、安全原因断国、需要更高的生產(chǎn)力、需要讓框架和公司內(nèi)部的流程更好地進(jìn)行適配榆苞、開源的普適框架無法滿足性能需求稳衬、二次開發(fā)的成本高于重新開發(fā)的成本等等。
2.主打輕量級坐漏?輕量級是很多人打算自己寫一個新框架的原因薄疚,但我們要明白,大部分項目在一開始的時候其實都是輕量級的赊琳,隨著框架的用戶越來越多街夭,它必定需要滿足各種奇怪的需求,在經(jīng)過了無數(shù)次迭代之后躏筏,框架的主線流程就會多很多擴(kuò)展點板丽、檢測點,這樣框架勢必變得越來越重(從框架的
3.入口到框架的工作結(jié)束的方法調(diào)用層次越來越多趁尼,勢必框架也就越來越慢)埃碱,如果你打算把框架定位于一個輕量級的框架的話,那么在今后的迭代過程中需要進(jìn)行一些權(quán)衡弱卡,在心中有堅定的輕量級的理念的同時不斷做性能測試來確蹦苏框架的輕量,否則隨著時間的發(fā)展框架可能會越來越重進(jìn)而偏離了開始的定位婶博。
4.特性瓮具?如果你打算寫一個框架,并且只有輕量級這一個理由的話,你或許應(yīng)該再為自己的框架想一些新特性名党,就像做一個產(chǎn)品一樣叹阔,如果找不出兩個以上的亮點,那么這個產(chǎn)品不太可能成功传睹,比如你的新框架可以是一個零配置的框架耳幢,可以是一個前端開發(fā)也能用的后端框架。
5.其它欧啤?一般來說框架是給程序員使用的睛藻,我們要考慮框架使用的頻度是怎么樣的,這可能決定的框架的性能需求和穩(wěn)定性需求邢隧。還有店印,需要考慮框架將來怎么發(fā)展,是希望走開源路線還是商業(yè)路線倒慧。當(dāng)然按摘,這些問題也可以留到框架有一個大致的結(jié)構(gòu)后再去考慮。
6.通過分析現(xiàn)有框架的功能纫谅,可以制定出一個新框架要實現(xiàn)的功能列表炫贤。
7.通過分析現(xiàn)有框架的問題,總結(jié)出新框架需要避免的東西和改善的地方付秕。
8.通過閱讀現(xiàn)有框架的源碼兰珍,幫助自己理清框架的主線流程為總體設(shè)計做鋪墊(后面總體設(shè)計部分會更多談到)。
9.如果能充分理解現(xiàn)有的框架盹牧,那么你就是站在巨人的肩膀上寫框架俩垃,否則很可能就是在井底造輪子。
注意:
(1):新開發(fā)一個框架的好處是沒有兼容歷史版本的包袱汰寓,但是責(zé)任也同樣重大口柳,因為如果對于一開始的定位或設(shè)計工作沒有做好的話,將來如果要對格局進(jìn)行改變就會有巨大的向前兼容的包袱(除非你的框架沒有在任何正式項目中使用)有滑,兼容意味著框架可能會越來越重跃闹,可能會越來越難看,閱讀至少一到兩個開源實現(xiàn)毛好,做好充分的調(diào)研工作可以使你避免犯大錯望艺。
(2):假設(shè)我們評估了一些主流框架后已經(jīng)很明確,我們的MVC框架是一個Java平臺的肌访、基于Servlet的輕量級的Web MVC框架找默,主要的理念是約定優(yōu)于配置,高內(nèi)聚大于低耦合吼驶,提供主流Web MVC框架的大部分功能惩激,并且易用方面有所創(chuàng)新店煞,新特性體包括:
10:起手零配置,總體上約定由于配置风钻,即使需要擴(kuò)展配置也支持通過代碼和配置文件兩種方式進(jìn)行配置顷蟀。
11:除了Servlet之外不依賴其它類庫,支持通過插件方式和諸如Spring等框架進(jìn)行整合骡技。
12:更優(yōu)化的項目結(jié)構(gòu)鸣个,不需要按照傳統(tǒng)的Java Web項目結(jié)構(gòu)那樣來分離代碼和WEB-INF,視圖可以和代碼在一起布朦,閱讀代碼更便利囤萤。
13:攔截器和框架本身更緊密,提供Action喝滞、Controller和Global三個級別的"攔截器"(或者說過濾器)阁将。
14:豐富的Action的返回值膏秫,返回的可以是視圖右遭、可以是重定向、可以是文件缤削、可以是字符串窘哈、可以是Json數(shù)據(jù),可以是Javascript代碼等等亭敢。
15:支持針對測試環(huán)境自動生成測試的視圖模型數(shù)據(jù)滚婉,以便前端和后端可以同時開發(fā)項目。
16:支持在開發(fā)的時候自動生成路由信息帅刀、模型綁定让腹、異常處理等配置的信息頁面和調(diào)試頁面,方便開發(fā)和調(diào)試扣溺。