Интерфейсы для строковых классов обычно имеют метод с именем IsEmpty
(VCL) или empty
(STL). Это абсолютно разумно, потому что это особый случай, но код, который использует эти методы, часто должен отрицать этот предикат, что приводит к "оптическому (и даже психологическому) служебным > (восклицательный знак не очень очевиден, особенно после открытия скобки). См., Например, этот (упрощенный) код:
/// format an optional time specification for output
std::string fmtTime(const std::string& start, const std::string& end)
{
std::string time;
if (!start.empty() || !end.empty()) {
if (!start.empty() && !end.empty()) {
time = "from "+start+" to "+end;
} else {
if (end.empty()) {
time = "since "+start;
} else {
time = "until "+end;
}
}
}
return time;
}
Он имеет четыре отрицания, потому что пустые случаи - это те, которые нужно пропустить. Я часто наблюдаю подобное отрицание, также при разработке интерфейсов, и это не большая проблема, но это раздражает. Я только хочу поддержать написание понятного и легко читаемого кода. Надеюсь, вы поймете мою мысль.
Возможно, меня поразила только слепота: как бы вы решили эту проблему?
Изменить:. Прочитав некоторые комментарии, я думаю, что необходимо сказать, что исходный код использует класс System::AnsiString
VCL. Этот класс предоставляет метод IsEmpty
, который очень читаем:
if (text.IsEmpty()) { /* ... */ } // read: if text is empty ...
если не отрицается:
if (!text.IsEmpty()) { /* ... */} // read: if not text is empty ...
... вместо того, чтобы текст не был пустым. Я думаю, что буквальное is
было лучше оставить читателю фантазию, чтобы позволить отрицанию работать хорошо. Хорошо, может быть, не повсеместная проблема...