我正在建立一个本地化目录并遇到了设计问题。目前,目录使用
这个设计的要求是,键必须对单数和复数都是唯一的,但我认为实现非关联方法并抛出NotSupportedException不好。
第二种设计是为了进行键检查而存储一个
那么,你怎么想?我的第一个想法使用
编辑:根据@dasblinkenlight的想法,一种更清晰的解决方案是将获取
Dictionary<string, IString>
存储翻译,其中 IString
可以是两种类型之一: Singular
或 Plural
。这是 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));
}
}
这个设计的要求是,键必须对单数和复数都是唯一的,但我认为实现非关联方法并抛出NotSupportedException不好。
第二种设计是为了进行键检查而存储一个
Dictionary<string, StringType>
,其中StringType
是一个枚举类型,并且有两个额外的字典Dictionary<string, Singular>
和Dictionary<string, Plural>
,根据StringType
的值选择使用。这使得它稍微复杂了一些,但不会破坏接口的概念。那么,你怎么想?我的第一个想法使用
NotSupportedException
是不好的吗?我应该选择第二种设计还是其他什么东西?编辑:根据@dasblinkenlight的想法,一种更清晰的解决方案是将获取
Singular
或Plural
的接口方法统一为单个方法。Singulars只有一个PluralCategory.None
,而Plurals绝不允许包含此类别。这由setter方法限制,不在接口中定义,而是由特定实现定义(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);
}
}