Эта идея просто сводится к методу «Self_Test» в контексте объектно-ориентированного или объектно-ориентированного проектирования. При использовании скомпилированного объектно-ориентированного языка, такого как Ada, весь код самопроверки будет помечен компилятором как неиспользованный (никогда не вызванный) во время производственной компиляции, и, следовательно, все это будет оптимизировано - ничего из этого не появится в получившийся исполняемый файл.
Использование метода «Self_Test» - очень хорошая идея, и если бы программисты действительно интересовались качеством, они бы все это делали. Однако одна важная проблема заключается в том, что метод «Self_Test» должен иметь строгую дисциплину, поскольку он не может получить доступ к каким-либо деталям реализации и вместо этого должен полагаться только на все другие опубликованные методы в спецификации объекта. Очевидно, что в случае сбоя самопроверки реализация должна будет измениться. Самопроверка должна строго проверять все опубликованные свойства методов объекта, но никогда не полагаться ни на какие детали какой-либо конкретной реализации.
Объектно-ориентированные и объектно-ориентированные языки часто предоставляют именно этот тип дисциплины в отношении методов, внешних по отношению к тестируемому объекту (они обеспечивают реализацию спецификации объекта, предотвращая любой доступ к деталям его реализации и вызывая ошибку компиляции, если обнаружена любая такая попытка). ). Но все внутренние методы объекта имеют полный доступ к каждой детали реализации. Таким образом, метод самотестирования находится в уникальной ситуации: он должен быть внутренним методом по своей природе (очевидно, что самотестирование - это метод тестируемого объекта), но ему необходимо получить всю дисциплину компилятора внешнего метода ( он должен быть независим от деталей реализации объекта). Немногие, если какие-либо языки программирования предоставляют возможность дисциплинировать объект внутренний метод, как если бы это был внешний метод. Так что это важный вопрос дизайна языка программирования.
При отсутствии надлежащей поддержки языка программирования лучший способ сделать это - создать объект-компаньон. Другими словами, для каждого объекта, который вы кодируете (назовем его «Big_Object»), вы также создаете второй объект-компаньон, имя которого состоит из стандартного суффикса, объединенного с именем «реального» объекта (в данном случае, «Big_Object_Self_Test»). "), и чья спецификация состоит из одного метода (" Big_Object_Self_Test.Self_Test (This_Big_Object: Big_Object) return Boolean; "). В этом случае объект-компаньон будет зависеть от спецификации основного объекта, и компилятор будет полностью применять всю дисциплину этой спецификации в отношении реализации объекта-компаньона.