Термин target–actionпарадигма дизайна относится к разновидности архитектура программного обеспечения, где компьютерная программа разделена на объекты, которые динамически устанавливают отношения, сообщая друг другу, на какой объект они должны нацеливаться и какое действие или сообщение отправить этой цели когда происходит событие. Это особенно полезно при реализации графических пользовательских интерфейсов, которые по своей природе управляются событиями.
Подход «цель – действие» к системам, управляемым событиями, обеспечивает гораздо больший динамизм по сравнению с другими, более статичными подходами, такими как подкласс. Это связано с тем, что создание подклассов является относительно жестким способом программирования: программист должен изложить внутреннюю логику взаимосвязи программы во время разработки, и это не может быть изменено позже, если программа не будет остановлена, перепроектирована и перестроена. С другой стороны, программирование на основе целевого действия может полностью изменить их во время времени выполнения, тем самым позволяя программе самостоятельно создавать новые взаимосвязи и новое поведение.
Ярким примером этого подхода является OpenStep API, который отчасти благодаря тому, что основан на динамическом языке Objective-C, имеет большая часть его графического пользовательского интерфейса реализована с использованием парадигмы целевого действия. Рассмотрим следующий пример, написанный на Objective-C:
[button setTarget: self]; [кнопка setAction: @selector (doSomething)];
Теперь, когда кнопка button, идентифицированная переменной button , нажата, система времени выполнения попытается отправить сообщение с именем doSomething объекту, в котором это код был вызван. Также очень хорошо возможно определить сообщение, которое будет отправлено во время выполнения:
[button setTarget: self]; [действие кнопки setAction: NSSelectorFromString ([textField stringValue])];
Здесь сообщение, которое должно быть отправлено, определяется путем обращения к строковому значению текстового поля (строка текста, которую пользователь ввел в текстовое поле). Эта строка впоследствии преобразуется в сообщение (с помощью функции NSSelectorFromString ) и передается кнопке в качестве ее действия. Это возможно, потому что в Objective-C методы представлены селектором, простой строкой, описывающей вызываемый метод. Когда сообщение отправлено, селектор отправляется в среду выполнения ObjC, сопоставляется со списком доступных методов, и вызывается реализация метода. Реализация метода рассматривается во время выполнения, а не во время компиляции.
Из-за чрезвычайного динамизма и свободы поведения, предоставляемого программам, разработанным с использованием парадигмы целевого действия, может случиться так, что разработчик программы неправильно реализует часть логики взаимосвязи, и это иногда приводит к возникновению трудно отслеживаемых ошибок. Это связано с отсутствием управления во время компиляции, предоставляемого компилятором, который не может видеть взаимосвязи. Таким образом, контроль согласованности межсоединений полностью оставлен на усмотрение программиста.
Результат неправильно подключенной привязки целевого действия может отличаться в зависимости от того, как конкретная система, в которой реализована программа, относится к этому: