写框架思路进程(一)

来源:互联网 发布:网络高利贷不还怎么办 编辑:程序博客网 时间:2024/05/18 00:40

定位

出于什么目的要写一个框架?框架是干什么的?有什么特性,适用于什么场景?框架的用户对象是谁,他们会怎么使用?框架由谁维护,将来怎么发展?等等。

1、框架,要有个初步的定位,如缓存框架、Web MVC框架、IOC框架、ORM/数据访问框架、RPC框架或是一个用于Web开发的全栈式框架。

2、是否要重复造轮子?除非是用来练手的项目,一般我们是有了解决不了问题的时候才会考虑不适用既有的成熟的框架而重复造轮子的,这个时候需要列出新框架主要希望解决什么问题。可以将问题清单罗列后进行简单的研究看看是否可以通过扩展现有的框架来解决这个问题。一般而言大部分成熟的框架都有一定的扩展和内部组件替换的能力,可以解决大部分技术问题。但,比如即使通过扩展也无法满足技术需求、安全原因、需要更高的生产力、需要让框架和公司内部的流程更好地进行适配、开源的普适框架无法满足性能需求、二次开发的成本高于重新开发的成本等等。

3、主打轻量级?轻量级是很多人打算自己写一个新框架的原因,但我们明白,大部分项目在一开始的时候其实都是轻量级的,随着框架的用户越来越多,它必定需要满足各种奇特的需求,在经过了无数次迭代之后,框架的主线流程就会出现很多扩展点、检测点,这样框架势必变得越来越重(从框架的入口到框架的工作结束的方法调用层次越来越多,势必框架也就越来越慢)。如果你打算吧框架定位于一个轻量级的框架的话,那么在今后的迭代过程中需要进行一些权衡,在心中有坚定的轻量级的理念的同时,不断做性能测试来确保框架的轻量,否则随着时间的发展,框架可能会越来越重进而偏离了最初的定位。

4、特性?主打轻量级是不够的,应为自己的框架再想多一些新特性,就像做一个产品一样,如果找不到两个以上的亮点,那么这个产品不太可能成功,比如你的新框架可以是一个零配置的框架,可以是一个前端开发也能用的后端框架

5、框架的使用频率是怎么样的,这可能取决于框架的性能需求和稳定性需求。框架将来怎么发展,是希望走开源路线还是商业路线


我们需要模拟一个场景:假如我们觉得现有的Spring MVC等框架开发起来效率有点低,打算重复造轮子,对于新框架的定位是一个给Java程序员使用的轻量级、零配置、易用、易扩展的Web MVC框架。


调研

评估市面上的类似(成熟)框架,通读这些框架的文档以及阅读一些源码,目的是:

1、通过分析现有框架的功能,可以制定出一个新框架要实现的功能列表

2、通过分析现有框架的问题,总结出新框架需要避免的东西和改善的地方。

3、通过阅读现有框架的源码,帮助自己理清框架的主线流程为总体设计做铺垫

4、充分理解现有的框架,站在巨人的肩膀上写框架,否则就是在井底造轮子


新开发一个框架的好处是没有兼容历史版本的包袱,但是责任也同样重大,一开始的定位或设计工作没有做好的话,将来如果对格局进行改变就会有巨大的向前兼容的包袱,兼容意味着框架可能会越来越重,可能会越来越难看,阅读至少一到两个开源实现,做好充分的调研工作可以是你避免犯大错。

假设调研结果:我们的MVC框架是一个Java平台的、基于Servlet 的轻量级的Web MVC框架,主要的理念是约定优于配置,高内聚大于低耦合,提供主流Web MVC框架的大部分功能,并且易用方面有所创新,新特性包括:

1、起手零配置,总体上约定优于配置,即使需要扩展配置也支持通过代码和配置文件两种方式进行配置。

2、除了Servlet之后,不再依赖其它类库,支持通过查检方式和诸如Spring等框架进行整合。

3、更优化的项目结构,不需要按照传统的Java Web项目结构那样来分离代码和WEB-INF,视图可以和代码一起,阅读更便利。

4、拦截器和框架本身更紧密,提供Action、Controller和Grobal三个级别的“拦截器”(或者说过滤器)。

5、丰富的Action的返回值,返回的可以是视图、可以是重定向、可以是文件、可以是字符串、可以是Json数据,可以是Javascript代码等等。

6、支持针对测试环境自动生成测试的视图模型数据,以便前端和后端可以同时开发项目。

7、支持在开发的时候,自动生成路由信息、模型绑定、异常处理等配置的信息页面和调式页面,方便开发和调式。

8、提供一套通用的空间模板,并且支持多种模板引擎,比如Jsp、Velocity、Freemark等等。


解决难点

实现这个框架的某些特性、或者说实现这个框架的主流程有一些核心问题难以解决,那么就要丢框架的特性进行调整,甚至取消框架的开发计划了。

有的时候我们在用A平台发现一个很好用的框架,希望把这个框架移植到B平台,这个想法是好的,但之所以在这以前这么多年没有人这么干过,是因为这个平台的限制压根不可能实现这样的东西。比如我们要实现一个MVC框架,势必需要依赖平台提供的反射特性,如果你的语言平台压根就没有运行时反射这个功能,那么这就是一个非常难以解决的难点。又比如我们在某个平台实现一个类似于.NET平台的Linq2Sql的数据访问框架,但如果这个目标平台的开发语言并不像C#那样提供了类型推断、匿名类型、Lambda表达式、扩展方法的话,那么优于语法的限制,你写出来的框架在使用的时候是无法像.NET平台Linq2Sql那样优雅的,这就违背了实现框架的主要目的,实现新的框架也就没意义了。

需要逐一评估框架的新特性是否可以解决。建议对于每一个难点特性做一个原型项目来证明可行,以免框架实现到一半的时候发现有无法解决的问题就尴尬了。


分析调研里的8大特性,研究第1点,看看如何免配置通过代码方式让我们的Web MVC框架可以和Servlet进行整合,如果无法实现的话,可能需要将零配置改为一分钟快速配置了。
0 0
原创粉丝点击