Использовать процедурный тип при объявлении процедуры\функци
Модератор: Модераторы
Мне пришлось для своего развития читать исходники. Так вот, каждого программиста существует свой почерк, свой стиль...
У одних все закладывается в одну процедуру.. длинная при длинная, лабиринт. Другие же любят все самую простую задачу расписать на двадцать файлов.. так им удобно..
Бывает все сжато-кратко, понятно и профессионально. И я думаю, что так думает компилятор.. Это синтаксис написание программ..
И закладывается идея, ради чего все пишется, её форма видна из элементов. Даже можно концовку разглядеть.. Писать разумеется можно по всякому.
- это все лирика..
Мне кажется, что у вас сейчас идея не до конца реализуется через синтаксис.. или вступило в противоречие..
Смотрите, у меня же тоже сходная была задача, также есть реализация событий:
есть 3D объекты, анимация, шейдеры.. и есть пространство скриптов - их как то надо объединить.
Так вот пришлось сделать два вида сообщения: Events(быстрые) - это уровня 3D объектов - они процедурные.. и Message(медленные) - уровень скриптов, они стековые.При этом Events могут порождать Message..
У одних все закладывается в одну процедуру.. длинная при длинная, лабиринт. Другие же любят все самую простую задачу расписать на двадцать файлов.. так им удобно..
Бывает все сжато-кратко, понятно и профессионально. И я думаю, что так думает компилятор.. Это синтаксис написание программ..
И закладывается идея, ради чего все пишется, её форма видна из элементов. Даже можно концовку разглядеть.. Писать разумеется можно по всякому.
- это все лирика..
Мне кажется, что у вас сейчас идея не до конца реализуется через синтаксис.. или вступило в противоречие..
Смотрите, у меня же тоже сходная была задача, также есть реализация событий:
есть 3D объекты, анимация, шейдеры.. и есть пространство скриптов - их как то надо объединить.
Так вот пришлось сделать два вида сообщения: Events(быстрые) - это уровня 3D объектов - они процедурные.. и Message(медленные) - уровень скриптов, они стековые.При этом Events могут порождать Message..
Последний раз редактировалось olegy123 22.04.2017 15:09:03, всего редактировалось 1 раз.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
olegy123 писал(а):Так вот пришлось сделать два вида сообщения: Events(быстрые) - это уровня 3D объектов - они процедурные.. и Message(медленные) - уровень скриптов, они стековые. При этом Events могут порождать Message..
Интересное кино получается... то, что нужно сделать быстро, то делается медленней (пусть и не всегда), чем то, что делается медленно...
Хотя, что забавно, в кадах и пр программ этого класса скрипты нормальное дело. А вот развитое объектное дерево будет явно занимать много памяти, а значит требовать свопинга, а значит времени. При том, что программы этого класса в режиме полноценной визуализации (и при достаточно развитой сцене) способны подвесить графические фермы. (в частности, на это жалуются киношники)
Т. е. объектная модель хороша лишь для поделок.
Имхо, тот бы скорее подошли не объекты, а процессы.
У меня они посажены на разные трейды..
3D выполняется с частотой 30Гц.. скрипты 10Гц..
Добавлено спустя 13 минут 32 секунды:
Re: Использовать процедурный тип при объявлении процедуры\функци
У меня Keyframe объект - правильнее сделать record. Может потом сделаю.
от Keyframe порождены Keyframe1D Keyframe2D Keyframe3D, KeyframeAlpha - при этом ими проще писать синтаксис.. если бы были Record-ы то с ними больше возни, хотя размер массива меньше в памяти.
Через Object проще управлять Child-ами.. в рекорд больше писанины в обслуживании их..
3D выполняется с частотой 30Гц.. скрипты 10Гц..
Добавлено спустя 13 минут 32 секунды:
Re: Использовать процедурный тип при объявлении процедуры\функци
Лекс Айрин писал(а):Т. е. объектная модель хороша лишь для поделок.
У меня Keyframe объект - правильнее сделать record. Может потом сделаю.
от Keyframe порождены Keyframe1D Keyframe2D Keyframe3D, KeyframeAlpha - при этом ими проще писать синтаксис.. если бы были Record-ы то с ними больше возни, хотя размер массива меньше в памяти.
Через Object проще управлять Child-ами.. в рекорд больше писанины в обслуживании их..
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
olegy123 писал(а):от Keyframe порождены Keyframe1D Keyframe2D Keyframe3D, KeyframeAlpha - при этом ими проще писать синтаксис.. если бы были Record-ы то с ними больше возни, хотя размер массива меньше в памяти.
Например, можно использовать ссылочный тип для дополнительных полей... да и, насколько я помню, есть записи с вариантами, для особо извращенных случаев... правда, побочные эффекты не очень приятные., так что лично я бы использовал ссылочный тип.
olegy123 писал(а):Через Object проще управлять Child-ами.. в рекорд больше писанины в обслуживании их..
Я бы так не сказал... особенно глядя на реализацию тех же стандартных компонентов.
К тому же, при использовании процедурного типа (или функции-переменной) вполне можно реализовать расширенную запись, на подобии того же объекта, но с меньшими накладными расходами. В любом случае, динамическая память требует всегда особой аккуратности на нижнем слое.
Лекс Айрин писал(а):Например, можно использовать ссылочный тип для дополнительных полей... да и, насколько я помню, есть записи с вариантами, для особо извращенных случаев... правда, побочные эффекты не очень приятные., так что лично я бы использовал ссылочный тип.
Ссылочный тип кто то должен создать.. потом контролировать сложно..
Keyframe я сделал как объект просто потому, что он может быть при создании про инициализирован, и при удалении может вызван деструктор с удалением всех чилдов.. при рекорд - вся операция ложится на программиста..
На счет моего Keyframe - я до конца не вижу полную реализацию. Когда будет стадия оптимизации будут переводить в тип record-а.
Вообще то я хотел сказать что важно соблюсти баланс между реализации идеи, правильности написания кода и оптимизации.
Добавлено спустя 7 минут 6 секунд:
Re: Использовать процедурный тип при объявлении процедурыфункци
Лекс Айрин писал(а):Я бы так не сказал... особенно глядя на реализацию тех же стандартных компонентов.
К тому же, при использовании процедурного типа (или функции-переменной) вполне можно реализовать расширенную запись, на подобии того же объекта, но с меньшими накладными расходами. В любом случае, динамическая память требует всегда особой аккуратности на нижнем слое.
Была время когда я тыкал коллбэки везде где нужно и не нужно.. Есть что то в функции-переменной - надо выполнить.. быстро.. Но оно перестает работать при многопотоковости..
Там не всегда в это время поток готов принять.. Поэтому функции-переменные выгодны в основном потоке и не эффективны и опасны при многозадачности..
Добавлено спустя 5 минут 55 секунд:
Re: Использовать процедурный тип при объявлении процедуры\функци
На счет памяти - прошли те времена когда при 32кбайт оперативки люди писали игры которые проходили месяцами..
Сейчас когда в ноутубке можно поставить 32Гб.. думаю лишних пару мегабайт потерянных на обслуживание всех объектов в программе не такая великая проблема..
-
Mirage
- энтузиаст
- Сообщения: 881
- Зарегистрирован: 06.05.2005 20:29:07
- Откуда: Russia
- Контактная информация:
А зачем классу команды метод MouseMove()? Даже при событийной модели. Команда является слушателем событий чтоли?
По идее, ничего, кроме метода Execute() быть не должно.
И в 173 разных команды, которые нельзя реализовать в виде вменяемого количества (20-30) классов, как-то не верится. Что-то тут не то.
А предложение правильно и даже аргументированно завернули. Не предназначены процедуры для этого.
По идее, ничего, кроме метода Execute() быть не должно.
И в 173 разных команды, которые нельзя реализовать в виде вменяемого количества (20-30) классов, как-то не верится. Что-то тут не то.
А предложение правильно и даже аргументированно завернули. Не предназначены процедуры для этого.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
olegy123 писал(а):Ссылочный тип кто то должен создать.. потом контролировать сложно..
А объект, как будто сам возникает...
olegy123 писал(а):Keyframe я сделал как объект просто потому, что он может быть при создании про инициализирован, и при удалении может вызван деструктор.. при рекорд - вся операция ложится на программиста..
ой... вот только не смеши мои пятки... а кто запрещает создать деструктор/конструктор для записи?
Код: Выделить всё
Type
TDestroy = function(p:pointer):boolean;
TCreate = function(p:Pointer): Boolean;
Record= TestType
Destroy:TDestroy;
Create:TCreate;
Str:String;
End;
Procedure TestDestroy...;
...
Procedure TestCreate...;
....
Var
Test:TestType;
Begin
// Создание переменнной
Test.Create:= @TestCreate;
Test.Destroy:= @TestDestroy;
Test.Create();
////
......
////
End;
И не такие уж и накладные расходы.
Лекс Айрин писал(а):И не такие уж и накладные расходы.
шо, в уже в рекордах разрешили наследование и переопределение методов?
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
olegy123, ну ты хочешь совсем уж кучеряво жить... и рыбку съесть и шкурку сдать.
Если подумать, то кто запрещает тебе наследование имитировать?...
Впрочем, если ты сам назначаешь функции "псевдообъектам", то зачем тогда надобность в наследовании?
Насчет переопределения методов... все даже круче, чем в объектах -- можно менять "методы" в процессе работы "псевдообъектов". Вместе с самомодификацией структуры. Можно подобное сделать и для объектов, то тут методы те же, а ограничения строже.
Собственно, объект изначально само чем отличается от подобной записи "на стероидах".
В принципе, сама возможность создания процедурных типов это попытка обойти ограничения объектной модели. А возможно, и частично уйти от нее.
Возможно, стоит попробовать более продвинутые парадигмы... Например, процесс- или аспектно-ориентированное программирование. Правда, это потребует еще больших усилий... преимущественно на этапе проектирования программы.
Если подумать, то кто запрещает тебе наследование имитировать?...
Впрочем, если ты сам назначаешь функции "псевдообъектам", то зачем тогда надобность в наследовании?
Насчет переопределения методов... все даже круче, чем в объектах -- можно менять "методы" в процессе работы "псевдообъектов". Вместе с самомодификацией структуры. Можно подобное сделать и для объектов, то тут методы те же, а ограничения строже.
Собственно, объект изначально само чем отличается от подобной записи "на стероидах".
В принципе, сама возможность создания процедурных типов это попытка обойти ограничения объектной модели. А возможно, и частично уйти от нее.
Возможно, стоит попробовать более продвинутые парадигмы... Например, процесс- или аспектно-ориентированное программирование. Правда, это потребует еще больших усилий... преимущественно на этапе проектирования программы.
Mirage
>>Команда является слушателем событий чтоли?
Конечно, она интерактивная.
>>Что-то тут не то.
Что вы все вцепились в реализацю. Я не утверждаю что без этой фичи всё пропало.
Я лишь говорю что с ней будет надежнее.
>>А предложение правильно и даже аргументированно завернули. Не предназначены процедуры для этого.
Очень аргументировано:
даже варнингов нету
>>Команда является слушателем событий чтоли?
Конечно, она интерактивная.
>>Что-то тут не то.
Что вы все вцепились в реализацю. Я не утверждаю что без этой фичи всё пропало.
Я лишь говорю что с ней будет надежнее.
>>А предложение правильно и даже аргументированно завернули. Не предназначены процедуры для этого.
Очень аргументировано:
Код: Выделить всё
program Project1;
{$MODE DELPHI}
type
TmySuperproc=procedure (blablabla:integer);
function mySuperproc(blablabla:string):string;
begin
result:=blablabla+'blablabla';
end;
var
pp:TmySuperproc;
begin
pp:=@mySuperproc;
pp(1);
end. даже варнингов нету
zub писал(а):даже варнингов нету
как это нет? Error на 15 строке.
Код: Выделить всё
Runtime error 216 at $004032C7
$004032C7
$00404634
$004015DD main, line 15 of project1.lpr
$00408A86
Там надо чуть поправить и всё зафурычит.
А разве это не то самое, искомое в теме?
vitaly_l
Прошу гденить ознакомится что такое Runtime errors, что такое compiler warnings, hints, errors. И как последние 3 призваны защищать от первых
Прошу гденить ознакомится что такое Runtime errors, что такое compiler warnings, hints, errors. И как последние 3 призваны защищать от первых
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
vitaly_l писал(а): Error на 15 строке.
Речь об ошибках компиляции. Программа даже не должна была собраться.
Лекс Айрин писал(а):Речь об ошибках компиляции. Программа даже не должна была собраться.
zub писал(а):И как последние 3 призваны защищать от первых
директиву правильную пропишите и наступит релакс.
Код: Выделить всё
{$MODE objfpc}
Директива стоит абсолютно правильная. релаксируй.
