Как избежать дублирования кода в проекте c # - PullRequest
0 голосов
/ 14 марта 2019

У меня есть ситуация, когда я использую специальный плагин 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.

Я бы хотел минимизировать это обслуживание.Что я должен сделать, чтобы уменьшить обслуживание?Как избежать дублирования кода?в таком сценарии.

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Возьмите все общие части классов и создайте из них абстрактный базовый класс.Оставьте метод 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);
    }
}
0 голосов
/ 14 марта 2019

Создайте отдельный проект с этим классом и «базовой реализацией» для методов.Если вам нужно внести изменения только для одного, используйте переопределение для переопределения метода.

Ссылка: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/override

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...