2

假设我有双倍长度,它可以是真实长度,也可以是尚未准备好,因为我们在服务器中还没有长度,也没有任何东西可以发送给客户端。我们需要将此长度从服务器传递给客户端,作为固定数据协议的一部分。客户端当前只使用一次长度,但将来可能会使用更多。

  1. 通过 double length 和 bool isLengthValid,并在每个使用长度的地方,检查是否 isLengthValid -没有混合数据类型的清洁设计,但用户必须记住检查

  2. 双传?长度,并且在您使用长度的每个地方,检查长度==空 - 设计是否清晰(因为它是可空的),但如果您查看和类型。另外——如果有人在没有检查的情况下使用也会有例外(好与坏,取决于你如何看待它)

  3. 制作一个类 Length 而不是 double。该类将具有 GetLengthIfYouCheckedIt 或其他内容的清晰接口。可读性很强,很难出错,但设计有点过头了。

你的解决方案是什么?

4

5 回答 5

3

我说选项2:

  • 您想要的正是引入可空值的原因。
  • 与其添加方法来检查它是否是有效数字,不如使用内置的Nullable<double>.HasValue,就像它本来的意思一样。
  • 为 Length 创建一个类使其双重封闭:它仅适用于 LENGTH 并且它拥有一个Double. DateTime想想你必须为 TIME/ 、 MONEY/等创建和维护多少这样的类Decimal。它永远不会结束。
  • 选项 1 只是您自己Nullable<T>用另一个名称滚动重新包装。

换句话说,执行 DRY 原则,并使用Nullable<T>;)

高温下,

呸。

于 2012-07-02T11:26:52.583 回答
2

我会通过一个double?. 这本质上是一个双精度值 + 一个布尔值,表示它是否有效,因此使用 1) 选项只会重新发明可空值。我认为 3) 选项是矫枉过正。

于 2012-07-02T11:21:53.090 回答
2

我的建议是使用可空的像这个公共双精度?长度;

您将获得诸如 Length.HasValue 和 Length.Value 之类的方法,这将使代码易于阅读和更快地使用(我的意思是无需为您更快地编写新类等)

于 2012-07-02T11:39:18.630 回答
0

为什么不将其保留为长度参数而是返回-1

于 2012-07-02T11:19:45.710 回答
0

如果可能的话,我建议使请求异步,以便在数据实际准备好之前不要向客户端返回任何内容。

如果这不可能,请使用第二个选项。

于 2012-07-02T11:53:03.433 回答