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