В поисках семантической корректности
От: Нахлобуч Великобритания https://hglabhq.com
Дата: 18.05.05 13:02
Оценка:
Я тут в этих самых "поисках" и пребываю, собственно. Очень, надо сказать, гадостная вешь. К примеру:

class Discount
{
    // ...
public:
    //
    // Initializing constructor
    // product - reference to Product object
    // discount - discount (must be in percent)
    Discount(const Business::Product &product, double discount)
    {
        // ...
    }
};

Ключевые слова выделены и неоднократно обдуманы, ибо, как я уже говорил, вопрос довольно гнусный. Ну во-первых, "на уровне языка" не гарантируется то, что в discount запишут именно семантически/логически верное значение скидки (в данном случае — [0; 100]). И ладно бы если это ошибка пользователя — ее, в большинстве случаев, можно отловать и надавать по рукам. Программист и сам может ошибиться (и ошибется — полагаться на комментарии перед методом, мягко говоря, не стоит) — а это дебаггинг, тра-та-та.
Второе — это поддержка. Вот месяцев через m открою я Solution, посмотрю на все эти числа, взгрустну... Ну, идея ясна. Может быть я преувеличиваю масштабы трагедии, но все же — в моем случае, по крайней мере — это актуально.
В общем, придумалось мне такое вот решение. Это, во-первых, только идея. Во-вторых, стало мне интересно, велосипед ли я изобрел или что.

template <class Type, long TypeDiscriminator>
class generic_unit
{
    // Value type
    typedef Type value_type;
    // Value
    value_type m_vValue;
public:
    //
    // Default public constructor
    generic_unit(void) :
        m_vValue(0)
    { }

    //
    // Explicit initializing constructor
    explicit generic_unit(value_type vValue) :
        m_vValue(vValue)
    { }

    //
    // Conversion to Type
    operator Type (void) const
    { return m_vValue; }
};

Соответственно, с использованием сего "творения" предыдущий кусок кода перепишется как

// Разные TypeDiscriminator'ы - разные типы.
typedef generic_unit<double, 1> Percent;
typedef generic_uint<double, 2> NativeCurrency;

class Discount
{
    // ...
public:
    //
    // Initializing constructor
    // product - reference to Product object
    // discount - discount (must be in percent)
    Discount(const Business::Product &product, Percent discount)
    {
        // ...
    }
};

Использует кто-нибудь что-нибудь подобное?
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
HgLab: Mercurial Server and Repository Management for Windows
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.