c#中由其他对象组成的对象的优雅方式

时间:2015-07-19 06:22:55

标签: c# oop exception design-patterns

如果你有一个由一堆其他对象组成的对象,即:

class A{
  B b {get;}
  C c {get;}
  private A(){
    b = B.Make();
    c = C.Make();
  }
}

BC被设置为在抛出异常时返回null,有没有比在A成员中对null进行质量检查更好的方法它也失败了吗?

不可否认,我对异常管理的理解很差,但BC无法处理自己的异常,而是让它们冒泡到A,从而规避整个零惨败。但是,如果他们的课程使用独立于A

,该怎么办?

2 个答案:

答案 0 :(得分:1)

通常应该避免返回null,Make()函数应该抛出异常。如果它们的异常级别太低,则应将它们包含在自定义异常中或替换为自定义异常。

现在调用者(A)可以将Make()调用放在try-catch块中以再次替换他自己的异常,但是他没有必要,你不需要处理null-检查。

答案 1 :(得分:0)

  

不可否认,我对异常管理的理解很差,但是B和C不能处理自己的异常,而是让它们冒泡到A,从而绕过整个零惨败。但是,如果他们的课程使用独立于A?

如果B和C能够以有意义的方式从错误中恢复,那么他们处理自己的错误并没有错。例如,如果必须连接到服务器,并且未能这样做,他们可以继续尝试而不必抛出错误。虽然显然你想要某种方式来表示他们的连接状态。

那对A班来说意味着什么呢?这取决于A是否需要成功创建的B和C被认为处于有效状态。 如果A需要B或C,那么在这种情况下(没有抛出错误)将由A来检测它是否处于有效状态,并抛出(或以其他方式处理错误)以便创建A的任何东西都是意识到A无效。 如果A不需要B或C,那么在这种情况下就像B和C一样,你不必抛出(A是有效的),但是B和/或C是null,你必须检查它的访问权限

底线是B和C的行为应该对B和C有意义。如果它们应该抛出,它们应该抛出。 然后你应该担心A. A的行为对A来说同样有意义。

你似乎担心必须检查null,但是你采取的路径(扔,没扔)你必须检查某事。要么检查null,要么包装try catch。

您可能还想考虑重新设计A类。也许这是一个有争议的问题。 为什么B和C包含在A类中?也许你可以简单地将B和C传递给需要B或C的A的公共方法?