Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.10.04;
Скачать: CL | DM;

Вниз

Помогите с 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.018 c
2-1248115102
thing
2009-07-20 22:38
2009.10.04
3D игра - переход от управления с клавы на мышь


15-1249148976
anton773
2009-08-01 21:49
2009.10.04
где можно прочитать про CDO_TLB и ADODB_TLB


15-1248830322
sm1t
2009-07-29 05:18
2009.10.04
Буржуи уже хоронят РФ


2-1248638233
Б
2009-07-26 23:57
2009.10.04
Ошибка в GetBitmapDimensionEx.


15-1248942849
Miob
2009-07-30 12:34
2009.10.04
Отключить обновление экрана монитора