我继承了一个WCF服务,它充当文件缓存(每个文件代表对第三方API的请求结果)。目前,如果文件不存在,代码会创建一个新的请求来创建数据,并且还会引发客户端代码的异常。
我认为这个想法是客户端会再次请求文件,然后它们就可以使用了(生成文件需要几秒钟)。
我认为这里有代码味道,我应该重写这一部分。目前,异常被捕获并通过几种方法冒出来。我想我应该在源头建立文件是否存在并将该信息传递给调用堆栈。
在WCF界面,我目前有一个GetValue()
方法,虽然有两个选项,我认为我可以用来替换它:
null
。bool TryGetValue(string key, out string value)
方法有没有人有任何偏好/推荐?
由于
答案 0 :(得分:1)
“TryGet”方法更加明确。使用null返回方法,您必须记录该方法因此而返回null,这需要开发人员阅读文档。众所周知,有些人对阅读文档过敏。
“TryGet”方法的另一个优点是,您可以使用枚举而不是bool,为调用者提供有关该方法失败(或成功)的原因和方式的更多信息。
Jeffrey Richter(C#中的CLR)异常定义:当一个动作成员无法完成其任务时,该成员应该抛出异常。异常意味着操作成员未能完成其应执行的任务,如其名称所示。我的问题是我应该为客户端保留GetValue方法,并在数据不可用时引发错误或将其删除并用TryGetValue()替换它?
当您确定API的设计时,Jeffrey Richter的定义没有用,因为这包括确定每个操作成员的任务应该是什么。
在您的设计中,您当然希望价值不可用;这意味着对于值不可用而言并非特殊情况。因此我只使用 TryGet ...模式。
但是,说实话,我会采取完全不同的方法。假设有人尝试这种方法:
while (!TryGetValue(key, out value)) {}
或:
SomeType value;
bool flag = false;
while (!flag)
{
try
{
value = GetValue(key);
flag = true;
}
catch {}
}
您的WCF服务将获得大量点击。查看异步模型可能会更好,因此在结果准备好时通过回调通知客户端,而不是邀请客户端不断轮询服务。