gpt4 book ai didi

c# - 对于以下情况,什么是好的设计模式?

转载 作者:太空狗 更新时间:2023-10-30 01:35:16 26 4
gpt4 key购买 nike

我手头有不同的字符串距离度量实现(它们都在 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com