سؤال

أنا أتعامل مع واجهات برمجة التطبيقات المختلفة التي تستخدم الأعداد الصحيحة إلى مدة النموذج. فقط لا يمكن أن يتفقوا على الوحدات. في بعض الأحيان تكون ثوانٍ وأحيانًا تكون مللي ثانية.

حتى الآن أفضل طريقة لتجنب الأخطاء التي تمكنت من العثور عليها ، هي استخدام التدوين المجري: الموقّر ، المترونسيونسيون وما إلى ذلك.

يجعلني أتساءل عما إذا لم تكن هناك طريقة أفضل ، حقًا في مدة النمذجة؟ شيء من شأنه أن يسمح لنظام النوع بمساعدتي في تجنب الأخطاء التي أتعامل فيها عن طريق الخطأ في المدة بالميلي ثانية لأن المدة هي الثواني والعكس بالعكس.

هل كانت مفيدة؟

المحلول

ما عليك سوى إعطاء كل مدة فئة منفصلة واستخدم المللي ثانية كنموذج موثوق المستخدم في الحسابات - أي وظيفة التحميل الزائد getMilliSeconds() في كل من فصولك.

class Duration
{
...
    virtual const unsigned long long getMilliSeconds() const;
...
}

class MilliSeconds : public Duration
{
...
};

class Seconds : public Duration
{
...
};

على الرغم من أنك قد ترغب في تحبيب أفضل ، لذلك قد تكون النانوسية تمثيلًا موثوقًا أفضل. على أي حال ، فإن إضافة فئات من الحبيبات المنخفضة لن تكون مشكلة - على سبيل المثال ، ساعات أو أيام.

تعديل: قد ترغب في النظر إلى Boost :: Date_time للإلهام ، إنها قراءة رائعة.

نصائح أخرى

بالتأكيد هناك: إنشاء فئة تمثل المدة ورمي بطريقتين من المصنع لإنشاء مثيل Duration الفصل من ثواني وميلي ثانية:

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

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

يجب أن توفر هذه الفئة خاصية واحدة (ويفضل للقراءة فقط)-على سبيل المثال ، Milliseconds, ، والتي ستعيد عددًا من المللي ثانية مغلفة في حالة معينة.

بالإضافة إلى ذلك ، يمكنك الحصول Seconds منشأه.

سأتجنب أي مشغلي تحويل ضمني هنا (إذا سمح المترجم الخاص بك لهم) لأنهم سيعقدون الأمور هنا فقط.

يمكنك إلقاء نظرة على TimeSpan للإلهام (أو استخدمه تمامًا ، إذا كنت على .NET).

في الكاكاو في Apple ، يكون نوع الفترات NSTimeInterval ويتم تعريفه على أنه مزدوج:

typedef double NSTimeInterval;

يتم التعبير عنه في ثوانٍ ولديه دقة من طراز Milli-Second أكثر من 10000 عام.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top