我有一个简单的问题(我希望):)
在对数据执行CRUD操作时,我几乎总是使用void作为“返回”类型。
EG。请考虑以下代码:
public void Insert(IAuctionItem item) {
if (item == null) {
AuctionLogger.LogException(new ArgumentNullException("item is null"));
}
_dataStore.DataContext.AuctionItems.InsertOnSubmit((AuctionItem)item);
_dataStore.DataContext.SubmitChanges();
}
然后考虑这段代码:
public bool Insert(IAuctionItem item) {
if (item == null) {
AuctionLogger.LogException(new ArgumentNullException("item is null"));
}
_dataStore.DataContext.AuctionItems.InsertOnSubmit((AuctionItem)item);
_dataStore.DataContext.SubmitChanges();
return true;
}
实际上,这只取决于你是否应该通知插入的东西(并且进展顺利)?
答案 0 :(得分:15)
我通常选择那里的第一个选项。
鉴于您的代码,如果插入出现问题,则会抛出异常。
由于数据访问代码周围没有try / catch块,因此调用代码必须处理该异常...因此它将知道它是否以及为什么失败。如果您刚刚返回true / false,则调用代码将不知道为什么会出现故障(可能会或可能不关心)。
答案 1 :(得分:1)
我认为如果在“item == null”的情况下返回“false”会更有意义。这表明这是一个你希望不经常发生的情况,因此你不希望它引发异常,但调用代码可以处理“false”返回值。
按照它的标准,你会返回“true”或者会有一个例外 - 这对你没什么帮助。
答案 2 :(得分:1)
不要打击您碰巧遇到的框架。如果您正在编写C代码,其中返回值是最常见的错误通信机制(缺少更好的内置构造),请使用它。
.NET基类库使用异常来传达错误,它们的缺失意味着一切正常。因为几乎所有代码都使用BCL,所以大部分代码都会被编写为期望异常,除非它被写入库,就好像C#是C而不支持Exceptions,每个调用都需要包装在if(!myObject)中.DoSomething){System.Writeline(“该死的”);}阻止。
对于下一个开发人员使用你的代码(可能是你几年后忘记了你最初的代码),开始编写所有调用代码以利用错误将是一件痛苦的事。条件作为返回值传递,作为输出参数中的值的更改,作为自定义事件,作为回调,作为队列消息或任何其他可想象的方式来传达失败或缺少。
答案 3 :(得分:0)
我认为这取决于。用户想要在论坛上添加新帖子的图像。由于某种原因,添加失败,如果你不告诉用户,他们永远不会知道错误。最好的方法是为他们抛出另一个带有好消息的异常
如果它与用户无关,并且您已经将其记录到数据库日志中,那么您不应该关心是否返回
答案 4 :(得分:0)
我认为如果操作进展顺利,通知用户是个好主意。无论您测试代码的程度如何,并尝试开箱即用,最有可能的是,在软件存在的过程中,软件会遇到您不能满足的问题,从而使其行为不正确。我认为,通知的使用允许用户采取行动,如果你喜欢程序失败,可以使用某种计划B.此操作可以是简单的解决方法,也可以通知IT部门的人员,以便他们可以修复它。 我宁可点击那个额外的“确定”按钮,也不要知道出现问题时为时已晚。
答案 5 :(得分:0)
你应该坚持使用void,如果你需要更多的数据 - 使用变量,因为你需要特定的数据(并且它可以是多个数字/字符串),并且激励机制是一个很好的处理解决方案错误。
所以..如果你想知道受影响的行数,如果sp返回了某些内容...... - 返回类型将限制你...