Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
4-1219051817
trueTRIx
2008-08-18 13:30
2009.10.04
Вывести имена параметров ветки реестра.


15-1248597219
Kerk
2009-07-26 12:33
2009.10.04
Колбаса


8-1190981674
Inspired
2007-09-28 16:14
2009.10.04
Использование пульта ДУ для альт. целей


1-1218185285
pogi
2008-08-08 12:48
2009.10.04
1С OLE запись - в полях значения "<>"


2-1248674704
aza
2009-07-27 10:05
2009.10.04
ADO MS Jet прочитать не-коммитет данные





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский