ракета(да она ещё и летает!)!

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

Re: ракета(да она ещё и летает!)!

Сообщение sign » 18.05.2015 07:45:57

pupsik писал(а):А кто его знает. Писал на глаз.

Функция проста по логике и мала по тексту.
Значит, городить огород ради некой "правильности" - глупо. По моему личному мнению.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: ракета(да она ещё и летает!)!

Сообщение Alex2013 » 27.06.2015 00:15:39

sign писал(а):Не понимаю, чего боятся некоторых конструкций языка?

Я вот так всегда пишу, удобно и всё ясно:
Код: Выделить всё
function TSheet.IconFocus: TIBase;
var i: Integer;
begin
  for i := 0 to FSBox.ControlCount-1 do
    if (FSBox.Controls[i] is TIBase) and (TIBase(FSBox.Controls[i]).Status=csFocus)
    then Exit(TIBase(FSBox.Controls[i]));
  Result := nil;
end;

Гм... Удивил ! И что из нескольких вложенных циклов так выходит ?
(Или у break тоже параметр есть ? )
Alex2013
долгожитель
 
Сообщения: 3049
Зарегистрирован: 03.04.2013 11:59:44

Re: ракета(да она ещё и летает!)!

Сообщение Дож » 27.06.2015 02:01:48

Exit из нескольких циклов выходит, у Break параметра нет (параметр есть у goto).
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: ракета(да она ещё и летает!)!

Сообщение Kemet » 27.06.2015 17:05:55

pupsik писал(а):А кто его знает. Писал на глаз.
Код: Выделить всё
function TSheet.IconFocus: TIBase;
var
   i: Integer;
  a_a : boolean;
begin
  Result := nil;
  i := 0;
  a_a := False;
  repeat
    if FSBox.Controls[i] is TIBase) and (TIBase(FSBox.Controls[i]).Status=csFocus then
      a_a := True;
    inc(i);
  until a_a or i := FSBox.ControlCount-1;
if not a_a then
  Result := nil
    else
     Result := TIBase(FSBox.Controls[i]);
end;

а если как-то так (тоже писал на глаз ):
Код: Выделить всё
:= 0;
Result := nil;
while ( i < FSBox.ControlCount ) and ( Result = nil ) do begin
    if (FSBox.Controls[i] is TIBase) and (TIBase(FSBox.Controls[i]).Status=csFocus)
    then Result := TIBase(FSBox.Controls[i]);
    inc(i);
end;
Kemet
постоялец
 
Сообщения: 241
Зарегистрирован: 10.02.2010 19:28:32
Откуда: Временно оккупированная территория

Re: ракета(да она ещё и летает!)!

Сообщение Mirage » 27.06.2015 18:39:08

Цикломатическая сложность (ну это лучше, чем кол-вом строк мерять!) наименьшая у такого варианта:
Код: Выделить всё
i:= 0;
Result := nil;
while (i < FSBox.ControlCount) and (FSBox.Controls[i] is TIBase) and (TIBase(FSBox.Controls[i]).Status=csFocus) do
    inc(i);
if i < FSBox.ControlCount then
  Result := TIBase(FSBox.Controls[i]);


Да и читабельность, на мой взгляд, лучше.

А еще можно как-то так (синтаксис условен):

Result := FSBox.Controls.Filter( (_ is TIBase) and (TIBase(_).Status=csFocus) ).GetFirst();

Это если бы были нормальные коллекции, lazy evaluation и чуть синтаксического сахара.

dedm0zaj писал(а):недавно использовал гото как выход из системы циклов. это было реально удобно.


А говнокод писать всегда удобнее, чем напрягать мозг и писать правильно. Иначе б его никто не писал.
Неудобно потом такой код читать. В том числе самому написавшему.

Дож писал(а):(2) поменяв простой for-range цикл на repeat-until


Вы на полном серьёзе утверждаете, что цикл for, по факту состоящий из присваивания и собственно цикла, проще, нежели просто цикл?
Mirage
энтузиаст
 
Сообщения: 881
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: ракета(да она ещё и летает!)!

Сообщение pupsik » 28.06.2015 01:01:56

Kemet и Mirage зачем :twisted: Я код не для правки или обзора давал.... С другой стороны, мне кажется что то лишним: FSBox.Controls[i] is TIBase and TIBase(FSBox.Controls[i]).Status=csFocus.

Если ребятам судьба использовать Exit и Break. Дык пускай используют. Нарвутся на приятности, ночку поутюжат код. Потом, возможно, изменится что то.

п.с.
в обще то тема не про это... Уже бы кто то ракету покруче скинул бы :wink:
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

Re: ракета(да она ещё и летает!)!

Сообщение Дож » 01.07.2015 10:39:12

Mirage писал(а):
Дож писал(а):(2) поменяв простой for-range цикл на repeat-until


Вы на полном серьёзе утверждаете, что цикл for, по факту состоящий из присваивания и собственно цикла, проще, нежели просто цикл?


Это какой-то странный вопрос. Я утверждаю, что сравнивая варианты
Код: Выделить всё
  for i := 0 to FSBox.ControlCount-1 do
    DoSomething;

и
Код: Выделить всё
  i := 0;
  repeat
    DoSomething;
    inc(i);
  until a_a or i := FSBox.ControlCount-1;

первый
а) короче и проще читается программистом - всё находится на своих местах, не нужно искать где инициализация, итерация и сравнение, компилировать поведение у себя в голове
б) лучше контролируется компилятором и менее подвержен ошибкам (программист не забудет вставить i:=0 и inc(i))

Я утверждаю, что переход от первого варианта кода ко второму — ухудшение программы.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Пред.

Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru