Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Hello, World! > Маленькие хитрости


Автор: --Ins-- 25.01.11, 03:25
Хотел бы поделиться некоторыми маленькими хитростями, позволяющими сократить объем кода, возможно вам пригодятся.

1. Использование функции IfThen
Об этой функции мало кто знает, но на мой взгляд она заслуживает внимания. Объявлена она (а точнее - они, несколько перегруженных вариантов) в модуле Math. Эта простая функция подобна оператору IIF в VB, т.е. имеет три операнда: логическое выражение, значение при истинности выражения, значение при ложности выражения. Это позволяет вместо:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    if Conditional then
      X := Y
    else
      X := Z;

писать
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    X := IfThen(Conditional, Y, Z);

Пример:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    K := IfThen(Width > Height, Width / Height, Height / Width);

ВАЖНО: Не следует забывать что IfThen - это функция, а значит все параметры считаются перед вызовом всегда. Поэтому нельзя функцию использовать примерно таким образом:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    Value := IfThen(List.Count > 0, List[0], 0);

Этот код приведет к исключению, если List.Count = 0, т.к. попытка вычислить параметр List[0] будет предпринята в любом случае вне зависимости от значения первого параметра. Здесь уже нужно явно писать
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    if List.Count > 0 then
      Value := List[0]
    else
      Value := 0;


2. Использование функций Min/Max
Про эти функции из модуля Math тоже часто забывают, а напрасно. Смотрите насколько удобнее вместо
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    A := A - 1;
    if A < 0 then
      A := 0;

писать
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    A := Max(0, A - 1);

Еще примеры использования
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    A := Min(255, A + 1); // Не позволяем A превысить 255
    A := Min(255, Max(0, B)); // Не позволяем A выйти за границы 0..255


3. Процедура двойного присваивания
Напишем простую процедуру:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    procedure DoubleSet(var A, B: Extended; val_A, val_B: Extended);
    begin
      A := val_A;
      B := val_B;
    end;

Ну и зачем нужна такая примитивная функция, спросите вы. Что мешает в случае нужды просто присвоить двум переменным новое значение? А вот в чем вся соль: опять таки, не забываем, что аргументы функции всегда рассчитываются до ее вызова. Что это дает? Задача номер раз: поменять местами два значения. В классическом решении мы заведем третью переменную и методом трех стаканов поменяем значния местами. Используя же нашу функцию мы просто пишем:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    DoubleSet(A, B, B, A);

Задача номер два: вычислить элементы последовательности Фибоначчи (каждое следующее число равно сумме двух предыдущих)
Смотрите как изящно эта задача решается используя нашу функцию:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    DoubleSet(A, B, 0, 1);
    while b < 100 do begin // Выведем все число до 100
      writeln(B);
      DoubleSet(A, B, B, A + B);
    end;

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)