|
Программирование >> Проектирование интерфейса пользователя
Процедура листинга 14.2 выполняет анализ коэффициента интеллекта (IQ) и возвращает строку текста, отвечающую значению IQ. Задача весьма проста, но код чрезвычайно труден для чтения (не так ли?), поскольку отступы введены удивительно неряшливо. (Текст настолько безобразен, что я испытывал затруднения при его наборе.) А теперь взгляните на листинг 14.3. Листинг 14.3. Пример удачного использования отступов 2: 3: 4: 5 6 7 Function GetIQText 1 IQ As Integer ) As String If IQ < 79 Then GetlQText = Коэффиент ниже 79 свидетельствует о серьезном интеллектуальном отставании Elself IQ >=79 And IQ < 90 Then GetlQText = Низкий или средний уровень интеллекта Elself IQ >= 90 And IQ < 105 Then GetlQText = Нормальный уровень интеллекта Else GetlQText = Интеллект выше нормального End If End Function 14.3 содержит тот же код, что и листинг 14.2, но на сей раз текст просто радует глаз, и все благодаря какой-то, казалось бы, мелочи - правильному выравниванию текста. Обратите внимание на отступы и пустые линии, выделяющие тело функции на фоне ее начальной и завершающей строк. Служебные слова условной конструкции If выровнены по одной позиции; выражения, соответствующие каждому из условий, сдвинуты вправо еще на один символ табуляции. Отступы одновременно упрощают восприятие строк кода и определяют уровни их вложенности: теперь понятно, что конструкция If принадлежит функции GetlQText, а каждое из выражений присваивания отвечает определенному условию. Наконец, листинг 14.4 представляет вашему вниманию лучшую (по мнению автора) реализацию той же функции. Листинг 14.4. Пример использования выражения Select Case 4 : 5: 6: 7: 8: 9: 10: 11: 12 : 13: 14: 15: 16: Function GetlQText ( ByVal IQ As Integer ) As String Const RETARDED = Коэффиент ниже 79 свидетельствует о серьезном интеллектуальном отставании Const LOW = Низкий или средний уровень интеллекта Const NORMAL = Нормальный уровень интеллекта Const ABOVE NORMAL = Интеллект выше нормального Select Case IQ Case Is < 79 GetlQText Case Is < 90 GetlQText Case Is < 105 GetlQText Case Else GetlQText RETARDED NORMAL ABOVE NORMAL 17: 18: 19 End Select End Function 14.4 содержит третий (вероятно, самый удачный) вариант 1ции анализа уровня интеллекта. (Возможно, после знакомства с улучшенным кодом незаметно повысится и ваш собственный IQ.) Текстовые константы вынесены в отдельный блок, им присвоены конкретные наименования. Строки конструкции Select Case подвергнуты тщательному выравниванию с помощью отступов и выглядят безупречно. Какупростить код Существует целый ряд стратегий, позволяющих облегчить работу с программным кодом. Хорошо, если эти простые правила, перечисленные ниже, со временем станут настолько привычными, что вы сможете руководствоваться ими, не затрудняя себя лишними раздумьями. Избегайте использования вложенных условных конструкций. Чаще используйте процедуры и функции. Создавайте короткие и уместные процедуры. Применяйте указанные правила на практике, и код заметно упростится. Вы сможете без труда вносить в него необходимые исправления и повторно использовать готовые фрагменты в новых проектах. Нет - вложенным условным конструкциям К сожалению, существует практика создания конструкций Select Case и If Then, вложенных одна в другую. В подобных случаях код приобретает такой вид: If Условие! Then If Условие2 Then End If Else If УсловиеЗ Then Elself Условие4 Then If Условие5 Then End If Else End If End If Это еще не самый плохой вариант - все может быть гораздо хуже. Стоит забыть об использовании отступов и добавить побольше строк, описывающих последовательность действий для каждого из условий, - и код максимально будет напоминать подгоревшую молочную кашу. И вновь, повторюсь, никого не следует подозревать в злых намерениях - обычные небрежность, халатность и легкомыслие. Одна и та же программа может выглядеть и вопиюще скверно, и просто здорово - все зависит от профессионализма, последовательности в применении названных правил, от элементарной аккуратности. Новый термин Разложение на элементарные операции подобно разложению на множители в математике. В программировании это означает разбиение повторяющегося кода на процедуры или классы, которые помещаются в программу только один раз. Например, если один и тот же набор из 10 строк повторяется в программе несколько раз, переместите его в процедуру и замените повторяющиеся строки вызовом этой процедуры. Приведенный фрагмент легко переписать следующим образом: If Условие! Then Call Процедура! Else Call Процедура2 End If Процедура! реализует цепочку действий, выполняемых в том случае, если Условие! становится истинным, а Процедура2 соответствует обратной ситуации. Созданные процедуры также, в свою очередь, могут быть упрощены за счет построения дополнительных процедур и функций. Код, таким образом, становится понятным и совершенно прозрачным. Да - процедурам и функциям Вынесение строк кода в отдельные блоки - процедуры и функции - упрощает задачу сопровождения программы и повторного использования ее фрагментов. Рассмотрим конструкцию Select Case. Если вы разместите строки, обрабатывающие каждый случай (case), в том же блоке, где размещено само выражение Select Case, возможность повторного использования такого кода окажется ограниченной узким конкретным контекстом. Взгляните на следующий фрагмент: Select Case Условие Case Значение!: Case Значение2: Case Else End Select Если вы введете строки для обработки всех случаев здесь же, непосредственно в теле выражения Select Case, о возможности повторного применения кода придется просто забыть. Но если каждому случаю будет поставлена в соответствие отдельная процедура, вы сможете гораздо легче использовать их в текущем или новых проектах. Разумеется, нельзя воспринимать подобный совет как догму - это всего лишь предостережение. Если код Select Case настолько же прост, как тот, который приведен в листинге 14.4, дополнительные процедуры не потребуются. Но если вы видите, что условная конструкция имеет тенденцию к усложнению, исследуйте возможность расчленения ее на части с помощью процедур и функций. Создавайте короткие и уместные процедуры Ранее уже говорилось о том, что удобно, называя процедуры, использовать наименования, состоящие из глагола, который описывает выполняемую операцию, и существительного, указывающего на объект воздействия. Из этого правила вытекает следующее требование: процедура должна выполнять только те операции, о которых свидетельствует ее название. Часто, например, возникает ситуация, когда необходимо снабдить программу дополнительными средствами обработки ошибок. Далее будет рассмотрена функция, которая открывает файл и возвращает номер открытого файла. Если задача требует, чтобы файл существовал, целесообразно написать не одну, а две функции, одна из которых вызывает другую. Изучите текст листинга 14.5. Листинг 14.5. Пример построения иерархии функций 1: Function 1е ( ByVal FileName As String ) As Double 2: DoOpenFile = FreeFile 3 : Open FileName For Random As #DoOpenFile 4 : End Function 5
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |