Интерфейсы должны быть точно и строго типизированы
Интерфейсы должны быть точно и строго типизированы.
Интерфейсы описывают поведение или возможности объекта. Точно и сильно типизированные интерфейсы определяют назначение и свойства своих параметров с помощью параметров, которые являются пользовательскими объектами и шаблонами вместо фундаментальных типов. Сравните интерфейсы в этом фрагменте кода:
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, используя комментарии в своем результате или коде. Смотрите результаты адресации Polyspace посредством исправлений ошибок или обоснований
Если вы ожидаете нарушения правил, но не видите его, обратитесь к разделу «Стандартные нарушения кодирования не отображаются».
Группа: Деклараторы |
Категория: Необходимый, Неавтоматизированный |