На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Rouse_, jack128, Krid
  
    > Маленькие хитрости , использования простых функций для сокращения кода
      Хотел бы поделиться некоторыми маленькими хитростями, позволяющими сократить объем кода, возможно вам пригодятся.

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

      писать
      ExpandedWrap disabled
        X := IfThen(Conditional, Y, Z);

      Пример:
      ExpandedWrap disabled
        K := IfThen(Width > Height, Width / Height, Height / Width);

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

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


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

      писать
      ExpandedWrap disabled
        A := Max(0, A - 1);

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


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

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

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


      Рейтинг@Mail.ru
      [ Script execution time: 0,0210 ]   [ 16 queries used ]   [ Generated: 28.03.24, 10:27 GMT ]