作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我手头有不同的字符串距离度量实现(它们都在 C# 中),例如 Levensthein、NeedlemanWunsch、Jaccard 等。它们的工作基本上是相同的;将两个字符串作为输入并返回 [0,1] 范围内的相似度分数。因此,我计划让这些类实现相同的基本接口(interface),如下所示:
public interface IStringDistanceMetric
{
//Return a similarity between 0 and 1.
double CompareSimilarity(string strA, string strB);
}
我的每个指标都将实现此方法。但是有一些指标将直接对两个字符串进行操作,而无需任何其他输入,并且有一些指标需要一些额外的参数(例如对其中一个输入字符串中的间隙给出的惩罚等)。通常,我可以在构造函数阶段或在计算相似度分数之前给出这些参数。
我的问题是,一般来说,为了处理具体距离等级之间的这种差异,什么是好的设计实践?我的目标是,在决定使用特定类型的度量后,想要使用任何距离度量的客户端代码应该忽略任何底层实现细节。最明显的方法是实现类似的东西:
IStringDistanceMetric metric;
if(metricType == Metric.NeedlemanWunsch)
{
metric = new NeedlemanWunsch(parametersNW);
}
else if(metricType == Metric.Levensthein)
{
metric = new Levensthein(parametersL);
}
.
.
.
但这对我来说不是一个好的解决方案。我有点惊讶地发现自己陷入了这样一个看起来很基本的设计问题。任何帮助将不胜感激。
最佳答案
我想这在很大程度上取决于它的使用方式;这些参数的值是固定的还是应该在进行比较时提供?如果这些参数的可能值数量非常少,则 .NET 中使用的设计 StringComparers可以遵循(由 sourceof.net 提供):
private static readonly StringComparer _invariantCulture = new CultureAwareComparer(CultureInfo.InvariantCulture, false);
private static readonly StringComparer _invariantCultureIgnoreCase = new CultureAwareComparer(CultureInfo.InvariantCulture, true);
private static readonly StringComparer _ordinal = new OrdinalComparer(false);
private static readonly StringComparer _ordinalIgnoreCase = new OrdinalComparer(true);
public static StringComparer InvariantCulture {
get {
return _invariantCulture;
}
}
如果您正在获取用户输入或配置设置来指定您的参数值,并且每次比较字符串时它们都不同,那么工厂方法可能是合适的解决方案,这是您的答案中提出的“最明显的方式”。
关于c# - 对于以下情况,什么是好的设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26588209/
我是一名优秀的程序员,十分优秀!