C# 这可以用C语言简化吗?
我有一些重复的代码,但不确定简化它的最佳方法C# 这可以用C语言简化吗?,c#,c#-5.0,code-duplication,C#,C# 5.0,Code Duplication,我有一些重复的代码,但不确定简化它的最佳方法 private void CheckData(long PKID, int ExpectedResult, string Server) { var a = _ARepo.GetAll(); var b = _BRepo.GetAll(); if(Server == "A") { a.Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResult
private void CheckData(long PKID, int ExpectedResult, string Server)
{
var a = _ARepo.GetAll();
var b = _BRepo.GetAll();
if(Server == "A")
{
a.Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResultId);
}
if (Server == "B")
{
b.Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResultId);
}
}
这是一个单元测试项目,我正在使用
库。任何想法都值得赞赏。您可以制作一个助手方法来处理此重复:
private void CheckFind<T>(List<T> a, int expectedId) where T : IWithId {
a.Find(x => x.PKID == PKID).Result.ShouldBe(expectedId);
}
是的,如果您可以使代码重构您的代码,并且您的\u ARepo.GeAll
和\u BRepo.getAll
在返回的类型中实现相同的接口,则如下所示
private void CheckData(long PKID, int ExpectedResult, string Server, IRepo repo)
{
var b = repo.GetAll();
b.Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResultId);
}
如果两个Repo
s实现相同的接口,更好的设计是将IRepo
作为函数的参数。这样,函数只有一个角色,即检查数据(而不是决定要检查哪些数据)使用一些简短的if符号,您可以使用以下命令
假设_ARepo和_BRepo来自同一类,但连接字符串不同
private void CheckData(long PKID, int ExpectedResult, string Server)
{
BaseType repo = Server == "A" ? _ARepo : _BRepo;
repo.GetAll().Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResultId);
}
假设它们不是相同的基类型,但GetAll()是IEnumerable
private void CheckData(long PKID, int ExpectedResult, string Server)
{
IEnumerable<YourType> repo = Server == "A" ? _ARepo.GetAll() : _BRepo.GetAll();
repo.Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResultId);
}
private void CheckData(长PKID、int ExpectedResult、字符串服务器)
{
IEnumerable repo=Server==“A”?\u ARepo.GetAll():\u BRepo.GetAll();
repo.Find(x=>x.PKID==PKID.Result.ShouldBe(ExpectedResultId);
}
如果所有回购协议实现相同的接口(如IRepo)。您可以像这样创建一个助手方法
private IRepo GetRepo(string server)
{
var repos = new Dictionary<string, IRepo>
{
{ "A", _ARepo },
{ "B", _BRepo }
};
return repos[server];
}
a
和b
的类型是什么?(服务器==“a”?a:b)。我想查找(…)。或者只需引入一个变量,并根据服务器为其分配a或b。然后在此变量上查询Find。@GiladGreen使用存储库模式和从SQL Server数据库中获取数据的Dapper
,它们是相同的类型。在进行任何检查之前,从Repo a或Repo B获取数据不是更好吗?您只需要在此处获取一批数据。与其保存代码行,不如只访问一个存储库而不是两个存储库来提高性能。@Evk True。然而,分配一个变量需要两种类型相同,而我的方法可以很容易地调整为泛型类型的列表,并有一个获取ID的接口。@Servy如果可以使用IEnumerable
,这将是正确的。但是,使用Find
表明OP使用List
,因此不,您的技巧不会起作用。如果在_ARepo和_breponted之间没有隐式转换,则不能将隐式var与条件运算符一起使用,但很容易计算出x)Repo的类型与相同
如果你只看一下代码的结构,连接字符串只会对服务器“A”和服务器“B”有所不同,但是我已经更新了我的答案,以涵盖相同的情况,如果答案不一样,我会根据你的建议将方法更改为private void CheckData(长PKID,int ExpectedResult,Repository repo)
@MarkAllison-很高兴能帮上忙:)顺便说一句-如果已经在写UT并且更好地负责代码段,那么我建议使用一个IRepository
,而不是一个具体的Repository
:)签出-这是编写代码和制作艺术之间的一种区别:)
private void CheckData(long PKID, int ExpectedResult, string Server)
{
BaseType repo = Server == "A" ? _ARepo : _BRepo;
repo.GetAll().Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResultId);
}
private void CheckData(long PKID, int ExpectedResult, string Server)
{
IEnumerable<YourType> repo = Server == "A" ? _ARepo.GetAll() : _BRepo.GetAll();
repo.Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResultId);
}
private IRepo GetRepo(string server)
{
var repos = new Dictionary<string, IRepo>
{
{ "A", _ARepo },
{ "B", _BRepo }
};
return repos[server];
}
private void CheckData(long PKID, int ExpectedResultId, string Server)
{
var repo = GetRepo(Server);
repo.GetAll().Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResultId);
}