gpt4 book ai didi

c# - 什么时候使用 NotSupportedException 不好?

转载 作者:太空狗 更新时间:2023-10-30 00:41:56 28 4
gpt4 key购买 nike

我正在构建一个本地化目录,但遇到了设计难题。现在,目录存储一个 Dictionary<string, IString>存储翻译,其中 IString可以是两种类型:SingularPlural .这是 IString 的简化版本:

public interface IString
{
void SetSingular(string singular);

string GetSingular(params object[] args);

void SetPlural(PluralCategory category, string plural);

string GetPlural(PluralCategory category, params object[] args);
}

然后,当我执行 Singular 时,我扔了一个 NotSupportedException对于被目录捕获的复数方法,和Plural对奇异方法做同样的事情。

public class Singular : IString
{
// ...

public string GetPlural(PluralCategory category, params object[] args)
{
throw new NotSupportedException(string.Format(
"Singular strings don't support GetPlural({0}, {1})",
category, args));
}

public void SetPlural(PluralCategory category, string plural)
{
throw new NotSupportedException(string.Format(
"Singular strings don't support SetPlural({0}, {1})",
category, plural));
}
}

这样的设计源于要求key对于单复数都必须是唯一的,但是我觉得实现不相关的方法,抛出NotSupportedException味道不好。

第二种设计是存储 Dictionary<string, StringType>用于 key 检查,其中 StringType是一个枚举,然后有两个额外的字典Dictionary<string, Singular>Dictionary<string, Plural>根据 StringType 的值使用.这使它变得有点复杂,但不会破坏界面概念。

那么,你怎么看?我的第一个想法是对 NotSupportedException 的错误使用吗? ?我应该选择第二个设计还是其他?

编辑:基于@dasblinkenlight 的想法,一个更清晰的解决方案是统一接口(interface)方法以获得 Singular。或 Plural成一个。单数只有一个 PluralCategory.None , 而复数永远不允许包含此类别。这受到 setter 方法的限制,被排除在由特定实现定义的接口(interface)之外(下面未显示 setter 方法)。

public interface IString
{
string GetString(PluralCategory category, params object[] args);
bool HasCategory(PluralCategory category);
}

public class Singular : IString
{
private string Text;

public string GetString(PluralCategory category, params object[] args)
{
if (category == PluralCategory.None)
{
if (Text == null || args == null || args.Length == 0)
{
return Text;
}
return string.Format(Text, args);
}
return null;
}

public bool HasCategory(PluralCategory category)
{
return category == PluralCategory.None;
}
}

public class Plural : IString
{
private Dictionary<PluralCategory, string> Texts = new Dictionary<PluralCategory, string>();

public string GetString(PluralCategory category, params object[] args)
{
string text;
if (Texts.TryGetValue(category, out text))
{
if (text == null || args == null || args.Length == 0)
{
return text;
}
return string.Format(text, args);
}
return null;
}

public bool HasCategory(PluralCategory category)
{
return Texts.ContainsKey(category);
}
}

最佳答案

你是对的,在这种情况下抛出 NotSupportedException 并不是一个好主意。通常,您实现一个接口(interface)是为了提供一组通用操作,这些操作“统一”一组不同的类,为一组通用操作提供不同的实现。

但是,在您的情况下,不同的类无法“统一”:它们不仅保留了自己的实现,还保留了自己的接口(interface)。当您尝试统一使用它们时,代码会抛出异常。与将它们保留为 object 相比,通用接口(interface)并不能为您提供那么多 - 用户在进行调用之前必须知道 IString 背后的类,否则他们可能会看到NotSupportedException

有几种方法可以解决这个问题:一种方法是统一单数和复数方法,返回比简单的 string 更复杂的答案:

public enum SingularOrPluralCategory {
Singular,
// The rest of the PluralCategory enum values
}
public class StringForm {
public string Text {get; private set;}
public SingularOrPluralCategory Category {get; private set;}
}
public interface IString {
// You may want to omit the setter from the interface, adding it to the class instead
void SetForm(SingularOrPluralCategory category, string plural);
StringForm GetForm(SingularOrPluralCategory category, params object[] args);
}

现在单数实现将返回 StringForm,在 Category 中具有 Singular 值,而复数实现将返回 StringForm 具有多个复数类别之一。尝试在 IString 的单数子类上设置复数类别可能仍然是一个错误,但您可以通过将 setter 移到类上来解决这个问题,从而无法调用带有类别的 setter IString 的单一子类。

关于c# - 什么时候使用 NotSupportedException 不好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18049187/

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