| Новости | FAQ | Авторы | Документация | В действии | Библиотека |
| Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Sumo 25.08.2007 12:20 / 25.08.2007 12:22
Начиная с версии 3.2 в Парсере появилась возможность определять свойства (properties). Кратко напомню: обращение к свойству выглядит в программе, как обычное обращение к переменным, но на самом деле происходит вызов промежуточных функций, которые могут содержать более сложную логику, чем простое чтение/запись переменной.@CLASS
simpleModule
@create[]
...
@GET_siteName[]
$result[^CSQL.string{select value from settings where name='site_name'}]
@SET_siteName[aSiteName]
^if(def $aSiteName){
^CSQL.void{replace settings (name, value) values ('site_name', '$aSiteName')}
}
@run[]
Название сайта: $siteNameБезусловно можно было сделать просто методы getSiteName и setSiteName (так наверняка бы сделали люди, программировавшие на Яве) и вызвать их в коде, но мне кажется, что семантически обращение к переменной в данном случае выглядит гораздо логичнее (хотя это дело вкуса). @CLASS billing @USE clients.p accounts.p tariffs.p ... @create[] $clients[^clients::create[]] $accounts[^accounts::create[]] $tariffs[^tariffs::create[]] ...И использовать методы классов в основной программе:
@USE billing.p @main[] $billing[^billing::create[]] $clients[^billing.clients.all[]]Вроде все нормально, но мы, в данном случае, используем только модуль clients, но тем не менее компилируем все! Можно, конечно, отказаться от мета-класса, вставить в программу кучу if-ов и подключать только нужные модули. Правда такой подход резко усложнит программу и затруднит отладку. Теперь посмотрим как эту проблему помогут решить свойства.
@CLASS
billing
@create[]
$_clients[]
$_accounts[]
$_tariffs[]
...
@GET_clients[]
^if(!def $_clients){
^use[clients.p]
$_clients[^clients::create[]]
}
$result[$_clients]
@GET_accounts[]
^if(!def $_accounts){
^use[accounts.p]
$_accounts[^accounts::create[]]
}
$result[$_accounts]
@GET_tariffs[]
^if(!def $_tariffs){
^use[tariffs.p]
$_tariffs[^tariffs::create[]]
}
$result[$_tariffs]
...Теперь наш код будет компилировать модули только, если к нему реально идет обращение из программы. Теперь мы можем не заюотится о своевременной инициализации модулей! Кроме того в такой ситуации мы можем сделать модули вложенными не теряя функциональность и не используя промежуточные переменные. А это в Парсере можно сделать только с помошью свойств, поскольку писать цепочки вызовов методов (в Яве можно так: getBilling().getClients().all()) мы не можем.