搜尋

首頁  >  問答  >  主體

if - Java代码多分支语句优化

1.项目背景
一个controller,一个serivce,多个dao层
service里面更具用户的不同参数调用不同的dao进行实例化,时候在调用方法。
2.不要问为什么设计,那是因为一个模块对应37张表,用户根据下拉选择输入不同的表单(说白点,点击页面新增弹出下拉框,让用户选择填写那张表单,再来一句,各个表之间没有相同的字段),所以此模块肯定是一个controller,一个service,各个dao对应不同的表进行增删改查操作
3.所以在service层必然有一个语句需要判断实例化那个dao,用注入也行
if(flag == dao1){

}else if(flag == dao2){

}else if(flag == dao3){

}else if(flag == dao4){

}else if(flag == dao5){

}else if(flag == dao6){

}
........就要写25个(不管是switch还是if都避免不了)
4.所以这样的方式有没有好一点的方式进行处理,不用写这么多的判断。

PHP中文网PHP中文网2827 天前569

全部回覆(8)我來回復

  • PHP中文网

    PHP中文网2017-04-17 17:41:01

    我覺得應該,從前端把dao的不重複名字,透過反射調用Dao層會很好;
    只是個念頭。

    回覆
    0
  • 黄舟

    黄舟2017-04-17 17:41:01

    既然你問題裡已經有好幾句「不要問」「一定是」這樣的肯定句,那也不好說什麼了。可以試試工廠模式或管理者模式,根據flag值取得對應的dao實例(其實只是把這段醜陋的程式碼挪到一個陰暗的小角落)。

    回覆
    0
  • 高洛峰

    高洛峰2017-04-17 17:41:01

    多態,或表驅動模式(參考代碼大全第十八章)

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-17 17:41:01

    很明顯是設計問題,還有點頑固不化

    回覆
    0
  • 迷茫

    迷茫2017-04-17 17:41:01

    項目結構問題。想想java的特徵。封裝。繼承多態性

    回覆
    0
  • 迷茫

    迷茫2017-04-17 17:41:01

    既然你說到了注入這個詞,那我默認你是用Spring框架,而Spring的applicationContext裡面可以獲得容器已經初始化的所有bean,通常框架裡面都會有一個BaseDao之類的資料存取層抽象,那你就可以使用baseDao=applicationContext.getBean("beanName"),接著你想做什麼就做什麼

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-17 17:41:01

    我會建立一個map
    map.put("dao1",dao1);
    map.put("dao2",dao2);
    map.put("dao3",dao3);
    然後透過頁面的參數選擇map的key,得到dao
    當然如果你用的是spring, 這個map可以直接配置在spring xml裡

    回覆
    0
  • PHPz

    PHPz2017-04-17 17:41:01

    我記著if else和switch case語句都可以用指令模式重構

    interface dao
    {
        crdu() ;
    }
    
    class ConcreteDao implements dao
    {
        crdu(){...} ;
    }
    
    class Service
    {
        private Dao dao ;
    
        public void set(Dao dao){}
    
        public void service(){dao.service();}
    }
    
    class ServiceControl
    {
        private HashMap<Integer , Dao> map ;
        private Service service ;
    
        public ServiceControl()
        {
            //读xml表初始化标识与dao的对应
        }
    
        public void service(int flag)
        {
            //根据flag来选择不同的dao注入到service中
            Dao dao = map.get(flag) ;
            service.set(dao) ;
            service.service() ;
        }
    }
    

    然後control層直接嗲用servicecontrol就可以了, 這樣control層就和dao解耦了, 兩邊的修改互不影響, 透過xml進行協調

    回覆
    0
  • 取消回覆