Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 1.05 MB
Время: 0.114 c
15-1271364443
pokey
2010-04-16 00:47
2010.08.27
Регистрация в QIWI


2-1267706023
А№
2010-03-04 15:33
2010.08.27
Приобразовать любой бинарный символ в код


15-1269943838
MAX
2010-03-30 14:10
2010.08.27
создание файлов .hlp


2-1272998896
ludmila
2010-05-04 22:48
2010.08.27
работа с внешними файлами


2-1269770353
Delphist2
2010-03-28 13:59
2010.08.27
locktype в ADO