什么是框架(续)?
本文是《什么是框架》的续集, 新来的同学可以先看看那一篇文章。
张大胖听大神Bill讲解了框架的作用,回去思考了两天,茅塞顿开。
框架只是一个半成品而已, 这个半成品当中固化了很多最佳的实践, 开发人员必须把自己的代码填充到框架当中才能成为一个完整的应用程序。
说起来简单, 到底怎么“填充”呢 ? 码农们写出来的代码怎么才能让框架知道, 并且调用呢?
张大胖本来想找Bill 问个明白, 但转眼一想, 自己要是能思考出结果岂不更加印象深刻? !
他的脑子开始热身,迅速进入高速运转状态, 叮的一声, 一个想法跨入他的脑海: 可以用继承啊!
框架定义一些抽象类(如Java 中的abstract class ) 让具体的应用代码去继承, 抽象类的好处是可以写具体方法, 也可以只声明抽象方法而不实现 -- 具体的实现肯定要留给码农们的应用程序了。
在抽象类的具体方法中,可以处理一些框架公用的逻辑, 然后调用那些子类应该实现的抽象方法, 这不就把框架和应用结合起来了吗?
嗯, 这不就是我上周看过的一个著名的设计模式: 模板方法吗? 用在此处挺合适的嘛, 大胖不由的一阵得意, 似乎是自己重新发明了这个设计模式。
(注: Action 为抽象类, doBusiness 为抽象方法, 其他为具体方法)
张大胖马上向Bill汇报自己的新发明, Bill 鼓励到: “你小子开窍了啊, 这的确是一个办法, 著名的MVC框架struts1 就是这么干的, 还有JUnit的早期版本,更早的EJB1.x, 2.x 都是这样, 都需要自己的业务类/测试类去继承一个框架的抽象类, 实现抽象方法才可以。”
张大胖知道Bill的习惯是先扬后抑, 静静的等待着转折。
“但是,” 转折果然如期而至, “ 这种方法让人感到不爽,业务类比较死板 , 比如你必须得用框架规定的方法名, 没法自己定制。例如JUnit的早期版本, 测试用例的初始化方法必须得叫Setup, 销毁方法必须是TearDown, 你想换成init/destroy 是肯定不行的, 因为框架根本不知道。 ”
张大胖说: “这没什么啊, 我觉得还是比较好的编程实践呢, 大家都保持名称一致,可读性很好啊”
“其实你往深处想想就会明白, 这种方式其实让你的业务类和框架绑定了! 这是最要命的。 你的例子中抽象类是Action , 如果这个Action 很‘重’ ,依赖HttpServletRequest/HttpServletResponse, 必须得有一个Web容器(Tomcat)才能创建起来, 那你的LoginAction 可就悲催了, 想要做个单元测试必须得把Tomcat跑起来才行。 ”
张大胖说:“听你这么一解释, 我明白了,这种继承的方式问题很大啊。 是不是可以这么说, 框架和业务类最好是独立变化, 中间用一座桥来连接起来。”
Bill 赞许道 : “对, 你想想这个桥用什么‘材料’做比较好?”
张大胖挠挠头,一脸懵逼。
“回到原始的问题, 我们不就是试图让框架把我们的业务类创建起来,然后调用特定的方法吗? 完全不用在代码中写死, 可以采用别的声明式的办法啊” Bill 循循善诱。
“难道在代码中写注释? ” 张大胖继续一脸懵逼。
“注释都是纯文本, 不是结构化的信息啊, 难道你让框架读取文本,然后做个语义分析? 根本不可能, 更何况注释在编译过的class中间已经不复存在了,无处可寻, 框架怎么读? 再想想” Bill急得就差自己公布答案了。
“啊, 我知道了,你刚才说的结构化信息提醒了我, 可以用XML啊, XML来描述结构化东西很擅长! ”
张大胖说着还写了个例子出来: “通过用XML来描述, 框架就可以找到相关的类和方法,就可以调用了”
"是的, 你举了一个小例子, 实际上由于XML的扩展性, 能描述极为复杂的语义,很多框架都会制定规则, 让码农们去‘声明’自己的业务类及其方法。 "
“这种声明的方式真是不错,业务类不用继承框架的抽象类了,我刚想到一个问题, 我们的Java类和XML配置不在一起, 当我们想知道一个类的方法,字段是怎么被框架使用的时候,还得回过头来查看XML, 这实在不爽。 ” 张大胖问道。
“这是个好问题, 那就把这种‘声明’信息挪到Java 类中去吧!” Bill 说。
“你刚才说了不能用注释, 怎么在Java 文件中写‘声明’ 啊?”
“没有注释, 可以有注解啊! ”
“你是说那个@author, @version, @return, @see这样用来生成Java文档的注解吗? 还有什么@Override,@Deprecated, 我从来都不用。”
Bill 笑了: “那只是Java内置的一些注解, 现在Java可以自定义注解了, 我们完全可以利用这种注解来声明框架想用的信息, 我给你举个例子:”
张大胖问道: “@Controller, @ReqeustMapping, @RequestParam 都是框架自定义的注解?“
“是的, 你可以直接在Java 代码中使用, 在运行时框架能读取这些注解, 就知道你想干什么事情了。”
“ 嗯,所有的信息都在Java 中了, 比XML看起来更简洁一些, 果然是十分酸爽。” 张大胖十分感慨 ,“不过,这样一来声明式的信息又四处分散,维护又不方便了。 ”
Bill说: “哪有十全十美的东西? 在编程中根据情况选择吧!”
你看到的只是冰山一角, 更多精彩文章,请移步《码农翻身文章精华》
有心得想和大家分享? 欢迎投稿 ! 我的联系方式:微信:liuxinlehan QQ: 3340792577
优秀人才不缺工作机会,只缺适合自己的好机会。但是他们往往没有精力从海量机会中找到最适合的那个。
100offer 会对平台上的人才和企业进行严格筛选,让「最好的人才」和「最好的公司」相遇。
扫描下方二维码,注册 100offer,谈谈你对下一份工作的期待。一周内,收到 5-10 个满足你要求的好机会!