FindById()的优点。
面向未来:如果你下手Find(int)
,后来有增加其他的方法(FindByName(string)
,FindByLegacyId(int)
,FindByCustomerId(int)
,FindByOrderId(int)
,等),我这样的人往往要花费年龄寻找 FindById(int)
。如果您可以并且一旦有必要就将其更改Find(int)
为不是真正的问题FindById(int)
- 如果 s,则将来的证明就是这些。
更容易阅读。Find
是完全正常的,如果呼叫貌似record = Find(customerId);
又FindById
是读书,如果是稍微容易record = FindById(AFunction());
。
一致性。您可以在任何地方始终使用FindByX(int)
/ FindByY(int)
模式,但是Find(int X)
/ Find(int Y)
不可能,因为它们会发生冲突。
Find()的优点
- 吻。
Find
非常简单明了,并且operator[]
它是此上下文中2个最值得期待的函数名称之一。(根据上下文get
,一些流行的替代方法是,lookup
或fetch
)。
- 根据经验,如果函数名称是一个众所周知的单词,可以准确地描述该函数的功能,请使用它。即使存在更长的多词名称,它在描述函数功能方面也会稍好一些。示例:长度 vs NumberOfElements。需要权衡取舍,如何划定界线仍在进行辩论。
- 通常最好避免冗余。如果看一下
FindById(int id)
,我们可以很容易地通过将其更改为来消除冗余Find(int id)
,但是这是一个折衷方案-我们失去了一些清晰度。
另外,通过使用强类型Id,您可以同时获得两者的优点:
CustomerRecord Find(Id<Customer> id)
// Or, depending on local coding standards
CustomerRecord Find(CustomerId id)
实现Id<>
:在C#中强键入ID值
此处以及上面的链接中的评论引起Id<Customer>
了我要解决的多个问题:
- 关注点1:这是泛型的滥用。
CustomerId
和OrderID
是不同的类型(customerId1 = customerId2;
=>好,customerId1 = orderId1;
=>坏),但是它们的实现几乎相同,因此我们可以使用复制粘贴或元编程来实现它们。虽然在讨论中有关于暴露或隐藏泛型的价值,但是元编程是泛型的用途。
- 关注点2:这不会停止简单的错误/这是解决问题的解决方案通过使用强类型Id消除的主要问题是对的调用中的错误参数顺序
DoSomething(int customerId, int orderId, int productId)
。强类型的ID还可以防止其他问题,包括被问到的一个OP。
- 问题3:它实际上只是使代码模糊。很难确定ID是否保留在中
int aVariable
。容易知道ID保留在中Id<Customer> aVariable
,我们甚至可以说这是客户ID。
- 问题4:这些ID不是强类型,只是包装器。
String
只是一个包装byte[]
。包装或封装与强类型没有冲突。
- 关注点5:设计过度。下面是最小的版本,虽然我不建议加
operator==
和operator!=
为好,如果你不想完全依赖于Equals
:
。
public struct Id<T>: {
private readonly int _value ;
public Id(int value) { _value = value; }
public static explicit operator int(Id<T> id) { return id._value; }
}
T Find<T>(string name)
或者(int size)
您打算如何解决不可避免的问题?