我怎样才能更好地设计它?(避免使用面向对象设计的switch语句)

Chr*_*ris 8 c# oop design-patterns

我对面向对象的设计有一点了解,但我不确定如何在我的代码中使用这些原则.这是我正在做的事情:

    public void Query(Agency agency, Citation queryCitation) {
        queryCitation.AgencyCode = agency.AgencyCode;

        switch (agency.ClientDb.Type) {
            case "SQL":
                QueryOracle(agency, queryCitation);
                break;
            case "PIC":
                QueryPick(agency, queryCitation);
                break;
        }
    }
Run Code Online (Sandbox Code Playgroud)

(其中大部分是来自NHibernate的对象.我正在使用遗留数据库系统,并将其部分重构为代码库.)显然,我可以在这里做一些不同的事情,这样我就不需要为不同的数据库提供重复的功能了.具有相同输入的查询.它应该根据代理对象知道是使用Oracle数据库还是选择数据库连接.(如果你从来没有听说过Pick数据库,那么直到我开始在这里工作之前我都没有.我们通过HTTP请求对它进行查询,所以它不是SQL.)

我应该创建一个接口,例如名为"ClientDbConnection",然后创建两个实现该接口的类,移动代码以查询数据库,然后使用"agency.clientDb.Query(queryCitation)"替换整个函数?我想我在这里大声思考,但对此的任何意见都将不胜感激.

tay*_*onr 12

机构是你控制的一个班级吗?如果这样做的话:

public abstract class GenericDb
{
    public abstract void Query(parms);
}
Run Code Online (Sandbox Code Playgroud)

在您的代理机构类中,您可以拥有

public GenericDb ClientDb {get; set;}
Run Code Online (Sandbox Code Playgroud)

然后有一个SqlDb类,如:

public class SqlDb : GenericDb
{
    public void Query(parms);
}

public class PicDb : GenericDb
{
    public void Query(parms);
}
Run Code Online (Sandbox Code Playgroud)

然后这段代码:

public void Query(Agency agency, Citation queryCitation) {
        queryCitation.AgencyCode = agency.AgencyCode;

        switch (agency.ClientDb.Type) {
            case "SQL":
                QueryOracle(agency, queryCitation);
                break;
            case "PIC":
                QueryPick(agency, queryCitation);
                break;
        }
    }
Run Code Online (Sandbox Code Playgroud)

public void Query(Agency agency, Citation queryCitation) {
        queryCitation.AgencyCode = agency.AgencyCode;
        agency.ClientDb.Query(queryCitation);
    }
Run Code Online (Sandbox Code Playgroud)

由于继承,它将知道ClientDb具有GenericDb的基类.它将通过ClientDb参数的类型知道它是应该运行SqlDb还是PicDb或Oracle等.


ven*_*aur 5

您可能希望在此处实施策略模式.基本上,switch语句中的每个可能的"类型"都将成为它自己的一个实现相同接口的类.

应用战略模式

然后,您可以使用以"type"值作为参数的工厂方法.该方法将返回正确的类(其返回类型是上面提到的接口).