gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 18:05:35 25 4
gpt4 key购买 nike

我知道一点 Object Oriented design ,但我不确定如何在我的代码中使用这些原则。这是我正在做的事情:

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

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

我是否应该创建一个接口(interface),例如名为“ClientDbConnection”的接口(interface),然后创建两个实现该接口(interface)的类,将代码移动到那些查询数据库的类,然后用类似“agency.clientDb.Query(queryCitation)”的东西替换这整个功能?我想我在这里大声思考,但对此的任何意见都将不胜感激。

最佳答案

Agency 是你控制的类吗?如果是这样,请执行以下操作:

public abstract class GenericDb
{
public abstract void Query(parms);
}

在您的 Agency 类中,您可以拥有

public GenericDb ClientDb {get; set;}

然后有一个像这样的 SqlDb 类:

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

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

然后这段代码:

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

成为

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

因为继承,它会知道ClientDb有一个GenericDb的基类。它会通过ClientDb参数的类型知道它应该运行SqlDb还是PicDb或Oracle等。

关于c# - 我怎样才能更好地设计这个? (避免使用面向对象设计的 switch 语句),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5778939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com