Это хорошая практика для использования assert () в мутаторах класса? - PullRequest
1 голос
/ 13 июня 2010

Например:

void Date::month(unsigned int inMonth) {
    assert(inMonth <= 12);
    _month = inMonth;
}

Если это не очень хорошая практика, как правильно это сделать?

Ответы [ 4 ]

4 голосов
/ 13 июня 2010

Вы не должны использовать assert, чтобы убедиться, что аргумент public функции-члена действителен.Причина в том, что клиенты вашего класса не могут каким-либо осмысленным образом реагировать на неудачное утверждение (тот факт, что утверждения удаляются из сборок релиза, тоже не помогает).

Как правило, assert следует использовать только для вещей, которые строго находятся под вашим контролем (например, аргумент частного метода).

В этом случае вам лучше создать исключение std :: invalid_argument :

void Date::month(unsigned int month) 
{
    if(month == 0 || month > 12)
    {
        throw std::invalid_argument("a month must be in the [1-12] range"); 
    }
    _month = month;
}
1 голос
/ 13 июня 2010

Другим способом, который также делает код более читабельным, было бы определение перечислимого типа для месяца:

enum e_Month {
   e_Month_January,
   e_Month_February, 
   e_Month_March, 
   // etc..
   e_Month_December
};

Теперь ваше присваивание становится:

void Date::month(e_Month inMonth) { _month = inMonth; }

Большинство компиляторов вызовут ошибкудля присвоения enum другого типа, чтобы вы получили безопасность времени компиляции, чтобы он всегда был в диапазоне.

1 голос
/ 13 июня 2010

Да, это так.

Это верный путь.

Хотя я бы назвал это setMonth(), а не month()

Также следует помнить, что assert() преобразуется в ничто в релизных сборках.так что если вы хотите что-то, что также работает в релизе, то либо напишите свое собственное утверждение, либо сделайте правильную проверку во время выполнения.

0 голосов
/ 13 июня 2010

Это нормально, вы можете утверждать, что это неожиданный ввод в вашем приложении. Кроме того, добавьте исключение, например ArgumentException, поскольку вы не хотите устанавливать недопустимое значение месяца.

...