c# - 像 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 的子类并具有附加属性。
这段代码很相似,而且非常重复。有一个更好的方法吗?谢谢你。
解决方案
在进入解决方案之前:您真的需要Generic
声明吗 - 始终牢记 KISS 原则,然后是 DRY。我将在帖子末尾从我的解决方案中完全删除它:
我会看到以下内容:
创建如下界面:
public interface IConnectionOptions {
public string LocalFolder {get; set;}
}
并拥有TestConnectionOptions
并ModuleConnectionOptions
实施它。然后完全放弃一门课,制作一个像这样的课:
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);
}
}
推荐阅读
- javascript - 程序化日期验证返回异步?(jquery formvalidator)
- android - 如何使用 RxJava/Retrofit 从服务器获取数据
- javascript - 启用“存储”权限后调试模块在事件页面中不起作用
- cloud-foundry - 限制 CloudFoundry 上应用程序的入站流量
- sql - 按一张表中的所有列分组
- r - R中同一图上相同比例的两个y轴
- tensorflow - 计算预测的置信度
- java - Java java.sql.SQLException,而我尝试将值连接到准备好的语句中
- javascript - 用于检测斜体降价指示符的正则表达式
- vba - 在字典中修改数组被忽略