我的評論
re: “設計”你的代碼[未登錄] onkyo 2010-04-30 09:39
@Johnny.Liang
我只是就博文中我不太認同的地方發(fā)表一下看法,大家探討一下相互提高。
首先我非常同意 設計是要針對需求的 的這句話, 這個流程相當穩(wěn)定,不存在多態(tài)的情況,那么第一種寫法
public void onMessage(InstructionInfo instructionInfo) {
if(xx && yy && zz) { // 停留在后端等待執(zhí)行指定的工作流程
// 根據(jù)每種組合進行條件判斷,走哪個流程
if(a==true && b==true && c==true && d==true {
...
}
else if(...) {...}
else if(...) {...}
...
else(...) {...}
}
}
我覺的完全可行。 何必再拆分出兩個類? 還便于閱讀,便于修改。 因為邏輯都集中在一起了。 這就是面對過程的設計, 非常的合理。
正如博文題目設計你的代碼: 每個正確成長的程序員,都必須從編碼開始,慢慢鍛煉抽象思維、邏輯思維、面向對象思維,然后慢慢的過渡到系統(tǒng)設計,再隨著經(jīng)驗和知識的積累,慢慢過渡到架構設計。
既然我們要抽象上述的代碼, 要使用面對對象思維,要重構上面的代碼, 就應該搞清楚為什么要用抽象,為什么要面對對象思維。 抽象和面對對象編程的目的無非是最大限度的重用。 那么就應該面對接口編程, 解耦關系。
我的觀點就是既然要設計,就要好好設計。 如果要用省事的方法,那就用最省事的方法。
我只是就博文中我不太認同的地方發(fā)表一下看法,大家探討一下相互提高。
首先我非常同意 設計是要針對需求的 的這句話, 這個流程相當穩(wěn)定,不存在多態(tài)的情況,那么第一種寫法
public void onMessage(InstructionInfo instructionInfo) {
if(xx && yy && zz) { // 停留在后端等待執(zhí)行指定的工作流程
// 根據(jù)每種組合進行條件判斷,走哪個流程
if(a==true && b==true && c==true && d==true {
...
}
else if(...) {...}
else if(...) {...}
...
else(...) {...}
}
}
我覺的完全可行。 何必再拆分出兩個類? 還便于閱讀,便于修改。 因為邏輯都集中在一起了。 這就是面對過程的設計, 非常的合理。
正如博文題目設計你的代碼: 每個正確成長的程序員,都必須從編碼開始,慢慢鍛煉抽象思維、邏輯思維、面向對象思維,然后慢慢的過渡到系統(tǒng)設計,再隨著經(jīng)驗和知識的積累,慢慢過渡到架構設計。
既然我們要抽象上述的代碼, 要使用面對對象思維,要重構上面的代碼, 就應該搞清楚為什么要用抽象,為什么要面對對象思維。 抽象和面對對象編程的目的無非是最大限度的重用。 那么就應該面對接口編程, 解耦關系。
我的觀點就是既然要設計,就要好好設計。 如果要用省事的方法,那就用最省事的方法。
re: “設計”你的代碼[未登錄] onkyo 2010-04-28 17:54
個人覺得比較好的方案是聲明一個interface
public interface WorkflowFactroy {
Workflow create(Instruction info)
}
把邏輯寫在WorkflowFactoryImpl里面, 用ioc注入WorkflowFactoryImpl.
public interface WorkflowFactroy {
Workflow create(Instruction info)
}
把邏輯寫在WorkflowFactoryImpl里面, 用ioc注入WorkflowFactoryImpl.
re: “設計”你的代碼[未登錄] onkyo 2010-04-28 17:42
小小的砸一下磚,大家探討一下:
我比較質(zhì)疑以下這兩點
“純面向對象的思維方式” 和 “內(nèi)聚高,耦合低”。
和原來的代碼比較的話就是把原來集中在一起的代碼分散了。
首先 InstructionHandleDecisionMaker 和 InstructionWorkFlowSelector 就不是面對對象的設計, 用的是都是static函數(shù)。 實際上就是把原來代碼中的
onMessage 中的代碼, 歸了一下類,拆成一些小函數(shù), 然后再插到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(...) {}
不能繼承,不能重用。
其次代碼是高耦合的, 當流程的判斷條件變更的話是需要修改代碼的,因為判斷條件是寫死在代碼里面的。 (當然這就是為什么需要工作流框架的原因)
我比較質(zhì)疑以下這兩點
“純面向對象的思維方式” 和 “內(nèi)聚高,耦合低”。
和原來的代碼比較的話就是把原來集中在一起的代碼分散了。
首先 InstructionHandleDecisionMaker 和 InstructionWorkFlowSelector 就不是面對對象的設計, 用的是都是static函數(shù)。 實際上就是把原來代碼中的
onMessage 中的代碼, 歸了一下類,拆成一些小函數(shù), 然后再插到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(...) {}
不能繼承,不能重用。
其次代碼是高耦合的, 當流程的判斷條件變更的話是需要修改代碼的,因為判斷條件是寫死在代碼里面的。 (當然這就是為什么需要工作流框架的原因)
re: 遞歸樹(新思路)[JDBC+Servlet+javaBean](新手版高手勿進)[未登錄] onkyo 2009-11-19 07:07
是的.
如何寫這個儲存過程:
MySQL 可以參考 http://qieqie.javaeye.com/blog/115293
SQL2005 可以參考 http://technet.microsoft.com/de-de/library/cc917573%28en-us%29.aspx
如何寫這個儲存過程:
MySQL 可以參考 http://qieqie.javaeye.com/blog/115293
SQL2005 可以參考 http://technet.microsoft.com/de-de/library/cc917573%28en-us%29.aspx
re: 遞歸樹(新思路)[JDBC+Servlet+javaBean](新手版高手勿進)[未登錄] onkyo 2009-11-18 15:41
在postgresql 數(shù)據(jù)庫的源代碼contrib文件夾下面, 有一個模塊:tablefunc
postgresql 把 connectby 做成了一個函數(shù)。
對于sql2005和mysql你可以參考一下, 自己寫一個函數(shù)。
在數(shù)據(jù)庫里面做遞歸比在程序里面至少快2個數(shù)量級
postgresql 把 connectby 做成了一個函數(shù)。
對于sql2005和mysql你可以參考一下, 自己寫一個函數(shù)。
在數(shù)據(jù)庫里面做遞歸比在程序里面至少快2個數(shù)量級
re: 遞歸樹(新思路)[JDBC+Servlet+javaBean](新手版高手勿進)[未登錄] onkyo 2009-11-18 09:37
這樣遞歸錯是沒錯,但是太過理想化了, 在實際應用中基本很少能用上這樣的代碼。
設想一下比如一張表保存了所有工料信息(article-component) 里面有100萬條數(shù)據(jù)記錄。 如果使用樓主的算法耗時過長而且很可能out of memory。
其實就用一句SQL就可以了,不需要在程序里面遞歸。
既然樓主用了Oracle那就了解一下start with connect by 的用法吧
設想一下比如一張表保存了所有工料信息(article-component) 里面有100萬條數(shù)據(jù)記錄。 如果使用樓主的算法耗時過長而且很可能out of memory。
其實就用一句SQL就可以了,不需要在程序里面遞歸。
既然樓主用了Oracle那就了解一下start with connect by 的用法吧