Вложенные ветвления
От: voxel3d  
Дата: 28.11.05 10:17
Оценка:
Hello.


Подскажите. Здесь на сайте видел пост, где человек сказал, что после Хаскеля имеет привычку заменять конструкции со вложенными проверками условий на массив, содержщий указатели на функции, где происходят нужные действия, а индексом является само условие. К сожалению, не могу найти, где я это прочитал. Объясните идею на пальцах, применительно к С++.

best regards..
Re: Вложенные ветвления
От: beroal Украина  
Дата: 28.11.05 11:02
Оценка:
Здравствуйте, voxel3d, Вы писали:
V>Подскажите. Здесь на сайте видел пост, где человек сказал, что после Хаскеля имеет привычку заменять конструкции со вложенными проверками условий на массив, содержщий указатели на функции, где происходят нужные действия, а индексом является само условие. Это?
Автор: Jandor
Дата: 25.11.05
Re: Вложенные ветвления
От: Sinclair Россия https://github.com/evilguest/
Дата: 28.11.05 11:28
Оценка:
Здравствуйте, voxel3d, Вы писали:

V>Подскажите. Здесь на сайте видел пост, где человек сказал, что после Хаскеля имеет привычку заменять конструкции со вложенными проверками условий на массив, содержщий указатели на функции, где происходят нужные действия, а индексом является само условие. К сожалению, не могу найти, где я это прочитал. Объясните идею на пальцах, применительно к С++.

switch(resultCode)
{
  case 1: ... 
    case 2: ...
}

1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Вложенные ветвления
От: voxel3d  
Дата: 28.11.05 16:14
Оценка:
Здравствуйте, beroal, Вы писали:

Это?
Автор: Jandor
Дата: 25.11.05


Да, оно самое. Объясните, плиз.

best regards..
Re[2]: Вложенные ветвления
От: voxel3d  
Дата: 28.11.05 16:16
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, voxel3d, Вы писали:


Честно говоря, иронию не уловил.

best regards..
Re[3]: Вложенные ветвления
От: Jandor Россия  
Дата: 28.11.05 18:56
Оценка:
V>Да, оно самое. Объясните, плиз.
Это мой пост был.

Что-то вроде этого :
  function GetSide(const Rect: TRect; a, b: TPoint): TSide;
  var
    p, q: Boolean;
  const
    sides: array[Boolean, Boolean] of TSide = ((sBottom, sRight), (sLeft,sTop));
  begin

    with rect do
    begin
      p := ((Right - Left) * (a.y - Bottom) + (Bottom - Top) * (a.x - Left)) < 0;
      q := ((Right - Left) * (a.y - Top) - (Bottom - Top) * (a.x - Left)) < 0;
    end;
    Result := sides[p, q];
  end;


Это можно было бы сделать через вложенный if
if cond1 then
   if cond2 then Result:= ...
        else Result:= ...
     else
   if cond2 then Result:= ...
        else Result:= ...


тут конечно не очень короче получилось, но идея в преобразовании кода в данные.
[yellow leaf]
Re[3]: Вложенные ветвления
От: Sinclair Россия https://github.com/evilguest/
Дата: 29.11.05 04:02
Оценка:
Здравствуйте, voxel3d, Вы писали:

V>Честно говоря, иронию не уловил.

Простейший способ получить индексирование кода — switch стейтмент. Можно воспроизводить его руками, но тогда не гарантирована оптимальность. Компилятор, как правило, лучше знает как поступать — строить таблицу, цепочку ифов или двоичное дерево.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[4]: Вложенные ветвления
От: Геннадий Васильев Россия http://www.livejournal.com/users/gesha_x
Дата: 29.11.05 05:03
Оценка: +1
Здравствуйте, Sinclair, Вы писали:

V>>Честно говоря, иронию не уловил.

S>Простейший способ получить индексирование кода — switch стейтмент. Можно воспроизводить его руками, но тогда не гарантирована оптимальность. Компилятор, как правило, лучше знает как поступать — строить таблицу, цепочку ифов или двоичное дерево.

У него только одно неудобство: в рантайме не меняется.
<<RSDN@Home 1.1.4 stable SR1 rev. 568>>
Music: Ricchi a Poveri — Come Vorrei

Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Re[4]: Вложенные ветвления
От: Jandor Россия  
Дата: 29.11.05 05:33
Оценка:
Здравствуйте, Sinclair, Вы писали:
S>Простейший способ получить индексирование кода — switch стейтмент. Можно воспроизводить его руками, но тогда не гарантирована оптимальность. Компилятор, как правило, лучше знает как поступать — строить таблицу, цепочку ифов или двоичное дерево.

Я вообще не об этом говорил.

Помните всякие редакторы, где можно одни объекты относительно других выравнивать по положению и размерам? Вот пример кода. Все присвоения и получения значений параметризованы нужным видом выравнивания.
type
TAlignment =   (alLeft, alRight, alTop, alBottom, alHorizontal, alVertical, alEqualHeight,  alEqualWidth);

...

procedure TSelection.Align(Alignment: TAlignment);
var
  i,Value: Integer;

begin
  if PrimitiveCount > 0 then
  begin
    Value := TPrimitive(Primitives[0]).GetCoord(Alignment);
    for i := 1 to PrimitiveCount - 1 do
      TPrimitive(Primitives[i]).SetCoord(Alignment, Value);
  end;
end;


Получается, что Alignment — это почти индекс координат примитива. Где я накосячил в терминах ?
[yellow leaf]
Re[5]: Вложенные ветвления
От: Sinclair Россия https://github.com/evilguest/
Дата: 29.11.05 05:58
Оценка:
Здравствуйте, Jandor, Вы писали:

J>Получается, что Alignment — это почти индекс координат примитива. Где я накосячил в терминах ?

И что? Какое это отношение имеет к вложенности ветвлений? Если у тебя много однообразного кода внутри перегруженных TPrimitive.GetCoord/SetCoord, то ты можешь вынести его в другой класс:
TAlignment = class
   function GetCoord(primitive: TPrimitive): integer; abstract;
     procedure SetCoord(primitive: TPrimitive; value: integer); abstract;
end;



Тогда твой код станет таким:
procedure TSelection.Align(Alignment: TAlignment);
var
  i,Value: Integer;

begin
  if PrimitiveCount > 0 then
  begin
    Value := Alignment.GetCoord(Primitives[0]);
    for i := 1 to PrimitiveCount - 1 do
      Alignment.SetCoord(Primitives[i], Value);
  end;
end;


при условии, что будут соотв. классы:
function TLeftAlignment.GetCoord(primitive: TPrimitive): integer; 
begin
  Result:= primitive.Left;
end;

procedure TLeftAlignment.SetCoord(primitive: TPrimitive; value: integer); 
begin
  primitive.Left = value;
end;
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.