Тема: Як краже functio чи procedure

Як кражще передавати TBitmap (мені цікаво імено комплексні типи даних)
через functio

function <Назва>(<рараметри>): TBitmap;
begin
   <якись код>
   Result:=...;
end;

чи procedure

procedure <Назва>(<рараметри>,B:TBitmap);
begin
   <якись код>
   B:=...;
end;

чи насправді неважливо?

2 Востаннє редагувалося koala (20.09.2015 17:17:53)

Re: Як краже functio чи procedure

В другому випадку ви забули var в параметрах дописати.
І загальне правило - функція краще, бо дозволяє гнучкіше і зрозуміліше писати код. Порівняйте:

DrawImage( 100, 100, Image );
DrawCircleOnImage( 100, 100, Image );

із

Image := DrawImage( 100, 100 );
DrawCircleOnImage( 100, 100, Image );

В другому випадку очевидно, звідки береться Image, в першому створюється хибне враження, що процедури роблять схожі дії.
Врешті, function дозволяє написати

DrawCircleOnImage( 100, 100, DrawImage( 100, 100 ) );

Хоча дотримання стилю все одно важливіше - якщо у вас 10 функцій повертають результат через var, 11-у аналогічну треба теж робити такою самою.

Подякували: Stanislav Stecenko1

3

Re: Як краже functio чи procedure

Категорично не згодний з koala, якщо мова йде про об'єкти чи інші типи з ручним керуванням пам'яттю. Функція може повертати об'єкт лише в одному випадку: якщо вона його створює, і на початку її назви стоїть "Create". В усіх інших випадках має бути виключно var-параметр. Це необхідно для того, щоб дотримуватись правила "хто виділив пам'ять, той і має її звільнити".
Для типів з автоматичним керуванням пам'яттю (наприклад record, array) дійсно краще функція, коли це має сенс, і повертається лище щось одне.

4

Re: Як краже functio чи procedure

Як логічніше:

element := Form.getTopElement();//нічого не створює, повертає верхній елемент на формі

чи

Form.getTopElement(element);//записує в аргумент верхній елемент на формі

Як на мене - однозначно перший. Другий явно нам натякає, що element допомагає вирахувати цей верхній.
Хоча, ще раз, гайди важливіші. Якщо домовилися так, як каже пан Torbins - так і має бути.

5

Re: Як краже functio чи procedure

Не важливо. Функція теж може повертати з ссилкою (параметром var).

6

Re: Як краже functio чи procedure

Якщо мова про методи об'єктів, то тут уже можуть бути варіанти. Якщо об'єкт створює якісь внутрішні об'єкти, які потім сам же й видаляє, то він може повертати посилання на них через методи, які реалізовані у вигляді функцій. Тоді "користувач" такого об'єкту буде працювати з цими внутрішніми об'єктами як з типами з автоматичним керуванням пам'яттю, не задумуючись про те, що їх треба буде видалити. Але в цьому випадку користувач не може довго зберігати посилання на ці внутрішні об'єкти.

Подякували: bees1