Интерфейсы должны быть точно и строго типизированы
Интерфейсы должны быть точно и строго типизированы.
Интерфейсы описывают поведение или возможности объекта. Точно и строго типизированные интерфейсы определяют назначение и свойства своих параметров, используя параметры, которые являются пользовательскими объектами и шаблонами, а не фундаментальными типами. Сравните интерфейсы в этом фрагменте кода:
void draw_circle(float R, float x, float y); void draw_circle(Length R, Position O);
Length и еще один объект класса Position в качестве входных параметров.
Второй интерфейс делает явным, что первый параметр является длиной, а второй параметр является позицией. Этот интерфейс легко понять и использовать, поскольку он выделяет требуемые входные параметры и их порядок для определенного круга. Напротив, невозможно определить входные параметры или их порядок в первом интерфейсе, поскольку непонятно, как три плавающих числа соотносятся с окружностью.
Компилятор проверяет аргументы по типам входных параметров во время компиляции. Если случайно поместить входные параметры второго интерфейса в неправильный порядок, компилятор отметит несовпадающие параметры во время компиляции. Если все три входных параметра первого интерфейса являются числами с плавающей запятой, компилятор не может проверить правильность порядка ввода.
Определение классов Length и Position можно указать единицы измерения этих параметров, например см или мм. Определения классов также могут указывать, являются ли эти параметры неизменяемыми. При использовании фундаментальных типов в качестве входных параметров такая спецификация является трудной.
Первый интерфейс неоднозначен, поскольку использует входные параметры фундаментального типа, что может привести к ошибкам. Избегайте использования интерфейсов, имеющих множество фундаментальных параметров типа. Используйте точно и строго типизированные интерфейсы. Компиляторы часто могут оптимизировать такие интерфейсы лучше, чем слабо типизированные интерфейсы.
Если связаны несколько параметров, объедините их в определенный пользователем тип. При реализации полиморфных интерфейсов используйте указатели на общий базовый класс вместо указателей на void (void*). Для общих интерфейсов используйте шаблоны в качестве параметров.
В Polyspace ® эти типы являются фундаментальными:
Целочисленные типы, например int, short, и long
Типы с плавающей запятой, например float или double
Булев (bool) типы
Указатели на аннулирование (void*)
Указатели или ссылки на предшествующие типы
typedef предшествующих типов
Массивы предшествующих типов
В Polyspace перечисления или enums не являются фундаментальными типами. Polyspace помечает интерфейс, если его входные параметры включают одно из следующих:
Один или несколько void связанные типы
Два или более bool связанные типы
Три или более идентичных основных типов
Для уточнения определения интерфейса можно использовать альтернативные варианты, такие как комментарии или имена параметров. В таких случаях можно обосновать результат Polyspace, используя комментарии в результате или коде. См. Результаты анализа пространства адресов с помощью исправлений ошибок или обоснований
Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.
| Группа: Деклараторы |
| Категория: Обязательные, неавтоматические |