簡體   English   中英

如何避免C#項目中的代碼重復

[英]How to avoid code duplication in c# project

我遇到了使用specflow自定義插件的情況。 使用specflow自定義插件,我有兩個不同的項目,分別是project_A和project_B。 這兩個項目都有自己的存儲庫。

Project_A具有下面的類(請找到代碼片段):

public class CustomTestGeneratorProvider : IUnitTestGeneratorProvider
{
    public CustomTestGeneratorProvider (CodeDomHelper codeDomHelper)
    {
        _unitTestGeneratorProvider = new 
        NUnit3TestGeneratorProvider(codeDomHelper);
        CodeDomHelper = codeDomHelper;
    }

    public UnitTestGeneratorTraits GetTraits()
    {
        return _unitTestGeneratorProvider.GetTraits();
    }

    public void SetTestClass(TestClassGenerationContext generationContext, string featureTitle,
        string featureDescription)
    {
        _unitTestGeneratorProvider.SetTestClass(generationContext, featureTitle, featureDescription);
        generationContext.Namespace.Imports.Add(new CodeNamespaceImport("Com.MyOrg.Custom.Core.Feature"));
        generationContext.TestClass.BaseTypes.Add("MyOrgTest");
     }

    public void SetTestClassCategories(TestClassGenerationContext generationContext,
        IEnumerable<string> featureCategories)
    {
        _unitTestGeneratorProvider.SetTestClassCategories(generationContext, featureCategories);
    }

Project_B具有下面的類(請找到代碼片段):

public class CustomTestGeneratorProvider : IUnitTestGeneratorProvider
{
    public CustomTestGeneratorProvider (CodeDomHelper codeDomHelper)
    {
        _unitTestGeneratorProvider = new 
        NUnit3TestGeneratorProvider(codeDomHelper);
        CodeDomHelper = codeDomHelper;
    }

    public UnitTestGeneratorTraits GetTraits()
    {
        return _unitTestGeneratorProvider.GetTraits();
    }

    public void SetTestClass(TestClassGenerationContext generationContext, string featureTitle,
        string featureDescription)
    {
        _unitTestGeneratorProvider.SetTestClass(generationContext, featureTitle, featureDescription);
    }

    public void SetTestClassCategories(TestClassGenerationContext generationContext,
        IEnumerable<string> featureCategories)
    {
        _unitTestGeneratorProvider.SetTestClassCategories(generationContext, featureCategories);
    }

如果看一下SetTestClass方法中的類有不同的實現邏輯。 這是對我唯一的維護方法。 請注意,兩個項目都做相同的事情,但它們的用戶不同。 發布時如果我在project_A中進行更改,我也應該注意或考慮project_B。

我想盡量減少這種維護。 我該怎么做以減少維護? 如何避免代碼重復? 在這種情況下。

采取這些類的所有公共部分,並從它們中創建一個抽象基類。 SetTestClass方法保持abstract
將此類放在單獨的dll中:

public abstract class TestGeneratorProvider : IUnitTestGeneratorProvider
{
    public CustomTestGeneratorProvider (CodeDomHelper codeDomHelper)
    {
        _unitTestGeneratorProvider = new 
        NUnit3TestGeneratorProvider(codeDomHelper);
        CodeDomHelper = codeDomHelper;
    }

    public UnitTestGeneratorTraits GetTraits()
    {
        return _unitTestGeneratorProvider.GetTraits();
    }

    public abstract void SetTestClass(TestClassGenerationContext generationContext, string featureTitle,
        string featureDescription)

    public void SetTestClassCategories(TestClassGenerationContext generationContext,
        IEnumerable<string> featureCategories)
    {
        _unitTestGeneratorProvider.SetTestClassCategories(generationContext, featureCategories);
    }
}

在項目A中,添加對該dll的引用,繼承此類並提供相關的SetTestClass實現:

public class CustomTestGeneratorProvider : TestGeneratorProvider
{
    public override void SetTestClass(TestClassGenerationContext generationContext, string featureTitle,
    string featureDescription)
    {
        _unitTestGeneratorProvider.SetTestClass(generationContext, featureTitle, featureDescription);
        generationContext.Namespace.Imports.Add(new CodeNamespaceImport("Com.MyOrg.Custom.Core.Feature"));
        generationContext.TestClass.BaseTypes.Add("MyOrgTest");
     }
}

並在項目B中執行相同的操作:

public class CustomTestGeneratorProvider : TestGeneratorProvider
{
    public override void SetTestClass(TestClassGenerationContext generationContext, string featureTitle,
    string featureDescription)
    {
        _unitTestGeneratorProvider.SetTestClass(generationContext, featureTitle, featureDescription);
    }
}

使用此類和方法的“基礎實現”創建一個單獨的項目。 如果您需要專門對一個進行修改,請使用override覆蓋該方法。

參考: https : //docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/override

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM