Вверх ↑
Этот топик читают: Гость
Ответов: 9804
Рейтинг: 340
#76: 2007-06-25 10:47:18 ЛС | профиль | цитата
Тоды, видимо, должно делаться автоматом... Аля в C++
Если там вообще динамические данные есть - не знаю.

Смысл в том, что если чего-то там заводит временные данные в динамической памяти (не в стеке, как локальные переменные), то их надо когда-то и уничтожать.
В том числе и при исключениях, которые нарушают канонический порядок исполнения.
В C++, к примеру, если ты завел себе переменную, то ейный деструктор автоматически помещается в такой блок, который запускается по окончании области видимости этой переменной.

Ну это так - общефилософские знания... Конкретные детали PHP для меня неведомы
карма: 8

0
Администрация
Ответов: 15263
Рейтинг: 1498
#77: 2007-06-25 11:02:31 ЛС | профиль | цитата
Nic писал(а):
Раз функция возвращает значение, которое можно проверить, то логично было бы ожидать что такая схема:

Логично ожидать, что будет возможность проверить результат вызова ф-ции. Поэтому в таких случаях добавляется опция IgnoreResult.

Nic писал(а):
А по логике Delphi1 можно было бы ожидать другой результат:

к сожалению в пакете WEB не везде применима логика Delphi1. Однако в данном случае пожалуй результат действительно не тот, который следовало ожидать.

Nic писал(а):
Человек он молодой, а молодое дело понять можно.

к сожалению добросовестность мантажников от возраста заказчика мало зависит

Nic писал(а):
Чтобы соорудить описание класса пришлось сделать элемент

компонент можно реализовать гораздо проще. Вместо метода doDefine нужно написать метод Init:
func Init()
  fvar(old)
old = block.select(BLK_CLASS_HEAD)
println(code(Type), ' ', '$' + code(Name), ';')
block.select(old)
end

где BLK_CLASS_HEAD это блок, объявленный в элементе, который у вас печатает заголовок класса class WFDocument().

Nic, одна из причин, по которой в php не было добавлено элементов работы с классами это отсутствие полезности таковых для пользователя hiasm. Насколько я понимаю у вас просто стоит задача переделать некий php скрипт один в один на элементах hiasm. Возможно потом такие элементы и появятся в качестве примитивов для создания компонент на базе контейнеров.

[size=-2]------ Добавлено в 11:02
Nic писал(а):
Простейший вариант компонента hiTry_catch.hws примерно выглядит так:

судя по коду из этого
code(Exception)[/code]
получается это
UserException_1 $e[/code]
а это не есть хорошо
карма: 22
0
Главный модератор
Ответов: 2655
Рейтинг: 353
#78: 2007-06-25 11:39:12 ЛС | профиль | цитата
Dilma писал(а):
у вас просто стоит задача переделать некий php скрипт один в один на элементах hiasm

Мне показалось это наиболее рациональным способом изучения возможностей пакета HiAsm WEB.

Dilma писал(а):
а это не есть хорошо

знаю - делается это как временная "заплата" в расчёте на будущее "красивое решение", но есть опасение, что нет более постоянного чем временное. Судя по:
Dilma писал(а):
...Возможно потом такие элементы и появятся ...


Dilma писал(а):
где BLK_CLASS_HEAD это блок, объявленный в элементе...

Заголовок класса пока печатает переделанный компонент Function, поэтому пока не могу разобраться с объявлением блока в нём, но если нет другого пути - придётся.
карма: 8
Дорогу осилит идущий. HiAsm.NET is based on HiAsm 5
0
Администрация
Ответов: 15263
Рейтинг: 1498
#79: 2007-06-25 12:32:42 ЛС | профиль | цитата
Nic писал(а):
Мне показалось это наиболее рациональным способом изучения возможностей пакета HiAsm WEB.

так это не в притензию было сказано По началу тоже так результат проверял путем переделки один в один исходников форума hiasm.

Nic писал(а):
в расчёте на будущее "красивое решение"

к сожалению не приходилось тесно работать с классами и исключениями в php, поскольку необходимости такой там никогда не возникало. А делать по одному классу на каждую компоненту приложения это слишком не рационально. Поэтому в данном случае могу только подсказать, как уже готовые элементы сделать удобнее и проще.
карма: 22
0
Главный модератор
Ответов: 2655
Рейтинг: 353
#80: 2007-06-25 14:07:19 ЛС | профиль | цитата
Для определения функций в теле класса иногда нужен тип функции. Можно ли добавить это в компонент Function?

//  println('function ', code(Name), '(', s, ') {')
println(isdef(AddType) ? '': code(Type + ' '), 'function ', code(Name), '(', s, ') {')
Function.ini:

[Property]
...
AddType=Включение типа функции|4|1|True,False
Type=Тип функции: public - общего доступа, protected - защищённая, private - локального доступа|14|0|public,protected,private

С описанием класса hiClass.hws дело обстоит так:

func doPrint:java
println('')
println('class ', code(Name), isdef(Extends) ? '': ' extends ', code(Parent), ' {')
block.inclvl()
event(onPrint)
block.declvl()
println('}')
end
Class.ini:

...
[Type]
Class=Element
Info=Класс
Tab=LowLevel

[Property]
Name=Имя класса|2|
Extends=Расширение для наследования определений|4|0|True,False
Parent=Имя класса, от которого должны быть унаследованы определения|2|

[Methods]
doPrint=Формирует тело класса|1|
onPrint=Событие происходит всякий раз, перед формированием тела класса|2|

[size=-2]------ Добавлено в 14:07
Dilma писал(а):
где BLK_CLASS_HEAD это блок, объявленный в элементе, который у вас печатает заголовок класса

Как мне объявить этот блок в компоненте hiClass.hws?
карма: 8
Дорогу осилит идущий. HiAsm.NET is based on HiAsm 5
0
Администрация
Ответов: 15263
Рейтинг: 1498
#81: 2007-06-25 14:22:39 ЛС | профиль | цитата
Nic писал(а):
Можно ли добавить это в компонент Function?

добавлять эту правку только для ф-ции без остальных элементов смысла не имеет. Необходимо сделать тогда уж полную концепцию работы с классами: скажем я пока не вижу особого смысла в выносе полей класса в отдельный элемент. Вероятно удобнее добавить еще по одной опции в св-во Extern и вместо True, False сделать набор вида Local, Global, Classes. В этом случае будет достаточно легко вносить и выносить ф-цию из класса без перестройки методов. Кроме того подумать как организовать объявление переменной класса. Ну и все остальное в этом же духе. Пока же все очень сыро:

Nic писал(а):
Для определения функций в теле класса иногда нужен тип функции

а так не проще ли?
//  println('function ', code(Name), '(', s, ') {')
  println(isdef(Type) ? '': code(Type + ' '), 'function ', code(Name), '(', s, ') {')
...
[Property]
...
Type=Тип функции: static - статическая, public - общего доступа, protected - защищённая, private - локального доступа|14|0|static,public,protected,private



[size=-2]------ Добавлено в 14:22
Nic писал(а):
Как мне объявить этот блок в компоненте hiClass.hws?


примерно так

code_1593.txt
карма: 22
0
файлы: 1code_1593.txt [550B] [208]
Главный модератор
Ответов: 2655
Рейтинг: 353
#82: 2007-06-25 23:48:59 ЛС | профиль | цитата
Можно ли добавить в компонент Function функциональность, позволяющую генерить такой вот код?

function db_connect( $user='sa', $password='12345', $db='workflow' ){
}
Это параметры вызова функции по-умолчанию, то есть можно делать простой вызов без параметров db_connect(), они подставятся автоматически.
карма: 8
Дорогу осилит идущий. HiAsm.NET is based on HiAsm 5
0
Администрация
Ответов: 15263
Рейтинг: 1498
#83: 2007-06-26 13:24:42 ЛС | профиль | цитата
для этого придется аргументы по другому задавать

[size=-2]------ Добавлено в 13:24
Nic, реализовал таки вчера вашу идею по поводу предпросмотра кода, генерируемого компонентом из среды. После получения результата понял насколько была проста и гениальна эта идея

   Работает это хозяйство так: при зажатом Ctrl в среде нужно навести курсор на work точку элемента и чуть чуть подождать. После этого HiAsm запустит фиктивную компиляцию проекта, в процессе которой кодогенератор соберет информацию по данной точки и передаст её среде. Затем среда вместо имени точки выведет в подсказке реальный кусок кода, генерируемый данным методом элемента с его текущими настройками, текущим включением и текущими данными из потока. Причем подчерку еще раз: выводится именно реально-генерируемый код для данного метода. Благодаря этой особенности отладить любой элемент во всех его возможных включениях и настройках стало делом 5 секунд - поправил код, сохранил, навел на точку в среде - получил результат. А отладить приложение стало теперь возможно даже не запуская его: просто берешь и последовательно проходишь по всем точкам ветки и смотришь какие данные и откуда попадают в метод и какие события с какими данными он вызывает. Там же очень хоршо и наглядно видно какая оптимизация при этом делается.

   Однако все это богаство доступно только тем, кто разбирается в коде. Нужно подумать, как ужать это до привычным простому пользователю терминов и выдать в той же подсказке.
карма: 22
0
Разработчик
Ответов: 25378
Рейтинг: 2070
#84: 2007-06-26 13:27:42 ЛС | профиль | цитата
Dilma, и где взять эту прелесть?
карма: 19

0
Главный модератор
Ответов: 2655
Рейтинг: 353
#85: 2007-06-26 13:27:46 ЛС | профиль | цитата
Переработанная версия компонента hiTry_catch.hws:

func doTry(data):java
println('try {')
block.inclvl()
event("onTry", data)
block.declvl()
fvar(i)
trace(count(Exceptions))
for(i = 2; i <= _event_count_; i++)
//trace(Exceptions[1]))
println('} catch (',code(Exceptions[i-2]), ' ', '$', code(ObjectName),') {')
block.inclvl()
event("onCatch" + i , data)
block.declvl()
end
println('}')
end
Try_catch.ini:

Version=1.1
Author=Nic
Mail=nic@savelovo.net

[Type]
Class=DPElement
Sub=,Sections|onCatch,,
Info=Конструкция Try - catch
Tab=PHP

[Property]
ObjectName=Имя объекта исключительной ситуации|2|e
Exceptions=Список функций обработчика исключений catch|5|Exception
Sections=Количество секций обработчика исключений, включая секцию Try|1|2

[Methods]
doTry=Формирует конструкцию, состоящую из секции Try и секции(й) catch|1|
onTry=Событие происходит всякий раз при формировании секции Try|2|
Схема примера:

Add(EntryPoint,12010646,63,105)
{
link(onStart,8731090:doTry,[])
}
Add(Try_catch,8731090,112,105)
{
ObjectName="ex"
Exceptions=#10:CustomEx_1|10:CustomEx_2|
Sections=3
link(onTry,501451:doEcho,[])
link(onCatch2,16405751:doEcho,[(166,118)(166,153)])
link(onCatch3,13242436:doEcho,[(160,125)(160,195)])
}
Add(Echo,501451,175,105)
{
Message="Text on Try"
}
Add(Echo,13242436,175,189)
{
Message="Text on Catch_2"
}
Add(Echo,16405751,175,147)
{
Message="Text on Catch_1"
}
Получаемый код:

<?php

try {
echo "Text on Try";
} catch (CustomEx_1 $ex) {
echo "Text on Catch_1";
} catch (CustomEx_2 $ex) {
echo "Text on Catch_2";
}

?>
карма: 8
Дорогу осилит идущий. HiAsm.NET is based on HiAsm 5
0
Администрация
Ответов: 15263
Рейтинг: 1498
#86: 2007-06-26 13:35:38 ЛС | профиль | цитата
хотелось еще небольшой пример использования. Кроме того не совсем понятно что это:
Exceptions - Список функций обработчика исключений catch

[size=-2]------ Добавлено в 13:35
После ознакомления с кодом такие вопросы:
1) CustomEx_1 - нужноли их задавать пользователю, или можно генерить автоматом?
2) $ex - видимо из переменной можно прочесть код исключения и текстовое описание. Как предполагается делать это?
карма: 22
0
Главный модератор
Ответов: 2655
Рейтинг: 353
#87: 2007-06-26 13:50:17 ЛС | профиль | цитата
1) С автоматом будут проблемы, если обработчик исключительных ситуаций находится в другой схеме и не предполагается их объединять.
2)
Dilma писал(а):
Как предполагается делать это?

Сначала пробовал добавить нижнюю точку Value, которая возвращала, примерно такой код:

...
} catch (CustomEx_1 $ex) {
echo $ex->getMessage();
}
...
Но если учитывать что методов с разными именами может быть N+1, то убрал это. И пока видится только такой способ:

Add(EntryPoint,12010646,63,105)
{
link(onStart,8731090:doTry,[])
}
Add(Try_catch,8731090,112,105)
{
ObjectName="ex"
link(onTry,501451:doEcho,[])
link(onCatch2,13719349:doPrint,[(160,118)(160,153)])
}
Add(CallFunc,13719349,175,147)
{
Name="$ex->getMessage"
link(onPrint,16405751:doEcho,[])
}
Add(Echo,501451,175,105)
{
Message="Text on Try"
}
Add(Echo,16405751,224,147)
{
link(Message,13719349:Result,[(230,135)(214,135)(214,192)(181,192)])
}
который возвращает код:

  try {
echo "Text on Try";
} catch (Exception $ex) {
$res3 = $ex->getMessage();
echo $res3;
}
карма: 8
Дорогу осилит идущий. HiAsm.NET is based on HiAsm 5
0
Ответов: 9804
Рейтинг: 340
#88: 2007-06-26 13:54:16 ЛС | профиль | цитата
Dilma писал(а):
Однако все это богаство доступно только тем, кто разбирается в коде.

И если оптимальность кода всегда локальна...
карма: 8

0
Главный модератор
Ответов: 2655
Рейтинг: 353
#89: 2007-06-26 14:03:56 ЛС | профиль | цитата
Dilma писал(а):
не совсем понятно что это:
Exceptions - Список функций обработчика исключений catch

В PHP5 предусмотрен новый класс Exception, который может использоваться в коде, выполняемом под сервером PHP5. Также есть возможность определять собственные классы, которые наследуют методы класса Exception. Подклассы могут быть определены так:

class CustomException extends Exception {
function __construct($message) {
parent::Exception($message);
}
}
карма: 8
Дорогу осилит идущий. HiAsm.NET is based on HiAsm 5
0
Администрация
Ответов: 15263
Рейтинг: 1498
#90: 2007-06-26 14:04:27 ЛС | профиль | цитата
Nic писал(а):
Но если учитывать что методов с разными именами может быть N+1

не понимаю в чем тут проблема.

может стоит выдавать его в поток сразу:
...
event("onCatch" + i, ObjectName, '->getMessage()')
...

карма: 22
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)