Приложение 3

ФОНД ЭВРИСТИЧЕСКИХ ПРИЕМОВ ПРОЕКТИРОВАНИЯ ПРОГРАММ

1. ВЫБОР СТРАТЕГИИ ПРОЕКТИРОВАНИЯ ПРОГРАММ

1.1. Заменить восходящий способ проектирования программ нисходящим.

1.2. Инверсия приема.

1.3. Использовать комбинированный (восходяще-нисходящий) способ проектирования. В данном случае главная часть программы разрабатывается нисходящим способом, а отдельные модули и подсистемы — восходящим.

1.4. Использовать способ проектирования методом расширения ядра системы. В данном случае вначале создается оболочка, реализующая минимальный набор функций проектируемой системы, затем к данной оболочке (ядру) системы последовательно добавляются новые модули, расширяющие набор реализуемых функций.

2. ВЫБОР ПОДХОДА В ПРОГРАММИРОВАНИИ (методологии проектирования)

2.1. Заменить методологию, ориентированную на обработку (модульное программирование; функциональная декомпозиция; проектирование с использованием потока данных; структурное проектирование; технология структурного анализа проекта SADT; проектирование, основанное на использовании структур данных; методология Джексона; методология Уорнера и др.), на методологию, ориентированную на данные (абстракции данных Дейкстры, объектно-ориентированная методология; методология, ориентированная на проектирование концептуальных баз данных и др.).

2.2. Инверсия приема.

3. ВЫБОР ЯЗЫКА

3.1. Выбрать более "любимый" язык программирования.

3.2. Выбрать язык программирования, специально предназначенный для решения конкретной проблемы.

3.3. Заменить проблемно-ориентированный язык на объектно-ориентированный.

3.4. Инверсия приема.

3.5. Заменить язык высокого уровня языком низкого уровня.

3.6. Инверсия приема.

3.7. Использовать в проекте два и более языков программирования.

3.8. Подключать объектный код (откомпилированный с помощью компилятора другого языка программирования или ассемблер) с помощью директивы компилятора.

3.9. Использовать встроенный ассемблер системы программирования.

4. ПРЕОБРАЗОВАНИЕ АРХИТЕКТУРЫ, ИЛИ СТРУКТУРЫ ПРОГРАММНОЙ СИСТЕМЫ

4.1. Увеличить число модулей системы.

4.2. Инверсия приема.

4.3. Заменить глобальную переменную фактическим параметром, передаваемым модулю в качестве аргумента. Данным приемом исключается возможность непредвиденных изменений глобальных переменных.

4.4. Инверсия приема.

4.5. Заменить глобальные переменные локальными переменными.

4.6. Инверсия приема.

4.7. Произвести декомпозицию модуля на несколько. Данный прием позволяет распределить выполняемые функции между отдельными функциями.

4.8. Объединить несколько модулей в один. Данный прием дает возможность сэкономить время на производство вычислений; дает особый эффект, когда позволяет исключить дублирование одних и тех же процессов в разных модулях.

4.9. Оформить модули, связанные между собой единой логикой, в библиотеку.

4.10. Использовать в проектировании системы стандартные модули системы программирования.

4.11. Использовать библиотечные модули, разработанные другими программистами.

5. ПРЕОБРАЗОВАНИЕ СТРУКТУРЫ МОДУЛЯ

5.1. Заменить линейную структуру команд циклической. (Повышает компактность кода программы.)

5.2. Инверсия приема.

5.3. Заменить ветвящуюся структуру циклической.

5.4. Инверсия приема.

5.5. Заменить ветвящуюся структуру if — then — else вариантом оператора case.

5.6. Заменить ветвящуюся структуру case цепочкой операторов if — then.

5.7. Инверсия приема.

5.8. Заменить цикл repeat — until циклом while.

5.9. Инверсия приема.

5.10. Заменить цикл repeat— until циклом for.

5.11. Инверсия приема.

5.12. Заменить цикл while циклом for.

5.13. Инверсия приема.

5.14. Выделить тело цикла в отдельную подпрограмму. Данный прием повышает читабельность программы, но его следует использовать только тогда, когда это не нарушает внутренней логики цикла.

5.15. Использовать рекурсию.

5.16. Заменить подпрограмму-процедуру подпрограммой-функцией. Данный прием позволяет получить дополнительный параметр, выдаваемый подпрограммой (например, код ошибки).

5.17. Инверсия приема. Позволяет избежать резервирования места под переменную, воспринимающую значение подпрограммы-функции.

5.18. Полностью исключить или минимизировать использование оператора goto. Улучшает структуру программы, ее читабельность и логику.

5.19. Использовать оператор goto для быстрой передачи управления. Позволяет быстро без привлечения дополнительных средств передавать управление другому процессу. Следует применять только в тех случаях, когда переход является наиболее лаконичным, простым и ясным средством.

5.20. Использовать процедуру exit для выхода из подпрограммы. Позволяет обходиться без оператора goto и без усложнения логики подпрограммы.

5.21. Использовать директиву компилятора для безболезненного использования процедур в качестве функций и функций в качестве процедур.

5.22. Использовать процедурный тип данных.

5.23. Использовать указатели на процедуры и функции.

5.24. Увеличить размерность массива.

5.25. Инверсия приема.

5.26. Использовать тип данных множество set вместо массивов.

5.27. Инверсия приема.

