【问题标题】:How to model a duration in an object oriented way?如何以面向对象的方式对持续时间进行建模?
【发布时间】:2011-01-22 06:41:08
【问题描述】:

我正在处理使用整数来模拟持续时间的不同 API。只有他们似乎无法就单位达成一致。有时是几秒钟,有时是几毫秒。

到目前为止,我能找到的避免错误的最佳方法是使用匈牙利符号:durationInMillis、durationInSeconds 等。

这让我想知道是否没有更好的、真正面向对象的方式来建模持续时间?允许类型系统帮助我避免错误的东西,我错误地将持续时间(以毫秒为单位)视为持续时间是秒,反之亦然。

【问题讨论】:

    标签: oop hungarian-notation


    【解决方案1】:

    在 Apple 的 Cocoa 中,持续时间的类型为 NSTimeInterval,并定义为双精度:

    typedef double NSTimeInterval;
    

    它以秒为单位,在 10000 年内具有亚毫秒精度。

    【讨论】:

      【解决方案2】:

      只需给每个持续时间一个单独的类,并使用毫秒作为计算中使用的权威形式——即,在你的两个类中重载函数 getMilliSeconds()

      class Duration
      {
      ...
          virtual const unsigned long long getMilliSeconds() const;
      ...
      }
      
      class MilliSeconds : public Duration
      {
      ...
      };
      
      class Seconds : public Duration
      {
      ...
      };
      

      尽管您可能想要更好的粒度,但纳秒可能是更好的权威表示。无论如何,添加较低粒度的类不会成为问题——例如,几小时或几天。

      编辑:您可能想查看boost::date_time 以获取灵感,这是令人着迷的阅读。

      【讨论】:

        【解决方案3】:

        当然有:创建一个代表持续时间的类,并抛出几个工厂方法以从秒和毫秒创建Duration 类的实例:

        class Duration
        {
            public static Duration FromSeconds(int seconds)
            {
                // ...
            }
        
            public static Duration FromMilliseconds(int milliseconds)
            {
                // ...
            }        
        }
        

        此类应提供单个(最好是只读)属性——例如,Milliseconds,它将返回封装在特定实例中的毫秒数。

        此外,您还可以拥有Seconds 属性。

        我会在此处避免使用任何隐式转换运算符(如果您的编译器允许使用),因为它们只会使问题复杂化。

        您可以查看 TimeSpan 以获取灵感(或者完全使用它,如果您使用 .NET)。

        【讨论】:

        • 我用谷歌搜索了它,但我找不到与您的匹配的值对象模式的定义。你有消息来源吗?
        猜你喜欢
        • 2014-08-09
        • 1970-01-01
        • 2011-01-15
        • 2020-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-10
        • 2018-09-28
        相关资源
        最近更新 更多