Модератор: Модераторы
pupsik писал(а):"оптимизированная ИДЕ
zub писал(а):Откуда такие мысли в головах? Ненадо такое постить на форумах - вводить в заблуждение читающих
zub писал(а):Смысл очень большой - чтоб не возникало веры в "неполные" формы if-else
вы забыли о: упс...На этом претензии к нему заканчиваются.
zub писал(а): На этом претензии к нему заканчиваются.
zub писал(а): Если бы ты использовал отладчик, то пару раз нажав F8 понял бы где накосячил - else относится не к тому if как ты планировал - забыл ;
zub писал(а):Например чтоб понять как работает.
zub писал(а):или исправить баг.
zub писал(а):Ветвистые ифы и кэйсы - в большинстве своем говнокод. надо обходиться без них.
zub писал(а):Не используя отладчик серьезную ошибку не поймать.
zub писал(а): Динамическая регистрация и последующий поиск и выполнение нужной ветки - гораздо лучше.
zub писал(а):С ростом сложности ружда будет всё чаще.
Лекс Айрин писал(а):Тут как с написанием художественных текстом -- хочешь чтобы было интересно, пиши сам.
zub писал(а):Динамическая регистрация и последующий поиск и выполнение нужной ветки - гораздо лучше.
program case2map;
uses
gmap{модуль описания TMap из fpc-stl},gutil{пара вспомогательных функций из fpc-stl};
type
TMyKey=Integer;//Тип ключа в мапе
TMyOnKeyProc=procedure;//Тип данных сопоставленных ключу в мапе
TMyKeyComparer=specialize TLess<TMyKey>;//стандартный компаратор из gutil, нужен для сортировки ключей
TMyCase2Map=class(specialize TMap<TMyKey,TMyOnKeyProc,TMyKeyComparer>)//собственно сам класс
procedure doit(key:TMyKey);//ищем ключ, если есть - вызываем сопоставленную ему процедуру, если нет делаем чето другое
end;
var
MyCase:TMyCase2Map;
procedure on1proc;//выполняется для 1
begin
writeln('on1proc');
end;
procedure on2proc;//выполняется для 2
begin
writeln('on2proc');
end;
procedure on100proc;//выполняется для 100
begin
writeln('on100proc');
end;
procedure TMyCase2Map.doit(key:TMyKey);
var
proc:TMyOnKeyProc;
begin
if TryGetValue(key,proc) then //пробуем найти ключ
proc() //если нашли запускаем процедуру
else
writeln('Do Something else, key=',key) //не нашли, аналог case else
end;
begin
MyCase:=TMyCase2Map.Create;
MyCase.Insert(100,@on100proc); //регистрируем процедуру для 100
MyCase.Insert(2,@on2proc);//регистрируем процедуру для 2
MyCase.Insert(1,@on1proc);//регистрируем процедуру для 1
MyCase.doit(1);//пробуем выполнить чтото для 1
MyCase.doit(22);//пробуем выполнить чтото для 22
MyCase.doit(2);//пробуем выполнить чтото для 2
MyCase.doit(33);//пробуем выполнить чтото для 33
MyCase.doit(100);//пробуем выполнить чтото для 100
MyCase.Destroy;//денег нет, вы держитесь тут. хорошего настроения
readln;
end.
on1proc
Do Something else, key=22
on2proc
Do Something else, key=33
on100proc
zub писал(а):if TryGetValue(key,proc) then //пробуем найти ключ
generic TSet<T, TCompare>=class ....
function TSet.NFind(value:T):PNode;inline;
var x:PNode;
begin
x:=FBase;
while(x <> nil) do begin
if(TCompare.c(value,x^.Data)) then x:=x^.Left
else if(TCompare.c(x^.Data,value)) then x:=x^.Right
else begin
exit(x);
end;
end;
exit(nil);
end;
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5