5.28. Замена записи фиксированной длины записью с вариантом.

5.29. Инверсия приема.

5.30. Заменить обычные строки (тип String) строками с нулевым окончанием.

5.31. Инверсия приема.

5.32. Использовать оператор with для упрощения работы с записями.

5.33. Использовать преобразование типов данных.

5.34. Использовать типизированные константы.

5.35. Давать переменным, константам и типам данных содержательные обозначения.

5.36. Широко использовать комментарии для пояснения вычислительных алгоритмов.

6. ОРГАНИЗАЦИЯ И ХРАНЕНИЕ ДАННЫХ

6.1. Заменить типизированный файл нетипизированным файлом.

6.2. Инверсия приема.

6.3. Заменить типизированный файл текстовым файлом.

6.4. Инверсия приема.

6.5. Заменить нетипизированный файл текстовым файлом.

6.6. Инверсия приема.

6.7. Заменить носитель данных.

6.8. Проводить сортировку данных с целью облегчения поиска.

6.9. Использовать индексированные массивы данных для организации поиска по вторичным ключам.

6.10. Исключить избыточность данных.

6.11. Декомпозировать данные на несколько файлов.

6.12. Объединить данные в один файл данных.

7. ЭКОНОМИЯ РЕСУРСОВ ПРОГРАММЫ

7.1. Использовать inline-процедуры и inline-директивы. Позволяет экономить память компьютера и увеличивает быстродействие алгоритма, так как реализация такого же алгоритма с помощью операторов языка высокого уровня после компиляции приводит к увеличению объектного кода и усложнению алгоритма за счет добавления различных операторов контроля границ и т. п. В процедурах inline осуществляется непосредственный ввод текста в машинных кодах, и вся ответственность по организации процесса лежит на программисте.

7.2. Использовать директивы встроенного ассемблера.

7.3. Использовать абсолютную адресацию данных через директиву absolute и стандартные массивы Mem, MemW, MemL.

7.4. Использовать непосредственное обращение к портам через стандартные массивы Port, PortW, PortL.

7.5. Использовать систему прерываний через функции модуля DOS — Intr и MS DOS.

7.6. Использовать профилировку кода программ с помощью программ-профилировщиков.

7.7. Заменить статические переменные и массивы динамическими.

7.8. Использовать оверлейную организацию программ.

7.9. Объединить оверлейные файлы в один исполняемый файл типа *.ЕХЕ.

7.10. Разбить программу на резидентную часть (TSR) и подгружаемые части.

7.11. Использовать дополнительную память компьютера (expanded memory).

7.12. Использовать расширенную память компьютера (extended memory).

7.13. Использовать защищенный режим работы процессора (protected mode).

7.14. Использовать режим виртуального процессора 8086.

8. ОФОРМЛЕНИЕ ВАРИАНТА (ВЕРСИИ) ПРОГРАММЫ

8.1. Размножение окрестности (копирование старого варианта в отдельный файл). Крайне неэффективный метод из-за загромождения дискового пространства.

8.2. Замена вызова старой процедуры на вызов новой также неэффективна, так как старые процедуры также подключаются к объектному коду программы, что приводит к загромождению программы.

8.3. Использовать оператор выбора. Те же ограничения.

8.4. Комментирование измененного кода программы.

8.5. Использование директив компилятора {$IFDEF <условие>} и {$IFOPT <опция>}.

9. ТЕСТИРОВАНИЕ ПРОГРАММ

9.1. Заменить восходящее проектирование тестов нисходящим.

9.2. Инверсия приема.

9.3. Использовать метод большого скачка.

9.4. Использовать метод "сандвича".

9.5. Организовать входные данные для тестирования во внешнем файле. Это исключит повторный ввод данных при каждом тестировании, что позволит сэкономить время.

9.6. Использовать генератор входных данных.

10. ОТЛАДКА ПРОГРАММ

10.1. Использовать встроенный отладчик системы (трассировка программы).

10.2. Использовать директивы компилятора {$D} и {$L} при компиляции модулей с целью иметь непосредственный доступ к переменным и процедурам модуля.

10.3. Использовать отладочную печать. Выводить значения отдельных ключевых переменных и массивов непосредственно на экран или во внешний файл на диске.

10.4. Вставить "заглушки" на те модули программы, которые не подвергаются в настоящий момент отладке.

10.5. Использовать процедуру halt в случае исключительной ситуации.

10.6. Использовать возвращение функцией или процедурой специального значения в случае исключительной ситуации.

10.7. Использовать код возврата в виде отдельной глобальной переменной.

11. ОРГАНИЗАЦИЯ ДИАЛОГА С ПОЛЬЗОВАТЕЛЕМ

11.1. Заменить горизонтальное меню вертикальными меню.

11.2. Инверсия приема.

11.3. Использовать скроллинг меню.

11.4. Заменить выпадающее меню всплывающим меню.

11.5. Инверсия приема.

11.6. Организовать меню, активизирующееся по горячим клавишам.

11.7. Использовать кнопки и панели диалога.

11.8. Организовывать громоздкие экранные формы в виде многостраничных форм.

11.9. Использовать скроллинг экранных форм.

11.10. Использовать всплывающие экранные формы.

11.11. Использовать гипертекстовую систему в качестве системы помощи.









Главная | В избранное | Наш E-MAIL | Добавить материал | Нашёл ошибку | Наверх