首页 > 解决方案 > 像 DRY 原则一样删除 C# 中的重复代码

问题描述

我有这样的代码:

public interface IManager<T> where T : ConnectionOptions

public class XManager : IManager<ConnectionOptions>
{
    private ModuleConnectionOptions _moduleConnectionOptions;
    private void SetConnection(ModuleConnectionOptions moduleConnectionOptions)
    {
        var currentDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

        if (currentDirectory == null)
        {
            throw new ArgumentException("Current directory path is not valid.");
        }

        _moduleConnectionOptions.LocalFolder = Path.Combine(currentDirectory, moduleConnectionOptions.LocalFolder);
    }
}

public class YManager : IManager<ConnectionOptions>
{
    private TestConnectionOptions _testConnectionOptions;
    private void SetConnection(TestConnectionOptions testConnectionOptions)
    {
        var currentDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

        if (currentDirectory == null)
        {
            throw new ArgumentException("Current directory path is not valid.");
        }

        _testConnectionOptions.LocalFolder = Path.Combine(currentDirectory, testConnectionOptions.LocalFolder);
    }
}

public class ConnectionOptions
{
    // empty constructor for serialization
    public ConnectionOptions()
    {
    }

    public ConnectionOptions(string localFolder)
    {
        LocalFolder = localFolder;
    }

    public string LocalFolder { get; set; }
}

TestConnectionOptions 和 ModuleConnectionOptions 是 ConnectionOptions 的子类并具有附加属性。

这段代码很相似,而且非常重复。有一个更好的方法吗?谢谢你。

标签: c#.netasp.net-core.net-core

解决方案


在进入解决方案之前:您真的需要Generic声明吗 - 始终牢记 KISS 原则,然后是 DRY。我将在帖子末尾从我的解决方案中完全删除它:

我会看到以下内容:

创建如下界面:

public interface IConnectionOptions {
    public string LocalFolder {get; set;}
}

并拥有TestConnectionOptionsModuleConnectionOptions实施它。然后完全放弃一门课,制作一个像这样的课:

public class Manager : IManager<ConnectionOptions>
{
    private IConnectionOptions connectionOptions;
    private void SetConnection(IConnectionOptions connectionOptions)
    {
        var currentDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

        if (currentDirectory == null)
        {
            throw new ArgumentException("Current directory path is not valid.");
        }

        this.connectionOptions.LocalFolder = Path.Combine(currentDirectory, connectionOptions.LocalFolder);
    }
}

没有通用声明

/// Since there is only one instace, no need for generics
public class Manager: IManager
{
    private IConnectionOptions connectionOptions;
    private void SetConnection(IConnectionOptions connectionOptions)
    {
        var currentDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

        if (currentDirectory == null)
        {
            throw new ArgumentException("Current directory path is not valid.");
        }

        this.connectionOptions.LocalFolder = Path.Combine(currentDirectory, connectionOptions.LocalFolder);
    }
}


推荐阅读