随笔 - 1, 文章 - 0, 评论 - 0, 引用 - 0
数据加载中……

我的评论

re: “设计”你的代码[未登录] onkyo 2010-04-30 09:39  
@Johnny.Liang
我只是就博文中我不太认同的地方发表一下看法,大家探讨一下相互提高。

首先我非常同意 设计是要针对需求的 的这句话, 这个流程相当稳定,不存在多态的情况,那么第一种写法

public void onMessage(InstructionInfo instructionInfo) {
if(xx && yy && zz) { // 停留在后端等待执行指定的工作流程
// 根据每种组合进行条件判断,走哪个流程
if(a==true && b==true && c==true && d==true {
...
}
else if(...) {...}
else if(...) {...}
...
else(...) {...}
}
}

我觉的完全可行。 何必再拆分出两个类? 还便于阅读,便于修改。 因为逻辑都集中在一起了。 这就是面对过程的设计, 非常的合理。

正如博文题目设计你的代码: 每个正确成长的程序员,都必须从编码开始,慢慢锻炼抽象思维、逻辑思维、面向对象思维,然后慢慢的过渡到系统设计,再随着经验和知识的积累,慢慢过渡到架构设计。

既然我们要抽象上述的代码, 要使用面对对象思维,要重构上面的代码, 就应该搞清楚为什么要用抽象,为什么要面对对象思维。 抽象和面对对象编程的目的无非是最大限度的重用。 那么就应该面对接口编程, 解耦关系。

我的观点就是既然要设计,就要好好设计。 如果要用省事的方法,那就用最省事的方法。

re: “设计”你的代码[未登录] onkyo 2010-04-28 17:54  
个人觉得比较好的方案是声明一个interface

public interface WorkflowFactroy {
Workflow create(Instruction info)
}

把逻辑写在WorkflowFactoryImpl里面, 用ioc注入WorkflowFactoryImpl.
re: “设计”你的代码[未登录] onkyo 2010-04-28 17:42  
小小的砸一下砖,大家探讨一下:

我比较质疑以下这两点
“纯面向对象的思维方式” 和 “内聚高,耦合低”。

和原来的代码比较的话就是把原来集中在一起的代码分散了。

首先 InstructionHandleDecisionMaker 和 InstructionWorkFlowSelector 就不是面对对象的设计, 用的是都是static函数。 实际上就是把原来代码中的
onMessage 中的代码, 归了一下类,拆成一些小函数, 然后再插到InstructionHandleDecisionMaker 和 InstructionWorkFlowSelector 文件中去。 其实际上就是

public void onMessage(InstructionInfo instructionInfo) {
if(isHandledByBackEnd(...) ) {
WorkFlow wf =getWorkFlow(...);
//TODO Implment the logic
}
}

private static Map mapping = new HashMap();
static {
mapping.input("YYNN",WorkFlow.A);
mapping.input("NNYY",WorkFlow.B);
...
}

private WorkFlow getWorkFlow(Instruction info) {
...
}

private String isA(...) {}
private String isB(...) {}
private String isC(...) {}
private String isD(...) {}

不能继承,不能重用。

其次代码是高耦合的, 当流程的判断条件变更的话是需要修改代码的,因为判断条件是写死在代码里面的。 (当然这就是为什么需要工作流框架的原因)
在postgresql 数据库的源代码contrib文件夹下面, 有一个模块:tablefunc

postgresql 把 connectby 做成了一个函数。

对于sql2005和mysql你可以参考一下, 自己写一个函数。

在数据库里面做递归比在程序里面至少快2个数量级
这样递归错是没错,但是太过理想化了, 在实际应用中基本很少能用上这样的代码。

设想一下比如一张表保存了所有工料信息(article-component) 里面有100万条数据记录。 如果使用楼主的算法耗时过长而且很可能out of memory。

其实就用一句SQL就可以了,不需要在程序里面递归。
既然楼主用了Oracle那就了解一下start with connect by 的用法吧