Функции – Степень идентичности (версия 2 от 29.09.07)
Введение
Что стоит за словами "Эти две функции одинаковы"? Насколько одинаковы эти функции? Могут ли считаться одинаковыми функции, вся разница в которых заключается лишь в том, что в одной использованы английские ключевые слова, а в другой русские?
Существует огромное количество хорошо написанных универсальных функций и такое же огромное количество "поделок" и "подделок", написанных "на скорую руку". Но почти всегда, каждый новый программист радостно кидается писать свою неповторимую функцию, вместо того, чтобы взять уже готовый проверенный вариант.
Данная классификация призвана сформировать некоторый общий словарь терминов, однозначно определяющий степень схожести двух произвольных функций, вычисленную несколькими произвольными инструментами для сравнения функций, или используемый при визуальном анализе кода.
Необходимые ограничения
В данной классификации вопрос о синтаксической правильности кода функции не поднимается в принципе - функции априори считаются синтаксически корректными. Исходя из этого утверждения, тело функции и тело процедуры можно считать абсолютно аналогичным (несмотря, на то, что функция обязана возвращать значение)
В данной классификации не рассматривается вопрос о видимости функции из других модулей, поэтому ключевое слово Экспорт нас не интересует.
В описания синтаксиса не включены ключевые слова, обозначающие начало функции и её завершение (Функция, Function, КонецФукнции, EndFunction). Предполагается, что все эти ключевые слова могут быть заменены на пару Функция-КонецФункции.
Качество и наличие комментариев являются предметом другой классификации.
В рамках данной классификации аналогично может быть рассмотрена идентичность процедур.
Общее представление об идентичности функций
Идентичность функций будет рассматривается в следующих относительно независимых разрезах:Идентичность по наименованию
Идентичность по параметрам
Идентичность по реализации
Идентичность по возвращаемым значениям
Идентичность по результатам
Идентичность по наименованию
Функция <ИмяФункции>([<ПараметрыФункции>])
Одноименные функции – функции с совпадающими наименованиями без учета регистра.
Разноименные функции – функции с различающимися именами.
Идентичность по параметрам
ПараметрыФункции = [<Параметр>]*[,<Параметр>]
Параметр = [[Знач] <ИмяПараметра>[=<ДефЗнач>],]
Т.к. у нас нет возможности проверить тип параметра, будем ориентироваться только на имя параметра, признак передачи по значению, наличие значения по умолчанию, а также на количество параметров.
Необходимо отметить, что совпадение количества параметров говорит о идентичности по параметрам, а вот анализ признака передачи по значению и наличия значения по умолчанию может говорить о степени сопоставимости.
Пока только проработан вариант полного совпадения количества и дополнительных характеристик параметров.
Полная идентичность по параметрам – количество параметром, их название и дополнительные характеристики совпадают.
Идентичность по параметрам – количество параметров и дополнительные характеристик совпадают, а вот наименования параметров не совпадают.
Идентичность по реализации
Полная идентичность по реализации – у двух функций тело функции полностью совпадает без учета незначащих символов и комментариев.
Идентичность реализации – идентичные по параметрам функций полностью совпадают без учета незначащих символов и комментариев, но в случае приведения имен параметров к одним значениям с соответствующей заменой имен в теле функции.
Идентичность по возвращаемым значениям
Анализу подлежат все возможные значения-параметры обязательного оператора Возврат.
Идентичность по результатам
Наиболее сложный вариант анализа функций. Поэтому скорее всего идентичность по результату придется рассматривать как закономерный результат идентичности по параметрам и коду.
В идеале хотелось бы иметь набор тестов. который бы проверял идентичность результата по всем значениям входных параметров двух функций.
Обобщенная степень идентичности
Объединение всей совокупности классификаций по идентичности позволяет ввести обобщенные понятия степени идентичности.
Полная идентичность – две функции полностью идентичны по параметрам и по коду.
Идентичность – две функции идентичны по параметрам и по коду.
Синонимичные функции – две функции идентичны или полностью идентичны, но различаются наименованиями.
Заключение
В этой версии классификации есть большой простор для новых терминов, но практическая ценность данной работы может быть уже невелика.
Для идентичных функций (не полная идентичность) необходимо проработать такую ситуацию, когда в теле функции изменяется переменная, предполагаемая как локальная, но не закрытая от изменения оператором Перем; В результате замены одной идентичной функции на другую и наличии совпадения глобальной переменной и «незакрытой» локальной переменной, могут возникнуть проблемы.