powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Праграмист, пешы красива!
23 сообщений из 98, страница 4 из 4
Праграмист, пешы красива!
    #34864005
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЕсть множество способов решить указанные проблемы, но ни один не имеет отношение к стилю кодирования (напомню тему топика). По этой причине я не собираюсь их обсуждать. Кроме того это просто неинтересно - все техники работы с разделяемыми ресурсами давно известны и тут нечего обсуждать.
Вообще-то я просто считаю, что Вы сами привели пример, когда Ваш стиль либо заставляет писать абсолютно лишний код, либо провоцирует на ошибку при решении конкретной задачи. И все это навязанно именно стилем. В обратном Вы меня не убедили.
...
Рейтинг: 0 / 0
Праграмист, пешы красива!
    #34866221
Фотография Ursego
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Марк, в твоих рассуждениях мне видится вот какой недостаток - ты берёшь какие-то редкие (чтоб не сказать крайние) случаи, в которых таки да мой подход хуже, и проецируешь его на общие случаи. Например, если в скрипте требуется освобождать ресурсы, то, естественно, глупо копировать один и то-же фрагмент 20 раз - лучше сделать одну точку выхода, перед которой и освободить эти ресурсы (я ведь не написал, что набъю морду любому, кто использует единую точку выхода). Или другая ситуация (пример с ресурсами не очень характерен для ПБ, разве только если надо сделать несколько DESTROY-ев) - многочисленные места в скрипте, которые могут закончиться неуспешно - конечно, можно испльзовать икепшн хендлер или даже столь ненавистное "иди на..." (GOTO), но я бы сделал иначе: каждый раз, когда произошёл сбой, возвращать код сообщения об ошибке во внешнюю функцию, которая будет иметь следуюющий код:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
string ls_err_msg_code

ls_err_msg_code = this.uf_blah_blah_blah()
if ls_err_msg_code <> '' then
   {write to error log}
   {display error message}
   return FAILURE
end if

return SUCCESS

Таким образом будет достигнуто ещё одно преимущество - зёрна отделены от плевел, интересная бизнес-логика отделена от технического кода обработки ошибки.

Насчёт SQL-ей: ты пишешь, что "плохой код" и "хороший код" придуцируют разные экзекьюшн планы, и надо смотреть конкретнмо какой более эффективный (я тебя правильно понял?). Да, такое может быть, и бывает, особенно если структуру базы данных ваял какой-нибудь... эээ... нехороший человек. И в таких особых случаях действительно надо думать как сделать лучше - мой вариант вполне может не подойти. Но чаще всего (из моего опыта) оба варианта идентичны. Как видишь, ты снова проецируешь особые случаи на общие. В садике нам рассказывали притчу о венике: когда прутики соединены между собой, сломать веник почти невозможно. Но если его развязать, то сломать прутики один за другим очень легко - вот моя мысль. Я так думаю, все участники дискуссии и без меня прекрасно это знают, а писАл я для особо у дарённых, чей код приходилось разгребать (ну, и совсем новичкам это должно быть тоже полезно).

Кстати, спасибо Анаталию Московскому - отвечаешь за меня фактически так, как ответил бы я!
...
Рейтинг: 0 / 0
Праграмист, пешы красива!
    #34866278
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UrsegoТаким образом будет достигнуто ещё одно преимущество - зёрна отделены от плевел, интересная бизнес-логика отделена от технического кода обработки ошибки
Ну а где те же тот же DESTROY писать? И write to error log лучше делать внутри функции. Лучше всегда делать как говорят в армии - безобразно, но однообразно, в конечном итоге это дает результат.
UrsegoДа, такое может быть, и бывает, особенно если структуру базы данных ваял какой-нибудь... эээ... нехороший человек. И в таких особых случаях действительно надо думать как сделать лучше - мой вариант вполне может не подойти. Но чаще всего (из моего опыта) оба варианта идентичны.Из моего опыта - даже на запросах чуть сложней приведенного уже могут быть проблемы (На том же MS SQL).
А уж когда какой-нибудь отчет напишут так раз в 5-6 завернув select'ы у меня обычно слов кроме матерных не бывает. Типа б$%*ь, какого х%$ агрегация 1000 строчек на 4-х процессорном серваке идет 10 секунд.
И сиди переписывай такие творения. Но зато потом почему-то начинает летать.
А уж то, что объявлено very good code на самом деле вообще wrong code само по себе.
Ursegoа писАл я для особо ударённых, чей код приходилось разгребать (ну, и совсем новичкам это должно быть тоже полезно)Ну так поэтому и надо тогда особенно тщательно подходить к такому вопросу.
...
Рейтинг: 0 / 0
Праграмист, пешы красива!
    #34866437
Фотография Ursego
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин МаркНу а где те же тот же DESTROY писать?В аппликации, над которой я сейчас работаю, вообще нет DESTROY-ев. Я сначала не врубился, говорю шефу - дык мемеори лик, блин, будет! А он ржёт - зачем, говорит, лишнее писАть, если гарбич коллектор запускается периодически? Блин, прям Джава какая-то...

Локшин МаркИ write to error log лучше делать внутри функции. Лучше всегда делать как говорят в армии - безобразно , но однообразноЭта фраза всё ставит на свои места - наши мнения диаметрально противоположны. Можешь писАть безобразно, если хочешь - всё равно я с твоей аппликацией не буду работать. :-)

Локшин Маркв конечном итоге это дает результат.Напиши вообще всю аппликацию в виде одной функции. Конечно, придётся изрядно помучиться и даже проклясть всё на свете, но в конечном итоге это даст результат.
...
Рейтинг: 0 / 0
Праграмист, пешы красива!
    #34866439
Фотография Филипп
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UrsegoВ аппликации, над которой я сейчас работаю, вообще нет DESTROY-ев. Я сначала не врубился, говорю шефу - дык мемеори лик, блин, будет! А он ржёт - зачем, говорит, лишнее писАть, если гарбич коллектор запускается периодически? Блин, прям Джава какая-то...
Так ты ему поясни что он козёл отмороженный...
...
Рейтинг: 0 / 0
Праграмист, пешы красива!
    #34866752
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ursego Локшин МаркИ write to error log лучше делать внутри функции. Лучше всегда делать как говорят в армии - безобразно , но однообразноЭта фраза всё ставит на свои места - наши мнения диаметрально противоположны.
Смысл фразы не в том, что безобразно, а в том, что однообразно . Например однообразный интерфейс он может быть скучен, может быть как-то иначе можно было бы сделать чтобы как-то быстрее работать, но человеку будут более-менее понятны все принципы работы с формами, если он изучит работу с одной. И со стилем оформления точно также. Конечно, исключения допустимы, но они лишь, как известно, подтверждают правила.
UrsegoМожешь писАть безобразно, если хочешь - всё равно я с твоей аппликацией не буду работать
А это как жизнь еще повернется :)
Ursegoно в конечном итоге это даст результат.
Имелось ввиду что-то типа максимума результата при минимуме затрат.
...
Рейтинг: 0 / 0
Праграмист, пешы красива!
    #35099034
Интересно
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ФиллипТак ты ему поясни что он козёл отмороженный...
Не понял почему козел отмороженный?
Ведь в PB на самом деле есть GC.
Я вот тоже destroy не пользуюсь, т.к. если мне сказали что есть сборщик мусора, который уничтожает объекты, на которые нет ссылок, так я считаю, что следить за памятью не моя проблема, а проблема pbvm.
Может просветите в чем проблема, почему необходимо уничтожать объекты, которые созданы руками?
Думаю не только мне это будет интересно, еще народ есть, который не пользуется destroy (мой начальник тоже destroy не пользуется и меня так научил :-) ).
...
Рейтинг: 0 / 0
Праграмист, пешы красива!
    #35099037
Интересно
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На кнопке висит код:
Код: plaintext
1.
2.
3.
4.
DataStore lds = create DataStore
lds.DataObject = 'd_1'
lds.SetTransObject(SQLCA)
lds.Retrieve()
загружается много-много данных.
Смотрю через TaskManager: приложение занимает 10MB, нажимаю кнопку - идет ретрив - использование памяти увеличивается на 80 MB, как только выходит из обработчика - память возвращается в исходное положение (10MB).
Т.е. GC сработал и грохнул DataStore со всеми данными, т.е. память освободилась.
(честно говоря проделал такую операция, как только первый раз сел за PB и мне сказали, что тут GC есть).
К тому же есть большое финансовое приложение (пишем его 3 года), в котором нет ниодного destroy и ни разу не возникали проблемы с памятью: никаких утечек.
...
Рейтинг: 0 / 0
Праграмист, пешы красива!
    #35099080
Фотография Ursego
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё это верно. Но вот я привык за много лет дестроить всё, что накриэйтил, и чувствую себя неуютно полагаясь на GC (как было приказано начальством), хотя в современных языках вообще нету команды освобождения память. И это правильно - зачем отвлекаться на мелочи?
...
Рейтинг: 0 / 0
Праграмист, пешы красива!
    #35099636
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
интересноМожет просветите в чем проблема, почему необходимо уничтожать объекты, которые созданы руками?

GC работает асинхронно. Поэтому возможны (и практически существуют) ситуации когда в цикле создаются объекты, а освобождение памяти происходит в конце цикла. При достаточно большом кол-ве итераций возникнет переполнение.
...
Рейтинг: 0 / 0
Праграмист, пешы красива!
    #35099706
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyGC работает асинхронно. Поэтому возможны (и практически существуют) ситуации когда в цикле создаются объекты, а освобождение памяти происходит в конце цикла. При достаточно большом кол-ве итераций возникнет переполнение.
Причем на своем компьютере с 1 ГБ памяти это будет работать прекрасно, а у пользователя с 256 МБ программа будет падать.
...
Рейтинг: 0 / 0
Праграмист, пешы красива!
    #35099814
