这可以在C#中简化吗?

时间:2016-10-06 14:53:53

标签: 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(ExpectedResultId);
    }

    if (Server == "B")
    {
        b.Find(x => x.PKID == PKID).Result.ShouldBe(ExpectedResultId);
    }
}

这是一个单元测试项目,我正在使用Shouldly库。任何想法都赞赏。

5 个答案:

答案 0 :(得分:6)

private void CheckData(long PKID, int ExpectedResult, string Server)
{
    //Setting to empty because I don't know what happens if it is not "A" nor "B"
    IEnumerable<YourType> data = Enumerable.Empty<YourType>();

    if(Server == "A")
        data = _ARepo.GetAll();
    else if(Server == "B")
        data = _BRepo.GetAll();

    data.Find(Find(x => x.PKID == PKID).Result.ShouldBe(expectedId);
}

如果Server值只能是AB,那么您可以替换为if else或更好的?:运算符 然后它看起来像:

var data = Server == "A" ? _ARepo.GetAll() : _BRepo.GetAll();
data.Find(Find(x => x.PKID == PKID).Result.ShouldBe(expectedId);

如果两个Repo实现相同的接口,则更好的设计是将IRepo作为函数的参数。这样,该函数只有一个角色 - 即检查数据(而不是决定要检查的数据)

答案 1 :(得分:3)

您可以使用辅助方法来处理此重复:

private void CheckFind<T>(List<T> a, int expectedId) where T : IWithId {
    a.Find(x => x.PKID == PKID).Result.ShouldBe(expectedId);
}

CheckData

两次调用此方法
if(Server == "A") {
    CheckFind(_ARepo.GetAll(), ExpectedResultId);
}
if(Server == "B") {
    CheckFind(_BRepo.GetAll(), ExpectedResultId);
}

答案 2 :(得分:1)

是的,如果您可以让代码重构您的代码并且您的_ARepo.GeAll_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);
}

答案 3 :(得分:1)

使用一些简短的符号表示您可以使用以下内容 假设以下情况_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);
}

假设它们不是相同的BaseType,但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);
}

答案 4 :(得分:1)

如果所有Repos都实现相同的接口(如IRepo)。你可以像这样创建一个辅助方法

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