Двойственные методы
Материал из Википедии — свободной энциклопедии
Концепт в концептно-ориентированном программировании (КоП) предоставляет два определения для одного метода (с одной сигнатурой) в своем классе ссылки и классе объекта, которые называются двойственными методами. Если в исходном коде метод применяется к ссылке, то приоритет имеет определение из класса ссылки. Говорится, что ссылка перехватывает доступ к объекту, который она представляет.
В следующем примере концепт Account
определяет метод getBalance
как в классе ссылки, так и в классе объекта:
concept Account reference { String accountNumber; // Идентификатор double getBalance() { print("> Account: доступ извне"); double b = 0; if(accessPermitted()) b = .getBalance(); print("< Account: доступ извне"); return b; } } object { double balance; double getBalance() { print("> Account: доступ изнутри"); return balance; print("< Account: доступ изнутри"); } }
Метод ссылки принимает запросы извне. Если доступ разрешен, то он просто делегирует этот дальше двойственному методу данного объекта. Таким образом, если мы применим этот метод к ссылке на счет, то будет получен следующий результат:
Account account = getAccount(); Account.getBalance(); $ > Account: доступ извне $ > Account: доступ изнутри $ < Account: доступ изнутри $ < Account: доступ извне
Однако, если этот метод будет вызван из дочернего концепта такого как SavingsAccount in Account
(т.е. изнутри), то метод ссылки не будет выполняться. Таким образом, методы ссылки выполняются при входе в данную область, тогда как методы объекта выполняются, когда процесс уже пересек границу и находится внутри области.
Двойственные методы имеют важное приложение в управлении жизненным циклом. В частности, методы создания и удаления имеют две версии: одну для инициализации ссылки и одну для инициализации объекта. Последний является аналогом обычного конструктора, тогда как первый специфичен только для КоП. В следующем примере метод создания ссылки инициализирует данную ссылку и метод создания объекта инициализирует объект:
concept Account reference { String accountNumber; // Идентификатор void create() { // Инициализировать ссылку accountNumber = getUniqueAccountNumber(); Object o.create(); map.add(accountNumber, o); } } object { double balance; void create() { // Инициализировать объект balance = 0; } }
Метод создания ссылки генерирует уникальный номер счета. Затем он выделяет реальный (системный) ресурс для данного объекта и получает его примитивную ссылку. В конце он сохраняет где-то связь между данным номером счета и данной примитивной ссылкой таким образом, что метод продолжения может разрешить ее во время доступа.
В случае наличия иерархии включения концептов должны предоставить возможность дочерним концептам сделать свой вклад в этот процесс.
[править] См. также
- Концептно-ориентированное программирование
- Концепт
- Включение
- Комплексная ссылка
- Метод продолжения
- Двойственные методы
- Концептно-ориентированная модель