你知道如何写一个框架吗?详细步骤放送(1)(5)
分享于 点击 7937 次 点评:252
走通主线流程
所谓走通主线流程,就是让这个框架可以以一个HelloWorld形式跑起来,这就需要把几个核心类的核心方法使用最简单的方式进行实现,还是拿我们的MVC框架来举例子:
- 从startup开始,可能需要实现ServletContextListener来动态注册我们框架的入口Servlet,暂且起名为DispatcherServlet吧,在这个类中我们需要走一下主线流程
- 调用Routes.findRoute()获得IRoute
- 调用IRoute.getRouteResult()来获得RouteResult
- 使用拿到的RouteResult作为参数调用DefaultControllerFactory.createController()获得IController其实也是AbstractController)
- 调用IController.execute()
- 在 config中创建一个IConfig作为一种配置方式,我们实现一个DefaultConfig,把各种默认实现注册到框架中去,也就是 DefaultRoute、DefaultControllerFactory、DefaultActionInvoker,然后把各种 IViewEngine加入ViewEngines
- 然后需要完成相关默认类的实现:
- 实现Routes.findRoute()
- 实现DefaultRoute.getRouteResult()
- 实现DefaultControllerFactory.createController()
- 实现AbstractController.execute()
- 实现DefaultActionInvoker.invokeAction()
- 实现ViewResult.execute()
- 实现ViewEngines.findViewEngine()
- 实现VelocityViewEngine.getViewEngineResult()
- 实现VelocityView.render()
在这一步,我们并不一定要去触碰filter和model这部分的内容,我们的主线流程只是解析路由,获得控制器,执行方法,找到视图然后渲染视图。过滤器和视图模型的绑定属于增强型的功能,属于支线流程,不属于主线流程。
虽 然在这里我们说了一些MVC的实现,但本文的目的不在于教你实现一个MVC框架,所以不用深究每一个类的实现细节,这里想说的是,在前面的龙骨搭建完后, 你会发现按照这个龙骨为它加一点肉上去实现主要的流程是顺理成章的事情,毫无痛苦。在整个实现的过程中,你可以不断完善common下的一些 context,把方法的调用参数封装到上下文对象中去,不但看起来清楚且符合开闭原则。到这里,我们应该可以跑起来在设计阶段做的那个示例网站的 HelloWorld功能了。
在这里还想说一点,有些人在实现框架的时候并没有搭建龙骨的一步骤,直接以非OOP的方式实现了主线流程,这种方式有以下几个缺点:
不容易做到SRP单一指责原则,你很容易把各种逻辑都集中写在一起,比如大量的逻辑直接写到了DispatcherServlet中,辅助一些Service或Helper,整个框架就肥瘦不匀,有些类特别庞大有些类特别小。
不容易做到OCP开闭原则,扩展起来不方便需要修改老的代码,我们期望的扩展是实现新的类然后让框架感知,而不是直接修改框架的某些代码来增强功能。
很难实现DIP依赖倒置原则,即使你依赖的确实是IService但其实就没意义,因为它只有一个实现,只是把他当作帮助类来用罢了。

用户点评