锁定老帖子 主题:用enum代替if.这个设计大家怎么看
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-10-11
最后修改:2012-10-11
kyfxbl 写道 devroller2 写道 说过度设计的人还是闭嘴吧,不要误导别人。多看看人家优秀的源代码,比如apache roller中有自己的任务调度框架,设计者怎么知道有人会拿他们的源代码做二次开发,而且也需要定时任务;再比如,roller应用velocity作为渲染页面引擎,怎么知道有人在二次开发式也需要velocity生成个性化的邮件、短信,而且还不用直接调用velocity的api?
人家roller可能也没有以后要换模版引擎,但是为什么人家还是设计为可切换呢?而且对其api进行封装,难道这些都是过度设计了吗? 对第三方软件进行封装的好处是可以却换到其他软件,解除应用自身代码对具体第三方软件api的依赖,方便以后可以切换,更主要的是可以提高工作效率,因为同个项目中其他人也用到这个第三方软件,只要一个人去深入研究并提高封装后的api即可。 所以,我们开发新项目不可能不用到第三方软件,比如水晶报表、poi等等这些要封装一下。也就是你们所谓的过度设计吧。 我参加的十几个项目,难以维护,不是因为过度设计,而是没有设计,随意写代码。 不要不承认有过度设计这回事,如果没有这回事,也就不会有这个词 另外你举的例子真心好笑。像roller这样的,本身就是个运行框架,设计时不考虑扩展性的话,能玩得转吗?又比如maven,本身就是基于插件运作,那当然设计时也考虑扩展性。这些都是优秀设计,不是过度设计 至于你去封装poi,明显就是过度封装。没错,如果换了第三方组件,你自行封装那层的API是不受影响,问题是组件都换了,你封装那层不改就能跑吗?只是在哪里改的问题,你觉得你封装的API,一定比第三方组件的原生API好用吗? 设计是好的,但是过度设计是有问题的,并且要承认这个事实的存在 过度设计相比适度设计是问题,但相比没有设计更好。 谁说Roller是一个框架,也许对于想用来开发博客的是框架,但用于其他业务应用的就不是。 为什么我们不把自己的应用来当做框架来设计,我相信任何业务领域都有自己的业务模型,为什么不设计为一个框架(其实是对业务建模而已)来适应将来的变化,业务都会有发生变化的。相反基本没有人这么考虑,为了实现业务功能就随意写过程式的代码。 改封装层的代价总比改散落各处对第三方api调用强吧。你怎么知道人家封装的不好,有专人负责,不好能行吗?而且最大的好处是提高工作效率,不需要项目组中所有人都去学习这些第三方软件如何使用。 |
|
返回顶楼 | |
发表时间:2012-10-11
把自己的应用当做框架来设计,这个理想挺好。其实就是产品平台化,这不是三言两语能说清楚的
是否对第三方组件进行封装,也要看具体情况,不能一概而论,比如说日志组件,因为各模块都会调用,所以确实有必要用一个层来封装。事实上也已经有了,就是slf4j 但是你说的poi,水晶报表这些,应该只是在对应的业务模块里存在调用的,不应该像你说的散落各处。如果真的散落各处,那应该考虑的是模块划分是否有问题,而不是上来就去封装一下POI,这个思路就不对 事实上,这种针对某个特性的第三方组件,本身就是一种封装,再次封装意义很小。你说的降低学习成本,也不见得。不用学第三方组件了,但是要去学封装后的API,有什么区别?除非你这个封装是原生API的一个子集。那这样的话,用一个说明文档同样解决问题 |
|
返回顶楼 | |
发表时间:2012-10-11
kyfxbl 写道 把自己的应用当做框架来设计,这个理想挺好。其实就是产品平台化,这不是三言两语能说清楚的 是否对第三方组件进行封装,也要看具体情况,不能一概而论,比如说日志组件,因为各模块都会调用,所以确实有必要用一个层来封装。事实上也已经有了,就是slf4j 但是你说的poi,水晶报表这些,应该只是在对应的业务模块里存在调用的,不应该像你说的散落各处。如果真的散落各处,那应该考虑的是模块划分是否有问题,而不是上来就去封装一下POI,这个思路就不对 事实上,这种针对某个特性的第三方组件,本身就是一种封装,再次封装意义很小。你说的降低学习成本,也不见得。不用学第三方组件了,但是要去学封装后的API,有什么区别?除非你这个封装是原生API的一个子集。那这样的话,用一个说明文档同样解决问题 封装后的api和原始api区别很大,这时候封装者作为服务提供方,其他开发人员所为需求方,必然要求封装者提供简单高效的API完成对第三方组件的调用,比如,传个业务对象你封装者就要帮我生成漂亮的pdf报表。 所以想设计不好都难,后面有人看着。 我们项目组把一些项目中的通用逻辑抽出来专门有人负责,比如页面有js校验吧,这个有人专门负责,报表有自己的封装框架(生成各种文件,pdf、txt、excel、csv等),业务模型有人专门负责,安全有人负责。 |
|
返回顶楼 | |
发表时间:2012-10-28
最后修改:2012-10-28
show the code
public class HandleSomething { private static Manager manager; private static Logger subLogger = LoggerFactory.getLogger(HandleSomething.class); protected void work(int entryType, long userId, Context context) { int type = Flow.fromEntryType(entryType).handle(userId); context.put("type",type); } private static enum Flow{ VIP_ENTRY_FLOW (1) {// 特殊页面进入 @Override int handle(long userId) { /*这里的逻辑用到manager和subLogger*/ }, INDEX_ENTRY_FLOW (2) {// 首页进入 @Override int handle(long userId) { /*这里的逻辑用到manager和subLogger*/ }, OTHERS_ENTRY_FLOW (3){ // 其他页面进来 @Override int handle(long userId) { /*这里的逻辑用到manager和subLogger*/ } }; private final int tag; private Flow(Integer tag){ this.tag=tag; } public abstract int handle(long userId); } } 正如大家说的,这是一种枚举策略的典型场景。 protected void work(int entryType, long userId, Context context) //此API建议把context提取出去 然后在使用的位置把结果放入 int type = manage.work(int entryType, long userId); context.put("type",type); 比如我现在是客户,work啥子含义不是很清晰,handle什么含义我也不是很清晰。 |
|
返回顶楼 | |
发表时间:2012-11-13
直接约定优于配置怎么样?
type=index,function=indexHandle(....) ... |
|
返回顶楼 | |
发表时间:2012-11-16
感觉不如来个BeanFactory来的容易 - -
|
|
返回顶楼 | |