Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите с if... then


bag ©   (2009-08-04 02:42:00) 

есть переменная 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;

но это увеличивает код, хочется покомпактней


Дмитрий Белькевич   (2009-08-04 20:30:00) [1]


> Зря воздерживаешься, книга полезная. Другое дело, что в
> данном конкретном случае она малоприменима, но это уже частности.
>


Ок, посмотрю как-нибудь. Не то, что бы категорически против литературы, просто однообразная макулатура надоела.


Kolan   (2009-08-04 16:40:00) [2]

Этот паттерн можно использовать, если надо варьировать поведение. В начале ветки требовалось именно это. Кроме того, я еще раньше говорил, что в столь простом случае его применять будет не выгодно.

Думаю дальше обсуждать паттерны не стоит. В книге подробно расписано назначение, применимость примеры использования и недостатки каждого из них, книгу вы не читали, а пересказывать её своими словами не хочется.


Дмитрий Белькевич   (2009-08-04 16:34:00) [3]


> Как видно из примера нужная функциональность помещается
> в объекты, называемые состояниями. Когда нужно изменить
> функциональность, создается нужный объект и вызываются его
> методы.


То есть вместо


case CaseOf(BOP.Extension, ['BMP', 'JPG', 'TIFF', 'DCM']) of


Предлагается использовать 'полотно' на несколько страниц текста. Стоит ли оно того?


Игорь Шевченко   (2009-08-04 16:27:00) [4]

Дмитрий Белькевич   (04.08.09 15:53) [15]


> Ясно, спасибо. Воздержусь


Зря воздерживаешься, книга полезная. Другое дело, что в данном конкретном случае она малоприменима, но это уже частности.


Kolan   (2009-08-04 16:13:00) [5]

Дмитрий, если у вас есть под рукой Делфи 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 15:53:00) [6]


> Так назвали себя Эрих Гамма, Ричард Хелм, Ральф Джонсон
> и Джон Влиссидес — программисты, которые и написали книгу
> про паттерны проектирования.



> Прочтите её — очень интересная книга, классика, советую.


Ясно, спасибо. Воздержусь. Как-то литературу давно не читаю - мало свободного времени.

Однако пример на Delphi был бы интересен, здесь:

http://ru.wikipedia.org/wiki/Strategy

не нашел, обсуждать не совсем понятно что - лучше бы был конкретный код.

Ну а так как кода нет - не будем гадать на кофейной гуще - обсуждать нечего.


Kolan   (2009-08-04 15:09:00) [7]

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 13:45:00) [8]


> Пример для вас есть в GoF.


Простите меня, сирого и убогого. Что есть GoF?


Kolan   (2009-08-04 13:42:00) [9]


> Даже я ничего не понял.

Пример для вас есть в GoF.


Дмитрий Белькевич   (2009-08-04 13:17:00) [10]


> 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


Спасибо, этого тоже не нашел.


Leonid Troyanovsky   (2009-08-04 13:03:00) [11]


> Дмитрий Белькевич   (04.08.09 12:51) [7]

> Если я верно понял, то у себя я это делаю так. Я сделал
> небольшую функцию:

IdentToInt function.

> Или так:

TypInfo.GetEnumValue

--
Regards, LVT.


Игорь Шевченко   (2009-08-04 12:59:00) [12]


> Я сделал небольшую функцию


Все придумано до нас

StrUtils.IndexText


Дмитрий Белькевич   (2009-08-04 12:54:00) [13]

Да, DEFAULTCASE = MaxInt


Дмитрий Белькевич   (2009-08-04 12:51:00) [14]


> Можно использовать паттерн Стратегию. Смысл в том, что условия
> нужно поместить в разные объекты и создавать нужный в зависимости
> от класса.


То, что вы пишете, лучше давать с примерами: было-стало. Даже я ничего не понял.


> мне нужно изменять это условие в зависимости от 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;


Kolan   (2009-08-04 10:43:00) [15]

Можно использовать паттерн Стратегию. Смысл в том, что условия нужно поместить в разные объекты и создавать нужный в зависимости от класса.

Это весьма универсальное средство устранения дублирующегося кода (это вы и пытаетесь сделать и это очень правильно) и оно может оказаться слишком громоздким в данном случае. Попробуйте в начале совет [5].


oldman   (2009-08-04 04:07:00) [16]

Но (имхо) лучше
if grid.cells[i,j] = a then ...
А при смене флага менять а.


bag   (2009-08-04 03:49:00) [17]

и вправду, спасибо!


oldman   (2009-08-04 03:07:00) [18]


> 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 02:45:00) [19]

я пишу функцию, в зависимости от флага -тру фэлс, надо изменять условие


bag   (2009-08-04 02:43:00) [20]

не if (grid.cells[i,j] = '+') or (grid.cells[i,j]) then
а if (grid.cells[i,j] = '+') or (grid.cells[i,j] = '-')


Наверх

Титульная страница Поиск, карта сайта Написать письмо