if - Java代码多分支语句优化
PHP中文网
PHP中文网 2017-04-17 17:39:01
0
8
558

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中文网

认证高级PHP讲师

répondre à tous(8)
洪涛

Je pense qu'il devrait être bon d'appeler la couche Dao par réflexion sans répéter le nom du dao depuis le début
C'est juste une idée ;

黄舟

Comme votre question contient déjà plusieurs phrases affirmatives telles que « ne demandez pas » et « définitivement », il est difficile de dire autre chose. Vous pouvez essayer le mode usine ou le mode gestionnaire pour obtenir l'instance dao correspondante en fonction de la valeur de l'indicateur (en fait, vous déplacez simplement ce code laid vers un coin sombre).

小葫芦

Polymorphisme, ou mode piloté par table (voir le chapitre 18 de la Collection de codes)

左手右手慢动作

C'est évidemment un problème de conception, c'est quand même un peu tenace

迷茫

Problèmes de structure du projet. Pensez aux caractéristiques de Java. Encapsulation. Polymorphisme héréditaire

迷茫

Depuis que vous avez mentionné le mot injection, je suppose que vous utilisez le framework Spring et que l'applicationContext de Spring peut récupérer tous les beans qui ont été initialisés par le conteneur. Il existe généralement une abstraction de couche d'accès aux données telle que BaseDao dans le framework. , alors vous pouvez utiliser baseDao=applicationContext.getBean("beanName") puis faire ce que vous voulez

巴扎黑

Je vais construire une map
map.put("dao1",dao1);
map.put("dao2",dao2);
map.put("dao3",dao3);
Sélectionnez ensuite la clé de la carte à travers les paramètres de la page et obtenez le dao
Bien entendu, si vous utilisez spring, cette carte peut être configurée directement dans spring xml

PHPzhong

Je me souviens que les instructions if else et switch case peuvent être reconstruites en utilisant le mode commande

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() ;
    }
}

Ensuite, la couche de contrôle peut utiliser directement servicecontrol. De cette façon, la couche de contrôle est découplée du dao, et les modifications des deux côtés ne s'affectent pas et sont coordonnées via XML

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal