alexs писал(а):Дож писал(а):RunAlgo(TMyCallbackWrapper.Create(A1, A2, A3)); // Передаём коллбэк
В этой форме - это не колбэк, а манипуляции с объектом.
Это многое меняет, конечно.
Я вообще не понял - зачем для такой простой вещи, как обратный вызов - надо городить объект?
Затем, что сейчас в паскале нет хороших и правильных альтернатив этому.
Нужны вам переменные - так сделайте их глобальными, разместите на куче. Но объект зачем?
Глобальные переменные — это не решение на все случаи.
viewtopic.php?f=1&t=10762&start=45#p91706viewtopic.php?f=1&t=10762&start=45#p91707И ещё - за такое обращение с динамической памятью руки отрывать надо.
Есть правило - где ты память попросил, там её и освободи.
Как Вы мне предлагаете освободить память интерфейсного объекта? Давайте вместе сделаем код лучше!
Не переносите плохой стиль написания ПО с других (менее удачных языков) в паскаль.
Всё что вы пишите - очень сильно попахивает явой и JS. Не учитесь плохому. Учитесь хорошему.
Хорошее — в студию! Буду учиться.
Лекс Айрин писал(а):Дож, то есть, не получается по нормальному, значит надо городить все подряд, лишь бы получилось подогнать результат?
Если задача поставлена, то нужно решать задачу. Как правило, возникает несколько вариантов решений. У каждого варианта решения нужно оценить плюсы и минусы, определить приоритеты, всё взвесить и, в конце концов, совершить выбор. Бывает так, что разные люди делают разный выбор, а однозначно правильного выбора нет.
Для анализа читабельности разных подходов к написанию кода нужно 1) поставить задачу 2) написать код разными способами по каждому из подходов 3) прочесть 4) оценить что читалось легче.
Вы взяли задачу «написание простейшего коллбека в WinApi», реализовали одним (единственным возможным в реальности, так как WinApi фиксировано) способом, и теперь утверждаете, что это что-то доказывает по параметру «читабельности» и «правильности» во всех остальных ситуациях. Нет, не доказывает, даже близко нет.
Аргументацию «по-нормальному», «нормальные программисты делают так», «это извращение», «в Java есть лямбды, поэтому не надо нам такого», «в C# вот нормальные прогеры юзают делегаты» и прочие оставьте для разговоров с пацанчиками на районе.
Лекс Айрин писал(а):Где вы видите параметрирование колбека? лично я не нашел... пойду поищу...
Как действуют анонимные фукнции или замыкание — определяется семантикой компилятора. Искать следует в документации на используемый компилятор. В нашем воображаемом компиляторе паскаля с поддержкой замыканий компилятор видит локальные переменные A1, A2, A3 («контекст»), генерирует для хранения их копий структуру, копирует в эту структуру значения этих переменных («захват контекста») в момент порождения нового замыкания, и заботится об освобождении этой структуры.
То, что компиляторе сгенерировал весь этот код за нас, — это благо, освободившее нас от т.н. «обезьяней работы» (см. второй мой пример).
Лекс Айрин писал(а):плюс, присваивание переменным в функции, которая должна жить долго, локальных значений, которые "исчезнут" как только процедура завершится. То есть, гарантировано падение программы.
Что гарантируется, а что нет, определяется документацией на используемый язык. В нашем воображаемом компиляторе с поддержкой замыканий это законная конструкция даже в случае долгой жизни функции.
Лекс Айрин писал(а):kazalex писал(а):можно и вовсе отказаться от глобальных переменных в коде.
бред. Как минимум, одна глобальная переменная в программе всегда будет -- сам объект.
Без комментариев:
- Код: Выделить всё
procedure RunApp;
var
App: TApp;
begin
App.Init;
App.Run;
App.Done;
end;
begin
RunApp;
end.
kazalex писал(а):alexs писал(а):Нужны вам переменные - так сделайте их глобальными, разместите на куче.
Глобальные переменные??? И эти люди [s]запрещают мне ковыряться в носу[/s] рассуждают о правильном пути

+1
