Новости | 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()) мы не можем.