Головна

Г. П. МЕДВЕДЄВА

Написання красивого і ефективного програмного коду - ціле мистецтво, багато в чому, на жаль, призабуте в зв'язку з вибуховим зростанням потужності обчислювальних пристроїв, які викликали зниження вимог до якості алгоритмів. Це невеликий додаток не може замінити вивчення спеціалізованих дисциплін на кшталт "Технології програмування" або "Теорії алгоритмів і формальних мов", але слідування викладеним тут принципам дозволить починаючому програмісту звикати не просто "вирішувати завдання", а робити це максимально красивим і економічним з точки зору обчислювальних витрат способом.

1. Структуруйте і вирівнюйте код, по крайней мере, так, як сказано в гл. 5. У всьому посібнику я теж форматувати листинги в звичному для себе стилі. Краще звикнути структурувати текст, зрушуючи будь-які вкладення і розгалуження коду одним-двома пробілами вправо. Програма при цьому не "роз'їдеться" далеко вправо на складних блоках, а вид тексту, відкритого в будь-якому редакторі, не буде залежати від розміру відступу табуляції.

2. Давайте змінним осмислені імена. Змінна з ім'ям Length, або, в крайньому випадку, Dlina, сама нагадає про своє призначення, на відміну від L. З іншого боку, не забороняється використовувати стандартні скорочення - наприклад, S для площі, P для периметра, a, b і c - для сторін трикутника. Будь-які індекси природно виглядають з іменами i, j, k і т. Д. Але якщо індекс позначає номер місяця в році, куди природніше назвати його month, ніж i. Хоча Паскаль і не розрізняє регістр букв в іменах змінних і службових словах - дотримуйтесь його всюди. Більшість професійних мов регістр символів розрізняють.

3. Існує безліч угод про імена змінних - можна сперечатися про їх достоїнства і недоліки, але безперечно одне - дотримання однакового стилю іменування набагато полегшує розуміння і модифікацію програми. У складних проектах осмислених імен змінних може виявитися недостатньо, тоді на допомогу прийдуть префікси. Так, якщо все імена всіх змінних, що відносяться до таблиці "Студенти", починаються на st_, а все динамічні покажчики мають в імені префікс ptr_ (від англ. "Pointer" - покажчик), читати таку програму буде набагато простіше.

4. Створюючи будь-яку змінну, зверніть увагу на наступні моменти:

- Який тип значень може приймати змінна, чи не можна замінити її перерахуванням, безліччю чи іншим "скороченим" типом даних?

- Чи є обмеження на допустимі значення, якщо так, де і як вони будуть враховані?

- Що станеться при переповненні значення або спробі дати змінної неприпустиме значення?

5. Закривайте блоки відразу. Такий блок, як

if умова then begin

end

else begin

end;

або

while умова do begin

end;

пишеться відразу, А тільки потім гілка алгоритму або тіло циклу наповнюються вмістом. Це допоможе не заплутатися в складному коді і полегшить дотримання наступного принципу.

6. Не залишайте непрацююче додаток "на завтра". Блочно-модульна структура програми дозволяє завжди уникнути цього. Підпрограма може бути порожньою "заглушкою", ви можете використовувати нічого не роблять умови, порожні блоки, коментарі, але поточний код повинен компілюватися, якщо завтра ви не хочете половину робочого дня затратити на відновлення в пам'яті недоробленого сьогодні.

7. Доводите програму до відсутності попереджень компілятора, а не тільки помилок. Невідомо, як позначаться на самому ділі ці "невинні" нагадування. У мові Сі конструкція виду if a: = 0 допустима і викличе лише попередження "Possibly incorrect assignment" - хоча в результаті змінна a завжди буде отримувати значення 0 і гілка алгоритму, прив'язана до цієї умови, буде завжди виконуватися.

8. Вибирайте коротші типи даних там, де це доречно: часто byte може замінити word або integer, а string [20] - просто string.

9. Застосовуйте максимально ефективний алгоритм рішення - перш за все, оцінка ефективності пов'язана із залежністю числа виконуваних операцій від розмірності даних. Подвійний цикл повної обробки всіх елементів матриці простий у вивченні, але далеко не завжди є кращим рішенням при роботі з реальним завданням - адже трудомісткість цього алгоритму дорівнює n2, Де n - розмірність матриці.

10. Вибирайте менш трудомісткі операції. Так, n div k краще, ніж Trunc (n / k), а Inc (i); краще, ніж i: = i + 1 ;. У всіх випадках порядкові оператори і операнди працюють швидше, ніж речові. Тому обходитесь порядковими даними всюди, де це можливо. Особливо уникайте без необхідності поділу на речові числа.

11. Не забувайте про погрішності при роботі з числами. Хрестоматійне while x <= 2.5 do ... - погано, якщо x - речовинний. З іншого боку, while abs (x-2.5)

