Действие на расстоянии (компьютерное программирование)
Эта статья нуждается в дополнительных цитатах для проверки . ( май 2010 г. ) |
Действие на расстоянии — это антипаттерн в информатике, при котором поведение в одной части программы сильно трудно или невозможно идентифицировать варьируется в зависимости от того, что операции в другой части программы .
Способом избежать проблем, связанных с действиями на расстоянии, является правильный дизайн, который избегает глобальных переменных и изменяет данные только контролируемым и локальным образом, или использование чисто функционального стиля программирования с ссылочной прозрачностью .
Этот термин основан на концепции действия на расстоянии в физике, которая может относиться к процессу, который позволяет объектам взаимодействовать без частицы-посредника, такой как глюон . В частности, Альберт Эйнштейн называл квантовую нелокальность «жутким действием на расстоянии».
Ошибки программного обеспечения из-за действий на расстоянии могут возникнуть из-за того, что программный компонент делает что-то не в то время или влияет на то, чего не должен. Однако очень сложно определить, какой компонент за это отвечает. Побочные эффекты от невинных действий могут привести программу в неизвестное состояние, поэтому локальные данные не обязательно являются локальными. Решением в этом конкретном сценарии является определение того, какие компоненты с какими другими должны взаимодействовать. Правильный дизайн, который точно определяет интерфейс между частями программы и позволяет избежать общих состояний, может в значительной степени устранить проблемы, вызванные действиями на расстоянии.
Пример
[ редактировать ]Этот пример из языка программирования Perl демонстрирует особенно серьезный случай действия на расстоянии (обратите внимание на $[
переменная устарела в более поздних версиях Perl [1] ):
Индексы массива обычно начинаются с 0, поскольку значение
$[
обычно равен 0; если ты установишь$[
до 1, то массивы начинаются с 1, что радует программистов Fortran и Lua , и поэтому мы видим подобные примеры вperl(3)
Справочная страница :foreach $num ($[ .. $#entry) { print " $num\t'",$entry[$num],"'\n"; }И, конечно, вы можете установить
$[
до 17, чтобы массивы начинались с некоторого случайного числа, например 17 или 4, а не с 0 или 1. Это был отличный способ саботировать авторов модулей.К счастью, здравомыслие взяло верх. Сейчас признано, что эти особенности были ошибкой. В списке рассылки perl5-porters теперь есть крылатая фраза для таких функций: они называются «действие на расстоянии». Принцип заключается в том, что объявление в одной части программы не должно радикально и незаметно изменять поведение какой-либо другой части программы.
— Марк Джейсон Доминус , Возвращение к грехам Perl [2]
Действие на расстоянии между объектами
[ редактировать ]Правильное объектно-ориентированное программирование предполагает принципы проектирования, которые позволяют избежать действий на расстоянии.
Закон Деметры гласит, что объект должен взаимодействовать только с другими объектами вблизи себя. Если потребуется действие в удаленной части системы, его следует реализовать путем распространения сообщения. Правильный дизайн существенно ограничивает количество действий на расстоянии, что способствует удобству сопровождения программ. Принуждение к созданию объектной оргии возникает из-за плохого дизайна интерфейса, который, возможно, принимает форму объекта Бога , не реализует истинные объекты или не учитывает Закон Деметры.
Одним из преимуществ функционального программирования является то, что действия на расстоянии принижаются, иногда до такой степени, что их вообще невозможно выразить на исходном языке.
Осознание опасности включения в проект действия на расстоянии и способность распознавать присутствие действия на расстоянии полезно при разработке правильных, надежных и удобных в сопровождении программ. Учитывая, что большая часть затрат программы может приходиться на этап сопровождения и что действия на расстоянии делают обслуживание трудным, дорогим и подверженным ошибкам, во время проектирования стоит приложить усилия, чтобы избежать этого.