Форум: "Прочее";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
ВнизDelphi - "рулез форева"! Найти похожие ветки
← →
Leonid Troyanovsky © (2010-02-17 18:39) [280]
> Petr V. Abramov © (17.02.10 01:14) [267]
> и танцует", соотвественно, кто память выделяет, тот ее и
> освобождает.
Мой алгоритм проще запомнить: если хочешь потанцевать,
то для начала накорми. Память распредели, определи локальные
переменные для параметров и т.д. и т.п.
{MS не зря API так строил, и вовсе не потому, что там, скажем, засели
враги ООП или ФП, или просто двоечники, а что подругому было б хуже}
Т.е., выделяется и освобождается все в одном процедурном блоке,
так и следить легче за парами New/Dispose, Create/Free, да и finally будет
на месте.
Ну, а тому, кто забывает CloseHandle, надо потихоньку, понемножку
где-нибудь что-нибудь отрывать, пока, гад, не научится.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2010-02-17 18:46) [281]
> vuk © (17.02.10 18:27) [279]
> Это удобнее, чем передавать кучу параметров через var или
> out которые все равно придется где-то в локальных переменных
> хранить.
А структура не в локальных хранится?
Ну, и напишу функцию f(var s: TSruct): Boolean
Да и кто говорил про "много", я лишь про массив :)
--
Regards, LVT.
← →
vuk © (2010-02-17 18:59) [282]to Leonid Troyanovsky © (17.02.10 18:46) [281]:
> Ну, и напишу функцию f(var s: TSruct): Boolean
Если возврат boolean не нужен, то, как мне кажется, было бы логичным писать:function GetSomething:TStruct;
вместоprocedure GetSomething(var s: TStruct);
Для понимания первое, на мой взгляд, проще и логичнее. Плюс в некоторых случаях позволит обойтись без локальных переменных.
← →
Leonid Troyanovsky © (2010-02-17 19:08) [283]
> vuk © (17.02.10 18:59) [282]
> procedure GetSomething(var s: TStruct);
Если не нужен Boolean можно взять результатом у оной структуры
нечто самое главное (для дальнейшей обработки) простого типа.
В некоторых случаях позволит обойтись без анализа всей структуры.
--
Regards, LVT.
← →
Игорь Шевченко © (2010-02-17 19:11) [284]vuk © (17.02.10 18:59) [282]
А был бы сборщик мусора - и объекты можно было бы возвращать из функций без локальных переменных. То есть, возвращать-то можно и сейчас, только запоминать надо, чтобы грохнуть не забыть
← →
vuk © (2010-02-17 19:58) [285]to Leonid Troyanovsky © (17.02.10 19:08) [283]:
> Если не нужен Boolean можно взять результатом у оной структуры
> нечто самое главное (для дальнейшей обработки) простого
> типа.
> В некоторых случаях позволит обойтись без анализа всей структуры.
>
Зависит от конкретного случая, но отказываться в принципе от возврата функциями сложных типов смысла не вижу.
to Игорь Шевченко © (17.02.10 19:11) [284]:
> То есть, возвращать-то можно и сейчас, только запоминать
> надо, чтобы грохнуть не забыть
>
Так это понятно. С другой стороны, если будет оговорено, что функция возвращает, некий объект, за который ответственность дальше несет вызывающая сторона, то это тоже ничего страшного. Название только функции соответствующее дать - и всё.
То есть примерно так:
GetSomeObject - вызывающая сторона ответственности за время жизни не несет
CreateSomeObject - вызывающая сторона несет ответственность за время жизни
Конечно, второй случай - некий вариант альтернативного конструктора и в этом смысле применение такой функции ничем не хуже обычного вызова конструктора. В идеале, оно, конечно, может быть реализовано добавлением конструктора, но не всегда есть возможность/смысл расширять класс.
← →
Игорь Шевченко © (2010-02-17 20:04) [286]
> Название только функции соответствующее дать - и всё.
RtlActivateActivationContextUnsafeFast
← →
Вася (2010-02-17 20:17) [287]
> Игорь Шевченко © (17.02.10 19:11) [284]
>
> vuk © (17.02.10 18:59) [282]
>
> А был бы сборщик мусора - и объекты можно было бы возвращать
> из функций без локальных переменных. То есть, возвращать-
> то можно и сейчас, только запоминать надо, чтобы грохнуть
> не забыть
Если каждый метод будет возвращать ссылку на Self, то можно и не запоминать
CreateSomeObject.Method1.Method2.Method3.Free;
← →
Игорь Шевченко © (2010-02-17 20:20) [288]Вася (17.02.10 20:17) [287]
Это че ?
← →
Вася (2010-02-17 20:32) [289]
> Игорь Шевченко © (17.02.10 20:20) [288]
>
> Вася (17.02.10 20:17) [287]
>
> Это че ?
>
function TSomeObject.Method1: TSomeObject;
begin
...
Result:=Self;
end;
← →
картман © (2010-02-17 20:35) [290]
> Вася (17.02.10 20:32) [289]
шикаааааааааарно)))
← →
GrayFace © (2010-02-17 21:00) [291]Alkid, в озвученных условиях подход разделения на 2 функции абсолютно верен, но к "более философскому смыслу" он не относится. Если в проекте не используется активно Linq или подобное, то кому сдался функциональный стиль? В часности, в Delphi он никаким боком не нужен.
Модифицируемые параметры могут "пахнуть" только когда их много.
Leonid Troyanovsky © (16.02.10 23:37) [256]
Геттерам не запрещены побочные эффекты, однако, это, IMHO,
не используют. Ну, или, скажем, не надо использовать.
proxy!
Вася (17.02.10 20:17) [287]
CreateSomeObject.Method1.Method2.Method3.Free;
Напоминает то, как я в Луа структуры объявляю. Типа,
define
.int("x")
.int("y")
.int("z")
← →
vuk © (2010-02-17 21:21) [292]to Вася (17.02.10 20:17) [287]:
> CreateSomeObject.Method1.Method2.Method3.Free;
"а я бы ответил матом" (с) не я
:))
to Игорь Шевченко © (17.02.10 20:04) [286]
> RtlActivateActivationContextUnsafeFast
Вот умеешь ты удачный пример найти. Прям уважаю! :))
← →
Eraser © (2010-02-18 00:40) [293]> [284] Игорь Шевченко © (17.02.10 19:11)
with GetSomething() do
try
..
finally
Free;
end;
хотя да, понятнее конечно через переменную, обычно так и делаю.
← →
Германн © (2010-02-18 00:51) [294]
> хотя да, понятнее конечно через переменную, обычно так и
> делаю.
>
Добавлю и свою копейку. Я уже об этом говорил.
Не понимаю почему нет легального способа выполнить такой код:var
List : TList;
...
...
procedure CreateMyClassAndAddToList;
begin
with TMyClass.Create(nil) do try
...
List.Add(что-то, что является адресом того, что было создано в with);
finally
Free;
end;
end;
← →
oxffff © (2010-02-18 00:56) [295]Вот что нам предлагает разработчик компилятора Delphi
http://blog.barrkel.com/2010/01/one-liner-raii-in-delphi.html
← →
Anatoly Podgoretsky © (2010-02-18 09:43) [296]> Германн (18.02.2010 00:51:54) [294]
Так ты же сам отказался в пользу анонимных переменных
← →
jack128_ (2010-02-18 09:54) [297]
> Вот что нам предлагает разработчик компилятора Delphi
>
> http://blog.barrkel.com/2010/01/one-liner-raii-in-delphi.
> html
хе. Я всегда считал, что FreeOnExit - это хак. Ну раз разрабы разрешили, значит можно пользоваться.
← →
vuk © (2010-02-18 10:58) [298]to Германн © (18.02.10 00:51) [294]:
> Не понимаю почему нет легального способа выполнить такой
> код:
Можно было бы решить при помощи хелпера для TObject, но его использование убъет возможность использования других хелперов, что не есть гуд.
← →
jack128_ (2010-02-18 11:00) [299]
>
> Можно было бы решить при помощи хелпера для TObject
да, хелперы конечно удобны, но не доделаны до конца. extention-методы C# гораздо удобнее.
← →
vuk © (2010-02-18 11:05) [300]to jack128_ (18.02.10 11:00) [299]:
Ну... Я хелперами пользуюсь. Вроде нормально.
← →
jack128_ (2010-02-18 11:27) [301]
> Ну... Я хелперами пользуюсь. Вроде нормально.
ну сам же только что в [298] озвучил серьезное ограничение хелперов
ЗЫ я тоже использую их, но это не значит, что их нельзя сделать лучше
← →
Игорь Шевченко © (2010-02-18 11:53) [302]jack128_ (18.02.10 11:00) [299]
> да, хелперы конечно удобны, но не доделаны до конца
Тема конца не раскрыта
← →
vuk © (2010-02-18 12:13) [303]А еще можно такую ботву намутить:
type
TInstanceRef<T> = record
Instance: T;
constructor Create(AInstance: T);
end;
constructor TInstanceRef<T>.Create(AInstance: T);
begin
instance := AInstance;
end;
--------------
with TInstanceRef<TSomeObject>.Create(TSomeObject.Create) do
try
Instance.DoSomething;
finally
Instance.Free;
end;
Правда, на мой взгляд, для доступа к ссылке на экземпляр это уже чересчур как-то. Проще уж переменную завести и не компостировать мозг.
← →
Leonid Troyanovsky © (2010-02-18 13:18) [304]
> Германн © (18.02.10 00:51) [294]
> Добавлю и свою копейку. Я уже об этом говорил.
> Не понимаю почему нет легального способа выполнить такой
> код:
Потому, что твой List будет полон инвалидными ссылками.
Для самопознания класс снабжается довеском:
type
TMySKClass = class (TMyClass)
private
function This: TMySKClass;
end;
function TMySKClass.This;
begin
Result := Self;
end;
Написать же 2 строки не влом, если далее, все равно,
его динамически создавать?
А не включили такую функцию (поле) в генофонд, бо оверхед.
Я уже об этом говорил ;)
--
Regards, LVT.
← →
GrayFace © (2010-02-18 13:24) [305]oxffff © (18.02.10 0:56) [295]
http://blog.barrkel.com/2010/01/one-liner-raii-in-delphi.html
О! В Delphi появились замыкания?
← →
jack128_ (2010-02-18 14:09) [306]а 2009ой еще. и дженерики. тока работоспособность этого дела сомнения вызывает..
Страницы: 1 2 3 4 5 6 7 8 вся ветка
Форум: "Прочее";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Память: 1.03 MB
Время: 0.1 c