Интересно
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я конечно понимаю, что можно привести массу конкретных примеров, где предпочтительнее явный destroy, я сам, разумеется, иногда использую destroy, особенно там, где это касается sharedobject.
Но я всё-таки имею ввиду общие случаи.
На счет цикла. GC работает ассинхронно, но у него есть некий период работы, и, мне кажется, что он успеет освободить память, до того как она кончится. (Контрпример в студию).
...
Рейтинг: 0 / 0
Праграмист, пешы красива!
    #35099867
Локшин Марк
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
интересноНа счет цикла. GC работает ассинхронно, но у него есть некий период работы, и, мне кажется, что он успеет освободить память, до того как она кончится. (Контрпример в студию).
Вы думаете, а я с таким сталкивался. И то, я всегда пишу DESTROY, а тут забыл - и вылезло.
...
Рейтинг: 0 / 0
Праграмист, пешы красива!
    #35099940
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Локшин Марк wrote:

> Причем на своем компьютере с 1 ГБ памяти это будет работать прекрасно

Это самое главное .
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Праграмист, пешы красива!
    #35099956
Интересно
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо, про цикл убедили. Тут я согласен, что предпочтительнее вызвать destroy.
Но я всё-таки считаю, что в общем случае destroy не нужен.
GC на то и сделан, чтобы снять с программиста задачу управления памяти, кроме этого destroy ведь несколько усложняет код, где есть несколько точек выхода.
Например такой код мне нравится больше:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
uo_1 obj1, obj2
obj1 = create uo_1
obj2 = create uo_2
...
if (...) then return
if (...) then return
if (...) then return
if (...) then return
...
do while (...)
   do while (...)
      ...
   loop
loop
...
return
чем этот:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
uo_1 obj1, obj2
obj1 = create uo_1
obj2 = create uo_2
...
if (...) then
   if (...) then
      if (...) then
         if (...) then
            ...
            do while (...)
               do while (...)
                     ...
               loop
            loop
            ...
         end if
      end if
   end if
end if
...
destroy obj1
destroy obj2
return
...
Рейтинг: 0 / 0
Праграмист, пешы красива!
    #35099980
Фотография Ikar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
интересно...
кроме этого destroy ведь несколько усложняет код, где есть несколько точек выхода.
...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
TRY
  create object
  ...
  ...
  if ... then return
  ...
  do while ...
    ...
    if ... then return
  loop
  ...
  if ... then return
  ...
FINALLY
  destroy object
END TRY
И никаких усложенний (",)
------------
С уважением, IKAR

IkarHomeCenter ........ Детский Дворик ........ ГавГав.Инфо
Портал русскоязычной группы пользователей Sybase
...
Рейтинг: 0 / 0
Праграмист, пешы красива!
    #35100008
Интересно
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщем меня никто не убедил, что всегда надо писать destroy.
Мне кажется, что те, кто пишет destroy, просто привыкли следить за памятью, и пишут его на всякий пожарный.
...
Рейтинг: 0 / 0
Праграмист, пешы красива!
    #35100031
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ikar
Код: plaintext
1.
2.
3.
4.
5.
6.
TRY
  create object
  if ... then return
FINALLY
  destroy object
END TRY

ИМХО, после return не вызываются FINALLY
...
Рейтинг: 0 / 0
Праграмист, пешы красива!
    #35100057
Интересно
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вызывается 100%
...
Рейтинг: 0 / 0
Праграмист, пешы красива!
    #35100087
Фотография Ikar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky...
ИМХО, после return не вызываются FINALLY
На кнопку код:
Код: plaintext
1.
2.
3.
4.
5.
try
	return
finally
	messagebox('', 'finally')
end try
И попробовать (",)
...
Рейтинг: 0 / 0
Праграмист, пешы красива!
    #35100858
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ikar Anatoly Moskovsky...
ИМХО, после return не вызываются FINALLY
попробовать
Верю, у меня наверно ложная память сработала :))
...
Рейтинг: 0 / 0
Праграмист, пешы красива!
    #35100898
Oleg1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
интересноВообщем меня никто не убедил, что всегда надо писать destroy.
Мне кажется, что те, кто пишет destroy, просто привыкли следить за памятью, и пишут его на всякий пожарный.DESTROY можно не использовать там, где он автоматом вызывается сразу в момент исчезновения последней ссылки на объект. Во всех случаях лучше использовать. Вообще-то все это пишется на автомате и подобных проблем не возникает.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Праграмист, пешы красива!
    #35887288
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Намедни довелось править какую-то старую програмку. Открываю скрипт и вижу это чудо (см. картинку). Остроумно написано, не правда ли? :)
Праграмист, пешы красива! :):):)
...
Рейтинг: 0 / 0
23 сообщений из 98, страница 4 из 4
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Праграмист, пешы красива!
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]