Могу ли я удалить дубликаты кода для классов, полученных ниже, и перейти к абстрактному базовому классу? - PullRequest
0 голосов
/ 07 октября 2018

У меня есть абстрактный базовый класс, начиная с timer, который является общим для всех производных классов,

public abstract class BaseClass
{
    public virtual void Start() { _timer.Start(); }
}

Теперь мне нужно загрузить разные файлы конфигурации JSON для каждого производного класса и создать файл,

public class DerivedClass1 : BaseClass
{
    private readonly List<config> configs = new List<config>();

    public DerivedClass1()
    {
        configs = JsonSettings.GetConfigurations(@"./Configurations/1.json");
    }
    public override void Start()
    {
        base.Start();

        foreach (var configuration in configs)
        {
            JsonSettings.CreateConfigFile(configuration);
        }
    }
}

public class DerivedClass2 : BaseClass
{
    private readonly List<config> configs = new List<config>();

    public DerivedClass2()
    {
        configs = JsonSettings.GetConfigurations(@"./Configurations/2.json");
    }
    public override void Start()
    {
        base.Start();

        foreach (var configuration in configs)
        {
            JsonSettings.CreateConfigFile(configuration);
        }
    }
}

Как я вижу, в различных производных классах дублируется множество кодов.

Можно ли переместить этот фрагмент кода так же, как и класс abstract base, или есть другой способ?

Ответы [ 3 ]

0 голосов
/ 07 октября 2018

Если классы ничем не отличаются, кроме пути конфигурации, то у вас может быть только один производный класс, который принимает путь в качестве параметра в своем ctor.

public DerivedClass(string configurationPath)
{
    configs = JsonSettings.GetConfigurations(configurationPath);
}

Поместите, пожалуйста, обратите внимание, что решение о включенииНаследование в вашей архитектуре не о дублировании кода, и не предоставляя нам никакой информации о функциях или даже именах классов (BaseClass и DerivedClass ничего не значат. Что они представляют? Что ихФункция? Почему они связаны?) Вы не даете нам никакой возможности помочь вам с вашим дизайном.

0 голосов
/ 07 октября 2018
public interface BaseClass
{
    void Start();
}

public interface IBaseClassUtil
{
    void Start();
    void setConfigs(List<config> configs);
}

public class BaseClassUtil : IBaseClassUtil
{
    System.Timers.Timer _timer;
    public  List<config> _configs { get; set; } = new List<config>();
    public void Start()
    {
        _timer.Start();
        foreach (var configuration in _configs)
        {
            JsonSettings.CreateConfigFile(configuration);
        }
    }

    public void setConfigs(List<config> configs)
    {
        _configs = configs;
    }
}
public class DerivedClass1 : BaseClass
{
    private IBaseClassUtil _baseUtility;
    public DerivedClass1(IBaseClassUtil baseUtility)
    {
        _baseUtility = baseUtility;
        _baseUtility.setConfigs( JsonSettings.GetConfigurations(@"./Configurations/1.json"));
    }

    public void Start()
    {
        _baseUtility.Start();
    }
}

public class DerivedClass2 : BaseClass
{
    private IBaseClassUtil _baseUtility;
    public DerivedClass2(IBaseClassUtil baseUtility)
    {
        _baseUtility = baseUtility;
        _baseUtility.setConfigs(JsonSettings.GetConfigurations(@"./Configurations/2.json"));
    }

    public void Start()
    {
        _baseUtility.Start();
    }
}

Это может быть спроектировано более чем.Или может не соответствовать вашим текущим требованиям.Преимущества будут

  1. В будущем, если вы захотите иметь другую реализацию для IBaseClassUtil, будет проще

  2. И огромное преимущество было бы в том, что этот код тестируемый
0 голосов
/ 07 октября 2018

Я думаю, вы могли бы упростить свой код до этого:

public abstract class BaseClass
{
    protected virtual List<config> configs { get; set; } = new List<config>();
    public virtual void Start()
    {
        _timer.Start();
        foreach (var configuration in configs)
        {
            JsonSettings.CreateConfigFile(configuration);
        }
    }
}

public class DerivedClass1 : BaseClass
{
    public DerivedClass1()
    {
        configs = JsonSettings.GetConfigurations(@"./Configurations/1.json");
    }
}

public class DerivedClass2 : BaseClass
{
    public DerivedClass2()
    {
        configs = JsonSettings.GetConfigurations(@"./Configurations/2.json");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...