Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.11 c
15-1273264199
Юрий
2010-05-08 00:29
2010.08.27
С днем рождения ! 8 мая 2010 суббота


4-1237892274
Alx2k
2009-03-24 13:57
2010.08.27
Получить оверлейный значок


2-1269823057
Вася
2010-03-29 04:37
2010.08.27
Свой обработчик для динамически созданного компонента


4-1234276707
Serafim
2009-02-10 17:38
2010.08.27
Не получается записать во входной буфер консоли WriteConsoleInput


2-1273484332
Fr
2010-05-10 13:38
2010.08.27
сортировка слова по символам





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский