代码之家  ›  专栏  ›  技术社区  ›  KaptajnKold

如何以面向对象的方式建模持续时间?

  •  1
  • KaptajnKold  · 技术社区  · 15 年前

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

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

    这让我想知道是否没有一个更好的,真正的OO建模方式持续时间?允许类型系统帮助我避免错误的东西,在这种情况下,我错误地将以毫秒为单位的持续时间视为秒,反之亦然。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Hassan Syed    15 年前

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

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

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

    编辑: 你可能想看看 boost::date_time 对于灵感来说,这是一种引人入胜的阅读。

        2
  •  2
  •   Anton Gogolev    15 年前

    当然有:创建一个表示持续时间的类,并抛出两个工厂方法来创建 Duration 从秒和毫秒初始化:

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

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

    另外,你可以 Seconds 财产。

    这里我将避免使用任何隐式转换操作符(如果编译器允许的话),因为它们只会使这里的问题复杂化。

    你可以看看 TimeSpan 为了灵感(或者如果你在.NET上的话,一起使用它)。

        3
  •  0
  •   mouviciel    15 年前

    在苹果的可可中,持续时间的类型是 NSTimeInterval 定义为双:

    typedef double NSTimeInterval;
    

    它以秒为单位表示,在10000年的时间内,其精度低于毫秒。

    推荐文章