Подскажите. Здесь на сайте видел пост, где человек сказал, что после Хаскеля имеет привычку заменять конструкции со вложенными проверками условий на массив, содержщий указатели на функции, где происходят нужные действия, а индексом является само условие. К сожалению, не могу найти, где я это прочитал. Объясните идею на пальцах, применительно к С++.
Здравствуйте, voxel3d, Вы писали: V>Подскажите. Здесь на сайте видел пост, где человек сказал, что после Хаскеля имеет привычку заменять конструкции со вложенными проверками условий на массив, содержщий указатели на функции, где происходят нужные действия, а индексом является само условие. Это?
Здравствуйте, voxel3d, Вы писали:
V>Подскажите. Здесь на сайте видел пост, где человек сказал, что после Хаскеля имеет привычку заменять конструкции со вложенными проверками условий на массив, содержщий указатели на функции, где происходят нужные действия, а индексом является само условие. К сожалению, не могу найти, где я это прочитал. Объясните идею на пальцах, применительно к С++.
switch(resultCode)
{
case 1: ...
case 2: ...
}
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, voxel3d, Вы писали:
V>Честно говоря, иронию не уловил.
Простейший способ получить индексирование кода — switch стейтмент. Можно воспроизводить его руками, но тогда не гарантирована оптимальность. Компилятор, как правило, лучше знает как поступать — строить таблицу, цепочку ифов или двоичное дерево.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
V>>Честно говоря, иронию не уловил. S>Простейший способ получить индексирование кода — switch стейтмент. Можно воспроизводить его руками, но тогда не гарантирована оптимальность. Компилятор, как правило, лучше знает как поступать — строить таблицу, цепочку ифов или двоичное дерево.
У него только одно неудобство: в рантайме не меняется.
<<RSDN@Home 1.1.4 stable SR1 rev. 568>>
Music: Ricchi a Poveri — Come Vorrei
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, 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 — это почти индекс координат примитива. Где я накосячил в терминах ?
Здравствуйте, 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
Уйдемте отсюда, Румата! У вас слишком богатые погреба.