标签:des style http io ar os 使用 java sp
今天偶然看到一框架,在框架的里面有一段这样的描述:
xxx并不愿意其他人来直接修改YYY框架的代码,因为XXX致力于将它打造为完美的作品,其他人写的代码,实在没有加入进来的意义。 但是您可以当小白鼠,提意见,提bug,好的idea我还是愿意接受的。
这里解释一下,其中xxx是作者名字,YYY是框架名称,这么OSC上牛人众多,牛到这个程度的还是第一次见到,于是就想去速度学习一下。其实框架好不好,看例子代码就可以看出一二,去找了找,果然找到了示例代码,我摘了两个方法:
/** * 发布文章 * * @return */ public Object add(){ Request r = Context.get(Statics.REQUEST); String title = r.get("title"); String desc = r.get("desc"); String content = r.get("content"); String cats = r.get("cats"); String pic = r.get("pic"); String keywords = r.get("keywords"); List<String> l = new ArrayList<String>(); String[] cs = cats.split(","); for(String s:cs){ s = s.trim(); if(!s.equals("")){ l.add(s); } } Validator.check(title,new RuleNotEmpty("标题")); HttpSession session = r.find(WebExecute.TAG_SESSION); User user = (User)session.getAttribute(Global.SESSION_USER); ITrans t = TransFactory.getTrans(); String id = ID.next()+""; IInserter ins = t.getInserter().table("T_ARTICLE"); ins.set("C_ID",id); ins.set("C_TITLE",title); ins.set("C_DESC",desc); ins.set("C_USER_ID",user.getId()); ins.set("C_CONTENT",content); ins.set("C_TIME",Dater.ymdhms(Dater.now())); ins.set("C_DAY",Dater.ymd(Dater.now())); ins.set("C_PIC",pic); ins.set("C_KEYWORDS",keywords); ins.insert(); if(l.size()>0){ for(String cat:l){ t.getInserter().table("T_ARTICLE_CAT").set("C_ID",ID.next()).set("C_ARTICLE_ID",id).set("C_CAT_ID",cat).insert(); } }else{ t.getInserter().table("T_ARTICLE_CAT").set("C_ID",ID.next()).set("C_ARTICLE_ID",id).set("C_CAT_ID",1).insert(); } t.commit(); t.close(); return new Tip("发布成功"); } /** * 修改文章 * * @return */ public Object modify(){ Request r = Context.get(Statics.REQUEST); long id = r.getLong("id"); String title = r.get("title"); String desc = r.get("desc"); String content = r.get("content"); String cats = r.get("cats"); String pic = r.get("pic"); String keywords = r.get("keywords"); List<String> l = new ArrayList<String>(); String[] cs = cats.split(","); for(String s:cs){ s = s.trim(); if(!s.equals("")){ l.add(s); } } Validator.check(title,new RuleNotEmpty("标题")); HttpSession session = r.find(WebExecute.TAG_SESSION); User user = (User)session.getAttribute(Global.SESSION_USER); Logger.getLog().info(desc); ITrans t = TransFactory.getTrans(); IUpdater iup = t.getUpdater().table("T_ARTICLE"); iup.where("C_ID",id); iup.set("C_TITLE",title); iup.set("C_DESC",desc); iup.set("C_USER_ID",user.getId()); iup.set("C_CONTENT",content); iup.set("C_PIC",pic); iup.set("C_KEYWORDS",keywords); iup.update(); t.getDeleter().table("T_ARTICLE_CAT").where("C_ARTICLE_ID",id).delete(); if(l.size()>0){ for(String cat:l){ t.getInserter().table("T_ARTICLE_CAT").set("C_ID",ID.next()).set("C_ARTICLE_ID",id).set("C_CAT_ID",cat).insert(); } }else{ t.getInserter().table("T_ARTICLE_CAT").set("C_ID",ID.next()).set("C_ARTICLE_ID",id).set("C_CAT_ID",1).insert(); } t.commit(); t.close(); return new Tip("修改成功"); }今天在某著名群里贴了一个方法,结果下面有同学说:“不是挺清楚的?我觉得就不错。”
当时正在忙,没有时间详细介绍,于是决定晚上抽个时间给分析讲解一下,不能保证全部是对的,也不能保证全部能够被人接受,但是一定可以促进大家思考一些框架开发中的问题:
上面提出了三个问题,这三个问题说复杂也非常复杂,三天两天说不清楚;说简单也简单,一句话就说清楚了。
什么是框架?这个问题实际上许多“做框架”的人也不明白。
框架和库的本质不同在于:
当然,关于这两货之间的比较,还有许多个角度,但我个人觉得本质是我上面举的这些。
设计的时候应该考虑哪些问题?这个问题的答案,如果用一句话来解符号,那答案就是:要仔细考虑使用这个框架的人感受,要考虑如何让使用者感觉爽的问题。当然如果是三天两天说不清楚的方式,那就得从方法论,问题领域,设计原则等待进行阐述了。
怎样才是一个及格的框架?这个问题,用一句话解释,就是在满足上一个问题的情况下不违背基本设计原则,那么就可以算是一个及格的框架。如果用三天两天说明,那就要把所有的基本设计原则拿出来,一个个讲讲清楚,一个个说说明白。
如果满足了第一个条件,使用者是满意的,从使用来说是不错的;如果满足了第二个条件来说,从设计及实现来说是不错的。如果两个都满足了那说明,最起码是可用的及格的框架,当然也可能得分更多。
好的,上面大致讲了一个框架设计过程中要考虑的一些问题,下面就实质性的考虑一下上面的代码,我承认,我没有看里面“框架中具体的实现”,下面的全部“结论”其实都是我的一种判断或猜测,如有不对,欢迎指正:
再来分析一下它里面违反一些常见现象对象设计原则的点:
单一原则:在一个方法里做了太多的事情,这种代码以后改的时候有多累呀
抽象原则:没有独立的Dao及Pojo,没有把Dao层,业务层进行剥离,从而导致数据的验证要重复的进行,这块的处理也不能进行复用。可以想想,如果想让这两方法提供的添加和修改功能通过Json或WebService对外提供服务,程序员唯一可行的办法就是再写两方法。
DRY原则:不要做重复的工作,代码中的重复实在太多了,这一点有可能是笔都只是为了说明意思或者随意了。
自动原则:如果能程序化自动完成的,不要让程序员手动完成。
只看这两段代码总结出来的内容不一定全部正确,如果有不正确的地方,欢迎海涵并批评指正。
其实之所以对这两段代码进行分析,是经过作者同意的,一来这两段代码比较典型,可遇而不可求,另外也希望代码作者能够高调做事,低调做人,扎扎实实做出一个别人无法进行再优化改良的框架来。
标签:des style http io ar os 使用 java sp
原文地址:http://my.oschina.net/tinyframework/blog/341696