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等.