Форум: "Начинающим";
Текущий архив: 2009.10.04;
Скачать: [xml.tar.bz2];
ВнизПомогите с if... then Найти похожие ветки
← →
bag (2009-08-04 02:42) [0]есть переменная flag:boolean;
есть такой код:if (grid.cells[i,j] = "+") or (grid.cells[i,j]) then
begin
...
здесь строчек 20
...
end;
мне нужно изменять это условие в зависимости от flag если тру
то будет if (grid.cells[i,j] = "+") or (grid.cells[i,j]) then
если фэлс, то if (grid.cells[i,j] = "#") then
я конечно могу написатьif flag then
if (grid.cells[i,j] = "+") or (grid.cells[i,j]) then
begin
...
код один и тот же
...
end else
if (grid.cells[i,j] = "#") then
begin
...
код один и тот же
...
end;
но это увеличивает код, хочется покомпактней
← →
bag (2009-08-04 02:43) [1]не if (grid.cells[i,j] = "+") or (grid.cells[i,j]) then
а if (grid.cells[i,j] = "+") or (grid.cells[i,j] = "-")
← →
bag (2009-08-04 02:45) [2]я пишу функцию, в зависимости от флага -тру фэлс, надо изменять условие
← →
oldman © (2009-08-04 03:07) [3]
> if flag then
> if (grid.cells[i,j] = "+") or (grid.cells[i,j]) then
> begin
> ...
> код один и тот же> ...
> end else
> if (grid.cells[i,j] = "#") then
> begin
> ...
> код один и тот же
> ...
> end;
if (flag and ((grid.cells[i,j] = "+") or (grid.cells[i,j]))) or (not flag and grid.cells[i,j] = "#") then
← →
bag (2009-08-04 03:49) [4]и вправду, спасибо!
← →
oldman © (2009-08-04 04:07) [5]Но (имхо) лучше
if grid.cells[i,j] = a then ...
А при смене флага менять а.
← →
Kolan © (2009-08-04 10:43) [6]Можно использовать паттерн Стратегию. Смысл в том, что условия нужно поместить в разные объекты и создавать нужный в зависимости от класса.
Это весьма универсальное средство устранения дублирующегося кода (это вы и пытаетесь сделать и это очень правильно) и оно может оказаться слишком громоздким в данном случае. Попробуйте в начале совет [5].
← →
Дмитрий Белькевич (2009-08-04 12:51) [7]
> Можно использовать паттерн Стратегию. Смысл в том, что условия
> нужно поместить в разные объекты и создавать нужный в зависимости
> от класса.
То, что вы пишете, лучше давать с примерами: было-стало. Даже я ничего не понял.
> мне нужно изменять это условие в зависимости от flag если
> труто будет if (grid.cells[i,j] = "+") or (grid.cells[i,
> j]) thenесли фэлс, то if (grid.cells[i,j] = "#") then
Если я верно понял, то у себя я это делаю так. Я сделал небольшую функцию:
function CaseOf(const s: string; const Cases: array of string; DefaultValue: integer = DEFAULTCASE): integer; overload;
var
i: integer;
begin
Result := DefaultValue;
if s = "" then
Exit;
for i := 0 to High(Cases) do
if Cases[i] = s then
begin
Result := i;
Break;
end;
end;
Используется, например, так:
if CaseOf(s, ["a\l", "p\r", "a\fl", "p\fr"]) <> MaxInt then
VFlip;
Или так:
type
TTextJust = (tjLeft, tjRight, tjCenter, tjUnknown);
function CaseJust(const s: string): TTextJust;
begin
Result := TTextJust(CaseOf(s, ["LEFT", "RIGHT", "CENTER"], Integer(High(TTextJust))));
end;
Или (твой случай):
case CaseOf(BOP.Extension, ["BMP", "JPG", "TIFF", "DCM"]) of
0: if FPrevSlice.LoadData(True, nil, nil) then
FPrevSlice.SaveToBMP(s);
1: if FPrevSlice.LoadData(True, nil, nil) then
FPrevSlice.SaveToJpeg(s);
2: if FPrevSlice.LoadData(True, nil, nil) then
FPrevSlice.SaveToTIFF(s, False);
3: if not StrMatchB("**", FileName) then
Windows.CopyFile(PChar(FileName), PChar(s), False);
end;
← →
Дмитрий Белькевич (2009-08-04 12:54) [8]Да, DEFAULTCASE = MaxInt
← →
Игорь Шевченко © (2009-08-04 12:59) [9]
> Я сделал небольшую функцию
Все придумано до нас
StrUtils.IndexText
← →
Leonid Troyanovsky © (2009-08-04 13:03) [10]
> Дмитрий Белькевич (04.08.09 12:51) [7]
> Если я верно понял, то у себя я это делаю так. Я сделал
> небольшую функцию:
IdentToInt function.
> Или так:
TypInfo.GetEnumValue
--
Regards, LVT.
← →
Дмитрий Белькевич (2009-08-04 13:17) [11]
> StrUtils.IndexText
Мда... И код почти совпадает :)
function AnsiIndexText(const AText: string;
const AValues: array of string): Integer;
var
I: Integer;
begin
Result := -1;
for I := Low(AValues) to High(AValues) do
if AnsiSameText(AText, AValues[I]) then
begin
Result := I;
Break;
end;
end;
> Все придумано до нас
Это да, только часто бывает быстрее написать чем найти ;)
Единственное, мне разрядозависимость важна бывает.
> IdentToInt function.> Или так:TypInfo.GetEnumValue
Спасибо, этого тоже не нашел.
← →
Kolan © (2009-08-04 13:42) [12]
> Даже я ничего не понял.
Пример для вас есть в GoF.
← →
Дмитрий Белькевич (2009-08-04 13:45) [13]
> Пример для вас есть в GoF.
Простите меня, сирого и убогого. Что есть GoF?
← →
Kolan © (2009-08-04 15:09) [14]GoF, дмитрий, это акроним английских слов Gang of Four, то есть Банда четырех.
Так назвали себя Эрих Гамма, Ричард Хелм, Ральф Джонсон и Джон Влиссидес — программисты, которые и написали книгу про паттерны проектирования.
http://ru.wikipedia.org/wiki/%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D1%8B_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F
Прочтите её — очень интересная книга, классика, советую.
← →
Дмитрий Белькевич (2009-08-04 15:53) [15]
> Так назвали себя Эрих Гамма, Ричард Хелм, Ральф Джонсон
> и Джон Влиссидес — программисты, которые и написали книгу
> про паттерны проектирования.
> Прочтите её — очень интересная книга, классика, советую.
Ясно, спасибо. Воздержусь. Как-то литературу давно не читаю - мало свободного времени.
Однако пример на Delphi был бы интересен, здесь:
http://ru.wikipedia.org/wiki/Strategy
не нашел, обсуждать не совсем понятно что - лучше бы был конкретный код.
Ну а так как кода нет - не будем гадать на кофейной гуще - обсуждать нечего.
← →
Kolan © (2009-08-04 16:13) [16]Дмитрий, если у вас есть под рукой Делфи 2006 и старше, что вы можете сгенерировать пример самостоятельно. Надо зайти в моделирование и дальше в контекстном меню
Create by pattern
.
IState = interface
procedure Handle;
end;
TContext = class
public
procedure SomeOperation;
strict private
var
///<link>aggregation</link>
FState:IState;
public
procedure SetState(AState :IState);
end;
TConcreteState = class(TInterfacedObject, IState)
public
procedure Handle;
end;
procedure TContext.SomeOperation;
begin
FState.Handle();
end;
procedure TContext.SetState(AState :IState);
begin
FState := AState;
end;
procedure TConcreteState.Handle;
begin
{put your code for this particular state here}
end;
Как видно из примера нужная функциональность помещается в объекты, называемые состояниями. Когда нужно изменить функциональность, создается нужный объект и вызываются его методы.
← →
Игорь Шевченко © (2009-08-04 16:27) [17]Дмитрий Белькевич (04.08.09 15:53) [15]
> Ясно, спасибо. Воздержусь
Зря воздерживаешься, книга полезная. Другое дело, что в данном конкретном случае она малоприменима, но это уже частности.
← →
Дмитрий Белькевич (2009-08-04 16:34) [18]
> Как видно из примера нужная функциональность помещается
> в объекты, называемые состояниями. Когда нужно изменить
> функциональность, создается нужный объект и вызываются его
> методы.
То есть вместо
case CaseOf(BOP.Extension, ["BMP", "JPG", "TIFF", "DCM"]) of
Предлагается использовать "полотно" на несколько страниц текста. Стоит ли оно того?
← →
Kolan © (2009-08-04 16:40) [19]Этот паттерн можно использовать, если надо варьировать поведение. В начале ветки требовалось именно это. Кроме того, я еще раньше говорил, что в столь простом случае его применять будет не выгодно.
Думаю дальше обсуждать паттерны не стоит. В книге подробно расписано назначение, применимость примеры использования и недостатки каждого из них, книгу вы не читали, а пересказывать её своими словами не хочется.
← →
Дмитрий Белькевич (2009-08-04 20:30) [20]
> Зря воздерживаешься, книга полезная. Другое дело, что в
> данном конкретном случае она малоприменима, но это уже частности.
>
Ок, посмотрю как-нибудь. Не то, что бы категорически против литературы, просто однообразная макулатура надоела.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.10.04;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.007 c