我正在为类似存储库的抽象开发API。我有两种方法:
// Throws an exception if object cannot be found
MyObj Get(MyIdType id);
// Returns false if object cannot be found; no exception
bool TryGet(out MyObj obj);
需要第三个变体:如果无法找到对象,则返回null,并且不会抛出异常。
// Returns null if object cannot be found; no exception
MyObj ?????(MyIdType id);
我被困在什么名字上。 GetOrDefault 已被排除为混乱。已提出 GetIfNotNull ,但似乎也不清楚。到目前为止, GetOrNull 是最有希望的。
有没有人有任何其他建议,或者知道我可以遵循哪些公约API?
答案 0 :(得分:3)
我会选择在两种情况下没有表现不同的Get方法。为什么不让所有情况下的Get返回null。为什么要抛出异常呢?
如果需要,如果返回null值,我会选择将其留给用户代码抛出异常。
有关何时抛出异常的进一步指导,请参阅this question。
答案 1 :(得分:2)
我会根据LINQ扩展方法GetOrDefault
使用FirstOrDefault
(正如您自己建议的那样)。
虽然GetValue
和GetValueOrDefault
听起来会更好。
答案 2 :(得分:1)
如何:GetOrDefault
...OrDefault
在LINQ中是相当标准的。
答案 3 :(得分:0)
在我看来,你应该坚持:
MyObj Get(MyIdType id);
不要在此处抛出异常,只需返回null
即可。 如果明确要求抛出异常或,可选择null
,我会尝试:
MyObj Get (MyIdType id, bool ReturnDefault = false) // if .net 4
我并不特别喜欢这个选项 - 但有时候要求会超越我们认为正确或自然的感觉。
答案 4 :(得分:0)
您可以尝试GetObjectOrReturnDefaultValue
或者,因为您知道它是引用类型GetObjectOrReturnNull
。这很长很难看,但并不含糊。
答案 5 :(得分:0)
我只会在bool TryGetXXXXX(out T value)
上保留interface
个变体,并将其余部分作为扩展方法提供给它。它使您的界面本身非常紧凑,但同时也像客户想要的那样有用。