【发布时间】:2008-10-06 11:43:39
【问题描述】:
很多时候你有一个接口接受具有不同领域逻辑含义的相似类型参数:
public static class Database
{
public static bool HasAccess(string userId, string documentId) { return true; }
}
现在很容易让某人键入 documentId 而不是 userId,反之亦然。可以通过抽象参数的数据类型来防止这种情况发生:
public class UserId
{
public string Value { get; internal set; }
public static implicit operator string(UserId id) { return id.Value; }
}
public class DocumentId
{
public string Value { get; internal set; }
public static implicit operator string(DocumentId id) { return id.Value; }
}
public static class Database
{
public static bool HasAccess(UserId userId, DocumentId documentId) { return true; }
}
这样,如果你乱序输入参数,你会得到一个很好的编译器警告:
UserId e = new UserId() { Value = "a" };
DocumentId d = new DocumentId() { Value = "b" };
Database.HasAccess(d, e);
您还可以在不影响系统其余部分的情况下更改抽象类型,但这不太可能。抽象类型是获得更多类型安全性的好主意吗?
该问题与 C# 解决方案有关,但欢迎使用其他语言进行简短描述。
编辑:从字符串中删除了隐式转换并将手指指向 C# 标记。
【问题讨论】:
-
但是 Database.HasAccess("a","b") 仍然有效......我怀疑大多数调用者会比你的包装器更有可能使用字符串,从而取消了目的。
-
同意。我可以删除隐式字符串以进行类型转换。
标签: c# design-patterns