bool TryGetX(out X x) 模式的替代方案
Alternatives to bool TryGetX(out X x) pattern
我经常使用模式
bool TryGetX(out X x)
当我需要从可能失败的服务中获取数据时。当客户端和服务在尝试检索数据之前都不知道数据是否可用时,我会使用它。我从来没有对以这种方式使用 out 参数感到完全满意,而且我从其他 SO 问题中看到它被认为是一种糟糕的模式。
但是,我还没有看到一个令人信服的替代方案 API 来提示客户他们的方法调用实际上可能 return 数据。
我考虑过的备选方案:
X GetX(),其中 GetX() returns null 如果服务不能提供请求的数据。我不喜欢这样做,因为很多人不清楚他们是否需要检查 null 是否被 returned。考虑到我在处理过的遗留代码中遇到的空引用异常的数量,人们通常会忽略空检查,并且用户会看到一个丑陋的异常框。至少 TryGetX 方法让客户清楚数据可能不会被 returned。即使他们确实检查了 null,是否需要 if (x == null) 真的比 TryGetX(out X x) 更好?
Try/Catch,其中 GetX() 如果无法 returned 则抛出异常。同样,客户可能没有意识到 GetX() 抛出异常,即使他们意识到了,代码周围也有 Try/Catches。
GetXResult GetX(),其中 class GetXResult 有两个属性:bool Success 和X x。这可能是我更喜欢的选择,但是我有很多结果 classes 浮动,使我的项目混乱。
对于 return 数据但可能无法 return 请求的数据的方法,最佳方法是什么?
最佳方法取决于问题,我怀疑是否存在适合所有问题的 'best' 方法。
X GetX(), where GetX() returns null if the service cannot provide the
requested data.
如果服务需要 return 的所有类型都是 Nullable 并且可以与所有这些类型的方法保持某种一致性,那么这根本不是一个坏方法。为了向客户澄清'null' return,您可以在方法名称中包含'Try'(文档也有助于客户)。
Try/Catch, where GetX() throws an exception if the data cannot be
returned.
抛或不抛异常是服务架构应该做的决定。如果您选择在该级别为所有需要的方法抛出异常,这种方法也可以正常工作。 (使用文档通知客户)。
GetXResult GetX(), where the class GetXResult has two properties: bool
Success and X x.
为了解决 'too many classes' 问题,只需使用泛型:
sealed class Result<T> {
private bool success = false;
private T value;
private Result() {
}
public Result(T value) {
this.success = true;
this.value = value;
}
public static Result<T> Failure() {
return new Result<T>();
}
public bool Success {
get {
return this.success;
}
}
public T Value {
get {
if (!this.success) {
throw new InvalidOperationException();
}
return this.value;
}
}
}
我经常使用模式
bool TryGetX(out X x)
当我需要从可能失败的服务中获取数据时。当客户端和服务在尝试检索数据之前都不知道数据是否可用时,我会使用它。我从来没有对以这种方式使用 out 参数感到完全满意,而且我从其他 SO 问题中看到它被认为是一种糟糕的模式。
但是,我还没有看到一个令人信服的替代方案 API 来提示客户他们的方法调用实际上可能 return 数据。
我考虑过的备选方案:
X GetX(),其中 GetX() returns null 如果服务不能提供请求的数据。我不喜欢这样做,因为很多人不清楚他们是否需要检查 null 是否被 returned。考虑到我在处理过的遗留代码中遇到的空引用异常的数量,人们通常会忽略空检查,并且用户会看到一个丑陋的异常框。至少 TryGetX 方法让客户清楚数据可能不会被 returned。即使他们确实检查了 null,是否需要 if (x == null) 真的比 TryGetX(out X x) 更好?
Try/Catch,其中 GetX() 如果无法 returned 则抛出异常。同样,客户可能没有意识到 GetX() 抛出异常,即使他们意识到了,代码周围也有 Try/Catches。
GetXResult GetX(),其中 class GetXResult 有两个属性:bool Success 和X x。这可能是我更喜欢的选择,但是我有很多结果 classes 浮动,使我的项目混乱。
对于 return 数据但可能无法 return 请求的数据的方法,最佳方法是什么?
最佳方法取决于问题,我怀疑是否存在适合所有问题的 'best' 方法。
X GetX(), where GetX() returns null if the service cannot provide the requested data.
如果服务需要 return 的所有类型都是 Nullable 并且可以与所有这些类型的方法保持某种一致性,那么这根本不是一个坏方法。为了向客户澄清'null' return,您可以在方法名称中包含'Try'(文档也有助于客户)。
Try/Catch, where GetX() throws an exception if the data cannot be returned.
抛或不抛异常是服务架构应该做的决定。如果您选择在该级别为所有需要的方法抛出异常,这种方法也可以正常工作。 (使用文档通知客户)。
GetXResult GetX(), where the class GetXResult has two properties: bool Success and X x.
为了解决 'too many classes' 问题,只需使用泛型:
sealed class Result<T> {
private bool success = false;
private T value;
private Result() {
}
public Result(T value) {
this.success = true;
this.value = value;
}
public static Result<T> Failure() {
return new Result<T>();
}
public bool Success {
get {
return this.success;
}
}
public T Value {
get {
if (!this.success) {
throw new InvalidOperationException();
}
return this.value;
}
}
}