<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=324113&amp;view=findpost&amp;p=2810993</guid>
        <pubDate>Tue, 25 Jan 2011 03:25:07 +0000</pubDate>
        <title>Маленькие хитрости</title>
        <link>https://forum.sources.ru/index.php?showtopic=324113&amp;view=findpost&amp;p=2810993</link>
        <description><![CDATA[--Ins--: Хотел бы поделиться некоторыми маленькими хитростями, позволяющими сократить объем кода, возможно вам пригодятся.<br>
<br>
<strong class='tag-b'>1. Использование функции IfThen</strong><br>
Об этой функции мало кто знает, но на мой взгляд она заслуживает внимания. Объявлена она (а точнее - они, несколько перегруженных вариантов) в модуле Math. Эта простая функция подобна оператору IIF в VB, т.е. имеет три операнда: логическое выражение, значение при истинности выражения, значение при ложности выражения. Это позволяет вместо:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">if Conditional then</div><div class="code_line">&nbsp;&nbsp;X := Y</div><div class="code_line">else</div><div class="code_line">&nbsp;&nbsp;X := Z;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
писать<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">X := IfThen(Conditional, Y, Z);</div></ol></div></div></div></div><br>
Пример:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">K := IfThen(Width &#62; Height, Width / Height, Height / Width);</div></ol></div></div></div></div><br>
ВАЖНО: Не следует забывать что IfThen - это функция, а значит все параметры считаются перед вызовом всегда. Поэтому нельзя функцию использовать примерно таким образом:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Value := IfThen(List.Count &#62; 0, List[0], 0);</div></ol></div></div></div></div><br>
Этот код приведет к исключению, если List.Count = 0, т.к. попытка вычислить параметр List[0] будет предпринята в любом случае вне зависимости от значения первого параметра. Здесь уже нужно явно писать<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">if List.Count &#62; 0 then</div><div class="code_line">&nbsp;&nbsp;Value := List[0]</div><div class="code_line">else</div><div class="code_line">&nbsp;&nbsp;Value := 0;</div></ol></div></div></div></div><br>
<br>
<strong class='tag-b'>2. Использование функций Min/Max</strong><br>
Про эти функции из модуля Math тоже часто забывают, а напрасно. Смотрите насколько удобнее вместо<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">A := A - 1;</div><div class="code_line">if A &#60; 0 then</div><div class="code_line">&nbsp;&nbsp;A := 0;</div></ol></div></div></div></div><br>
писать<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">A := Max(0, A - 1);</div></ol></div></div></div></div><br>
Еще примеры использования<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">A := Min(255, A + 1); // Не позволяем A превысить 255</div><div class="code_line">A := Min(255, Max(0, B)); // Не позволяем A выйти за границы 0..255</div></ol></div></div></div></div><br>
<br>
<strong class='tag-b'>3. Процедура двойного присваивания</strong><br>
Напишем простую процедуру:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure DoubleSet(var A, B: Extended; val_A, val_B: Extended);</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;A := val_A;</div><div class="code_line">&nbsp;&nbsp;B := val_B;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
Ну и зачем нужна такая примитивная функция, спросите вы. Что мешает в случае нужды просто присвоить двум переменным новое значение? А вот в чем вся соль: опять таки, не забываем, что аргументы функции всегда рассчитываются до ее вызова. Что это дает? Задача номер раз: поменять местами два значения. В классическом решении мы заведем третью переменную и методом трех стаканов поменяем значния местами. Используя же нашу функцию мы просто пишем:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">DoubleSet(A, B, B, A);</div></ol></div></div></div></div><br>
Задача номер два: вычислить элементы последовательности Фибоначчи (каждое следующее число равно сумме двух предыдущих)<br>
Смотрите как изящно эта задача решается используя нашу функцию:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">DoubleSet(A, B, 0, 1);</div><div class="code_line">while b &#60; 100 do begin // Выведем все число до 100</div><div class="code_line">&nbsp;&nbsp;writeln(B);</div><div class="code_line">&nbsp;&nbsp;DoubleSet(A, B, B, A + B);</div><div class="code_line">end;</div></ol></div></div></div></div>]]></description>
        <author>--Ins--</author>
        <category>Hello, World&#33;</category>
      </item>
	
      </channel>
      </rss>
	