12. Використовуйте стандартні функції мови, на якому пишете. Уявна економія ресурсів, досягнута написанням власних підпрограм нижнього рівня, обернеться важко впіймати помилками в великих проектах. Після п'яти-десяти років практики це стає ясно кожному програмісту, хоча експерименти з власними інтерфейсами і машинно-орієнтованими програмами бувають цікаві і навіть корисні на етапі навчання.

13. Стежте за умовами. Якщо ви перевіряєте одне і те ж умова неодноразово - скоріше за все, у вашої програми не в порядку з логікою. Приклад з п. 7.7 показує це наочно.

14. Не забувайте про взаємовиключних умовах. Складовою умовний оператор if ... else if або ж case в таких випадках набагато краще набору коротких умовних операторів.

15. Найчастіше при написанні довгих фрагментів коду зручніше обробляти помилки у вигляді

if помилка then завершення;

обробка;

ніж за схемою

if вірно then обробка

else завершення;

Взагалі, уникайте else, що знаходяться рядків через 100 після свого if - це ускладнює сприйняття навіть добре структурованої програми.

16. Уникайте в циклах обчислень, що не залежать від їх параметрів! Вираз на зразок sin (Pi / n), поміщене в цикл, де n не змінюється, виглядає безглуздо. Адже кожне обчислення синуса (як і інших стандартних функцій) - це трудомістке розкладання в ряд Фур'є, що виконується машиною.

17. Використовуйте математику там, де це доречно для скорочення трудомісткості коду і числа порівнянь. Перевірити, що змінні x і y мають один знак, можна так:

if (x> 0) and (y> 0) or (x <0) and (y <0) then ...,

а можна і у вигляді if (x * y> 0) then ...

18. Припиняйте цикли, коли результат уже досягнутий. Пріоритет засобів при цьому наступний:

- Використання циклів repeat-until або while-do замість for;

- Оператори break або exit;

- В останню чергу - goto, і тільки у випадках, описаних в п. 16.2.

19. Тимчасовий "робочий" масив того ж порядку, що створюваний або прочитаний з файлу - майже завжди не найкраще рішення. Його використання говорить про те, що завдання вирішується "в лоб" і не оптимальним способом. Допустимим вважається використання одновимірного робочого масиву при обробці матричних даних - якщо розмірність його не перевищує більшої з розмірностей матриці.

20. Називайте розмірні константи масивів. Нікому не потрібні кілька циклів з верхніми граніцамі- "близнюками". А що, якщо розмірність оброблюваних даних доведеться змінити?

21. Передавайте значення підпрограм переважно за адресою, А не за значенням. Для матричних і векторних даних намагайтеся робити це завжди. Застосування векторних даних має пріоритет перед матричними.

22. Не робіть підпрограми залежними від глобальних даних. Недотримання цього правила істотно зменшить ймовірність повторного використання коду вами або іншим розробником.

23. Не пишіть підпрограм, які повертають більше одного об'єкта - скаляра, вектора або матриці. В крайньому випадку, можна окремою параметром передавати або повертати розмірність векторних даних. Уникайте підпрограм, які нічого не повертають. Розробка складних підпрограм полегшується, якщо їх "точка виходу" і повертається значення вказані єдиним і останнім оператором. Для переходу з тіла підпрограми в точку повернення в цьому випадку не гріх використовувати навіть goto:

function Test (a, b: integer): integer;

label end_of_Test;

var error: integer;

begin

error: = 0;

if (a <0) or (b <0) then begin

error: = 1;

goto end_of_Test;

end;

. . .

end_of_Test:

Test: = error;

end;

24. Потрібно привчити себе не тільки правильно називати змінні і функції, а й виділяти все логічні частини завдання при проектуванні ієрархії підпрограм. Наприклад, якщо функція шукає в наборі даних елемент по якомусь ознакою і створює новий в тому випадку, коли шуканий елемент знайдений, то краще розділити її на дві - функцію пошуку і функцію створення нового вузла, яка буде викликатися з першої. Досить дотримуватися подібних нехитрих прийомів, щоб підвищити сопровождаемость додатки в рази. Якщо подивитися на питання з іншого боку, не змушуйте одну підпрограму виконувати кілька функцій - вона виявиться марна з точки зору повторного використання коду. Так, визначення довжини ламаної лінії можна реалізувати однією підпрограмою, але набагато краще, якщо завдання розбита на підпрограми обчислення довжини і обчислення відстані між двома точками.

25. При роботі з динамічними об'єктами пишіть код так, щоб відкриті об'єкти завжди закривалися, як тільки вони стануть не потрібні. В ідеалі порядок закриття об'єктів повинен бути зворотним по відношенню до порядку відкриття (останній зайняв пам'ять об'єкт звільняє її першим). Слід також уникати функцій перерозподілу раніше виділеної динамічної пам'яті.

26. Перевірити логіку своєї програми найлегше за принципом "Одна правка - одне місце в програмі". Якщо при додаванні в меню нового пункту або, ще гірше, простому зміні розмірності одновимірного масиву доводиться переписувати кілька віддалених один від одного фрагментів коду - програма написана погано.

27. Якщо написана вами програма не працює або працює "криво", помилка лежить на вашій совісті, а комп'ютер з компілятором ні в чому не винні. "Налагодження", при якій програміст хаотично міняє то одне, то інше місце в коді і на яку йде до 90% часу написання, насправді - свідчення не надто якісної роботи. Добре написаної програмі потрібна не стільки налагодження, скільки тестування на різних допустимих, неприпустимих і "прикордонних" наборах даних. До речі, обдумування та написання тестів до тестованого коду сприяє і поліпшенню, і більшої стійкості кінцевого продукту.

Резюмуючи, можна сказати, що все більші програми на світлі написані тільки за рахунок одного - правильного структурування коду. І хороший програміст - не той, хто "знає мови", а той, хто вміє писати легко читається, який розуміється і модифікується код, максимально використовуючи стандартні засоби мови розробки.

рекомендована література

Нижче наведено в повному обсязі книги з основ програмування на Паскалі, але тільки сучасні і найбільш корисні видання.

1. Глинський Я. Turbo Pascal 7.0 і Delphi. Навчальний посібник. / Я. М. Глинський. - М .: Диасофт, 2001. - 208 с.

2. Гусєва А. Вчимося програмувати: Pascal 7.0. Завдання і методи їх вирішення. / А. І. Гусєва. М .: Діалог-МІФІ, 2005. - 256 с.

3. Зеленяк О. Практикум програмування на Turbo Pascal. Завдання, алгоритми і рішення. / О. П. Зеленяк. СПб .: ДиаСофтЮП, ДМК Пресс, 2007. - 320 с.

4. Кетков Ю. Практика програмування: Бейсик, Си, Паскаль. / Ю. Л. Кетков, А. Ю. Кетков. СПб .: БХВ-Петербург, 2001. - 480 с.

5. Климова Л. Pascal 7.0. Практичне програмування. Рішення типових задач. / Л. М. Клімова. М .: КУДИЦ-образ, 2003. - 528 с.

6. Коффман Е. Turbo Pascal. / Е. Б. Коффман. М .: Діалектика, 2002. - 896 с.

7. Культин Н. Програмування в Turbo Pascal 7.0 і Delphi. / Н. Б. Культин. СПб .: БХВ-Петербург, 2007. - 400 с.

8. Лукін С. Н. Турбо Паскаль 7.0. Самовчитель для початківців. / С. Н. Лукін. М .: Діалог-МІФІ, 2002. - 400 с.

9. Марченко А. Програмування в середовищі Turbo Pascal 7.0. Базовий курс. / А. І. Марченко, Л. А. Марченко. М .: Століття +, 2003. - 464 с.

10. Меженний О. Turbo Pascal. Вчіться програмувати. / О. А. Меженний М .: Вільямс, 2001. - 448 с.

11. Немнюгин С. Вивчаємо Turbo Pascal. / Л. В. Перколаб, c. А. Немнюгин. СПб: Пітер, 2007. - 320 с.

12. Немнюгин С. Turbo Pascal. / С. А. Немнюгин. СПб .: Пітер, 2006. - 268 с.

13. Фаронов В. Turbo Pascal 7. Початковий курс. / В. В. Фаронов. М .: ОМД Груп, 2003. - 576 с.

14. Фаронов В. Turbo Pascal 7. Практика програмування. / В. В. Фаронов. М .: ОМД Груп, 2003. - 415 с.

15. Федоренко Ю. Алгоритми і програми на Turbo Pascal. Навчальний курс. / Ю. П. Федоренко. СПб: Пітер, 2001. - 240 с.

16. Система програмування Турбо Паскаль: навч. посібник / Воробйова А. П., СОПП М. С .; Новосиб. держ. архітектур.-буд. ун-т. - Новосибірськ, 2006. - 136 с.

Г. П. МЕДВЕДЄВА

ПРОФЕСІЙНО-ЕТИЧНІ ОСНОВИ



1   2   3   4   5   6   7   8   9   10   11   12   13   14   15   16   Наступна

ВСТУП | Лекція 1. Місце і роль цінностей в життєдіяльності людини і суспільства. | Лекція 2. Аксіологічні підстави соціальної роботи | Основна | Лекція 1. Система і ієрархія цінностей професійної соціальної роботи. | Лекція 2. Специфічні цінності і ідеал професійної соціальної роботи | Приблизний перелік питань до заліку по темі 2 | Лекція 1. Інстинктивно-практіцістскіе і традиційно-прагматичні основи допомоги і взаємодопомоги. | Лекція 2. Соціально-ідеологічний і соціально-філософський підходи у визначенні цінності допомоги людині. | Додаткова |

© 2016-2022  um.co.ua - учбові матеріали та реферати