<?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=48290&amp;view=findpost&amp;p=317535</guid>
        <pubDate>Mon, 15 Mar 2004 19:27:32 +0000</pubDate>
        <title>Delphi:Советы</title>
        <link>https://forum.sources.ru/index.php?showtopic=48290&amp;view=findpost&amp;p=317535</link>
        <description><![CDATA[Vit: Скопировал в FAQ. Большое спасибо за статью. Вот линк:<br>
<a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=48296' target='_blank'>Delphi. Работа над ошибками</a>]]></description>
        <author>Vit</author>
        <category>Hello, World&#33;</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=48290&amp;view=findpost&amp;p=317521</guid>
        <pubDate>Mon, 15 Mar 2004 19:12:26 +0000</pubDate>
        <title>Delphi:Советы</title>
        <link>https://forum.sources.ru/index.php?showtopic=48290&amp;view=findpost&amp;p=317521</link>
        <description><![CDATA[Song: ИМХО в FAQ её надо, в раздел Hello, World&#33;]]></description>
        <author>Song</author>
        <category>Hello, World&#33;</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=48290&amp;view=findpost&amp;p=317520</guid>
        <pubDate>Mon, 15 Mar 2004 19:12:15 +0000</pubDate>
        <title>Delphi:Советы</title>
        <link>https://forum.sources.ru/index.php?showtopic=48290&amp;view=findpost&amp;p=317520</link>
        <description><![CDATA[Art4: Я имел ввиду закачать статью на этот сервер, и ссылаться на него из соотв. раздела, чтобы незасорять такими объемами форум и по тематике будет]]></description>
        <author>Art4</author>
        <category>Hello, World&#33;</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=48290&amp;view=findpost&amp;p=317512</guid>
        <pubDate>Mon, 15 Mar 2004 19:08:08 +0000</pubDate>
        <title>Delphi:Советы</title>
        <link>https://forum.sources.ru/index.php?showtopic=48290&amp;view=findpost&amp;p=317512</link>
        <description><![CDATA[startinger: Кто ж тут что удалял? Google и то 3 ссылки выплюнул: <a class='tag-url' href='http://www.citforum.ru/programming/delphi/goodpract/' target='_blank'>http://www.citforum.ru/programming/delphi/goodpract/</a><br>
И ещё 2-е: одна русская эта же статья в формате doc, вторая- английская эта статья в формате doc.]]></description>
        <author>startinger</author>
        <category>Hello, World&#33;</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=48290&amp;view=findpost&amp;p=317496</guid>
        <pubDate>Mon, 15 Mar 2004 18:54:30 +0000</pubDate>
        <title>Delphi:Советы</title>
        <link>https://forum.sources.ru/index.php?showtopic=48290&amp;view=findpost&amp;p=317496</link>
        <description><![CDATA[Delphist: Ссылку не дам<br>На саййте материфл удвлили<br>Это - копия]]></description>
        <author>Delphist</author>
        <category>Hello, World&#33;</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=48290&amp;view=findpost&amp;p=317494</guid>
        <pubDate>Mon, 15 Mar 2004 18:51:27 +0000</pubDate>
        <title>Delphi:Советы</title>
        <link>https://forum.sources.ru/index.php?showtopic=48290&amp;view=findpost&amp;p=317494</link>
        <description><![CDATA[Art4: Может кинуть ссылку на этот топик в Книги по Дельфи, а это удалить.]]></description>
        <author>Art4</author>
        <category>Hello, World&#33;</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=48290&amp;view=findpost&amp;p=317489</guid>
        <pubDate>Mon, 15 Mar 2004 18:43:57 +0000</pubDate>
        <title>Delphi:Советы</title>
        <link>https://forum.sources.ru/index.php?showtopic=48290&amp;view=findpost&amp;p=317489</link>
        <description><![CDATA[Delphist: <em class='tag-i'>Автор оригинала Coder </em><br>
<strong class='tag-b'>Delphi. Работа над ошибками </strong> <br>
<br>
В течение своей профессиональной деятельности программист вырабатывает систему правил, которая позволяет ему не совершать допущенных ранее ошибок и избегать потенциально опасных ситуаций. Ценность правил заключается в том, что они ограждают программиста от не всегда очевидных проблем, дают возможность писать единообразный код и дают возможность поступать формально, тем самым, освобождая &quot;мыслительные&quot; ресурсы на решение поставленной задачи. <br>
<br>
Некоторые из рецептов моей кулинарной книги я хочу предложить на ваше суждение. Очевидность этих правил зависит от вашей квалификации. Согласие с ними зависит от вашей собственной системы. Их источником послужили мой личный опыт и опыт ошибок начинающих программистов, каждое поколение которых повторяет их, к сожалению, с завидной стабильностью . <br>
<br>
Выработанные правила направлены на: <br>
<br>
Повышение надежности работы программы, т.е. уменьшение вероятности возникновения ошибки. Вероятность возникновения ошибки существует всегда, никто не безгрешен (включая операционную систему). Задача программиста - свести эту вероятность к минимуму. <br>
Увеличение устойчивости программы - свойства, при котором она возвращается в стабильное состояние после возникновения возмущения (ошибки) (а не зависает, исчезает или уваливает операционную систему). <br>
Написание единообразного и легко поддерживаемого кода. <br>
 <br>
<strong class='tag-b'>Warnings and Hints</strong> <br>
<br>
 Компилятор Delphi снабжен &quot;анализатором&quot; качества кода. Он может предупреждать о потенциально опасных или бессмысленных ситуациях. Не пренебрегайте его услугами. <br>
<br>
<em class='tag-i'><strong class='tag-b'>Правило:</strong><br>
Добивайтесь, что бы ваша программа компилировалась без предупреждений и намеков. Даже если они не существенны, в последствии в их массе вы или пользователи вашей библиотеки могут не заметить более важные предупреждения.</em> <br>
 <br>
<strong class='tag-b'>Использование констант</strong> <br>
<br>
Используйте именованные константы. Это увеличивает &quot;настраиваемость&quot; исходного кода. А также избавляет от проблем связанных с изменением значения константы в случае ее множественного вхождения. <br>
<br>
<strong class='tag-b'>Range Check и Integer Overflow Check</strong> <br>
<br>
К сожалению, эти опции компилятора по умолчанию отключены в Delphi, и многие разработчики не пользуются их услугами, а зря. Появления этих ошибок говорит о наличии в программе семантических ошибок, таких как неправильная индексация массива или использование несоответствующего целочисленного типа. Последствия этих ошибок могут быть весьма коварны. Я советую оставлять эти флаги всегда включенными, независимо от того - это отладочная или &quot;финальная&quot; версия программы. Лучше иметь неработающую программу (или ее часть), чем программу работающую неправильно (IMHO). <br>
<br>
Отключать их имеет смысл, когда нет возможности исправить эту ошибку, как, например, в случае с ранними версиями VCL, скомпилированной с этими опциями. <br>
<br>
<strong class='tag-b'>Будьте недоверчивы</strong> <br>
<br>
 Очень часто алгоритмы кодируются из расчета на &quot;нормальный&quot; режим работы (достаточно ресурсов, присутствуют все необходимые компоненты, пользователи нажимают правильные комбинации клавиш и т.д.). Такие реализации очень плохо справляются с возникающими возмущениями. Во избежание этих проблем следуйте следующим простым правилам: <br>
<ul class="tag-list"><li>Проверяйте значения переменных на допустимость. Особенно это касается переменных типа указатель, процедурных переменных и объектов. </li><li>Защищайте пары выделение-освобождение ресурсов блоками try/finally. Предполагайте, что исключение может произойти в любом операторе. </li><li>Используйте процедуру Assert для проверки условий, которые всегда должны быть истинными.</li></ul> <br>
Объем кода, добавленный для проверок и обработки ошибок, может достигать порядка &quot;полезного&quot; кода&#33; Но, такой стиль программирования является необходимым условием при написании сложных систем. Что поделаешь, из бревен небоскреб не построишь <br>
<br>
<strong class='tag-b'>Значения по умолчанию и &quot;неопределенные&quot; значения </strong><br>
<br>
В логике распределения значений для переменных всегда необходимо предусматривать &quot;неопределенное&quot; значение и значение по умолчанию. Отсутствие таких значений достаточно часто приводят к семантическим ошибкам.<br>
<br>
<br>
<strong class='tag-b'>Правило №1:</strong><br>
 <br>
<em class='tag-i'><br>
Для указателей и объектов пустым значением должно являться значение nil. <br>
Для числовых типов лучше всего резервировать значение ноль. <br>
Для строковых переменных - пустая строка <br>
Для перечислимых типов необходимо предусмотреть специальное значение. <br>
Пример:<br>
TDayOfWeek = (dwNone,dwSun,dwMon,dwTue,dwWen,dwThu,dwFri,dwSat);</em><br>
 <br>
<strong class='tag-b'>Правило №2:</strong><br>
<em class='tag-i'>&quot;Неопределенными&quot; значениями лучше всего выбирать такие, чье двоичное представление соответствует нулю (нулям). Это увеличивает устойчивость, когда не выполнена начальная инициализация переменной, но произведена инициализация блока памяти, в котором она размещается.</em> <br>
<br>
<strong class='tag-b'>Пример</strong><br>
Для перечислимых типов &quot;неопределенное&quot; значение должно быть первым, так как оно соответствует целочисленному нулю. <br>
<br>
Инициализация переменных и полей <br>
<br>
Неинициализированные переменные часто становятся причинами возникновения ошибок-фантомов. Обычно они имеют нерегулярную природу, и их трудно выявить в процессе отладки. Особенно катастрофичными могут быть последствия при таком обращении с указателями. <br>
<br>
<em class='tag-i'><strong class='tag-b'>Правило:</strong><br>
 <ul class="tag-list"><li>Для глобальных переменных: использовать типизированные константы, инициализированные переменные или присваивать начальные значения переменным в секции инициализации модуля. </li><li>Для локальных переменных: присваивать начальные значения в первых строках процедуры или функции. </li><li>Для полей объектов: присваивать начальные значения полям в конструкторе и не полагаться на то, что память, выделенная под объект, инициализируется нулями. </li><li>Массивы, записи и выделенные блоки памяти очень удобно инициализировать при помощи функции FillChar. Но, с появлением в Delphi &quot;управляемых&quot; (manageable) типов (длинные строки, динамические массивы, варианты и интерфейсы), пользоваться ей необходимо с четким пониманием.</li></ul></em><br>
 <br>
<strong class='tag-b'>Пример</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">&nbsp;</div><div class="code_line">type</div><div class="code_line">&nbsp;&nbsp;TStrArray = array[1..10] of string;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;A : TStrArray;</div><div class="code_line">...</div><div class="code_line">&nbsp;&nbsp;FillChar(A, SizeOf(A), 0); </div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
 <br>
В данном примере вызов процедуры FillChar проинициализирует строки пустыми значениями, такой подход был нормальным в ранних версиях Delphi и Borland Pascal, но недопустим в последних версиях, в которых тип string по умолчанию соответствует типу LongString и суть указатель. Если значения строк перед инициализацией были не пусты, то мы получим утечку памяти. <br>
<br>
Передача параметров <br>
<br>
В Delphi параметры функций и процедур по умолчанию передаются по значению. Т.е. для них выделяется область памяти в стеке или куче, куда копируются оригинальные значения. При передаче параметров сложных типов (запись, массив, строка, вариант) это сопряжено со значительными расходами ресурсов, поэтому параметры этих типов желательно передавать по ссылке, т.е. с использованием ключевых слов var или const. Замечено, что наиболее типична эта ошибка при передаче параметра типа string. <br>
<br>
<strong class='tag-b'>Пример</strong><br>
 <br>
procedure Proc(s : string); //Не очень хорошо :(<br>
procedure Proc(const s : string); //Гораздо лучше :)<br>
<br>
Функции, процедуры и состояния <br>
<br>
Для начала словарь терминов: <br>
<br>
<strong class='tag-b'>Функция</strong> <br>
- это подпрограмма, задачей которой является получение (извлечение, вычисление и т.д.) определенного значения на основании входных параметров и текущего состояния системы. <br>
<strong class='tag-b'>Процедура</strong> <br>
- это подпрограмма, которая предназначена для выполнения каких либо действий над системой, и соответственно изменяет состояние системы. <br>
Просьба не путать эти определения с ключевыми словами function и procedure. <br>
<br>
<em class='tag-i'><strong class='tag-b'>Правило:</strong><br>
Подпрограмма должна быть либо функцией, либо процедурой. Не совмещайте эти две задачи в одной подпрограмме, разделите ее на несколько подпрограмм. </em><br>
<br>
(Продолжние см ниже ) <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='8' style='font-size:8pt;'><strong class='tag-b'>Добавлено в <time class="tag-mergetime" datetime="2004-03-15T18:44:38+00:00">15.03.04, 18:44</time></strong>:</span></span><br>
[QUOTE]<em class='tag-i'>Автор оригинала Coder </em><br>
<strong class='tag-b'>Контроль достижения предела </strong><br>
<br>
Исключения в обработчике события OnTimer <br>
<br>
При написания обработчика события OnTimer компонента TTimer необходимо учитывать, что возникновение исключения в нем для обычного Delphi приложения без специализированной обработки исключений приведет к выскакиванию диалога с сообщением об ошибке. Но это не останавливает работу таймера. И если причина возникновения исключения устойчива, то скоро вы увидите следующее сообщения и т.д., пока у системы не закончатся какие-нибудь ресурсы.<br>
<br>
Решить данную проблему можно несколькими способами:<br>
<ul class="tag-list"><li>Обрабатывать исключения непосредственно в обработчике события <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">&nbsp;</div><div class="code_line">try</div><div class="code_line">except</div><div class="code_line">&nbsp;&nbsp;on E: Exception do Application.ShowException(E);</div><div class="code_line">end; &nbsp;</div></ol></div></div></div></div></li><li>Использовать централизованный обработчик исключений, который фиксирует их в протоколе или журнале, но не выдает никаких сообщений об ошибке. <br>
Application.OnException := MyExceptionHandler;</li></ul><br>
Последний подход желательно использовать в серверных приложениях, когда нет пользователя, который интерактивно взаимодействует с приложением. <br>
<br>
Заключение <br>
<br>
Правила приведенные в этой статье носят общий характер. Практически всегда существуют исключения (такова природа правил J). Следование этим правилам, позволило мне добиться разработки устойчивого и единообразного кода. Буду признательным за любые дополнения, исправления, замечания, примечания, пожелания и критику (особенно конструктивную).]]></description>
        <author>Delphist</author>
        <category>Hello, World&#33;</category>
      </item>
	
      </channel>
      </rss>
	