Вступ#
Стиль - це часто недооцінений, але дуже важливий атрибут для написання чого завгодно. Стиль безпосередньо впливає на читабельність і зрозумілість кінцевого продукту. Стиль програмування, як написання коду комп'ютерною мовою, також страждає від нехтування цим атрибутом. Програми повинні бути читабельними і зрозумілими для людини, а не тільки для машинного виконання. Ця вимога є важливою для створення якісних продуктів, які не тільки задовольняють потреби користувачів, але й можуть розроблятись за передбачуваним бюджетом і графіком. Ця книга покликана допомогти фахівцям створювати кращі програми на мові Ada. Вона представляє набір конкретних стилістичних рекомендацій для дисциплінованого використання потужних можливостей мови Ada 95 (Ada Reference Manual 1995).
Кожна настанова складається зі стислого викладу принципів, яких слід дотримуватися, та обґрунтування необхідності кожної настанови. У більшості випадків наводиться приклад застосування вказівки, а в деяких випадках також додається приклад з можливими наслідками порушення вказівки. Окремо зазначено можливі винятки із застосування вказівки, а також додаткові пояснення, там де це доречно. Деякі вказівки надають більше конкретизації, тож вони можуть бути застосовані в якості стандарту. А у примітках щодо автоматизації обговорюється, як можна автоматизувати виконання вказівки.
Ada була спроектована для розробки високоякісного, надійного, багаторазового та переносного програмного забезпечення. З ряду причин жодна мова програмування не може забезпечити досягнення цих бажаних цілей самостійно. Наприклад, програмування повинно бути вбудоване в дисциплінований процес розробки, що включає в себе аналіз вимог, проектування, реалізацію, верифікацію, валідацію та супровід в організований спосіб. Використання мови має відповідати належній практиці програмування, що базується на усталених принципах програмної інженерії. Ця книга покликана допомогти подолати розрив між теоритичними принципами та реальною практикою програмування мовою Ada.
Багато настанов у цій книзі розроблено для того, щоб сприяти створенню зрозумілого вихідного тексту. Мета цих настанов - полегшити розвиток, адаптацію та супровід програм. Зрозумілий вихідний текст з більшою ймовірністю буде правильним і надійним. Легка адаптація вимагає глибокого розуміння програмного забезпечення; цьому значно сприяє ясність. Ефективна адаптація коду є передумовою для повторного використання коду - підходу, який має потенціал для значного зниження вартості розробки системи. Нарешті, оскільки підтримка програмного забезпечення (насправді еволюція) є дорогим процесом, який триває протягом усього життя системи, ясність відіграє одну з ключових ролей у зниженні витрат. Протягом усього життєвого циклу продукту код доводиться читати і розуміти набагато частіше, ніж писати; отже, інвестиції в написання читабельного, зрозумілого коду завжди виправдовують себе.
Решта розділів цього вступу обговорюють організацію цієї книги і те, як представлений матеріал може бути використаний людьми з різних ролями в комнаді, включаючи програмістів-початківців, досвідчених програмістів на Ada, об'єктно-орієнтованих програмістів, менеджерів програмних проектів, підрядних організацій, організацій, що встановлюють стандарти, і планувальників переходу на Ada 95 з існуючих програм на Ada 83 (Ada Reference Manual 1983 року).
Організація цієї книги#
Формат цієї книжки відповідає добре відомому формату настанов з якості та стилю Ada: Керівництво для професійних програмістів, версія 02.01.2001 (AQ&S 83) (Software Productivity Consortium 1992). Посібник зі стилю поділено на розділи, які відповідають основним рішенням, які доводиться обирати кожному програмісту при створенні якісного, надійного, багаторазового та переносного програмного забезпечення на мові Ada. Розділи дещо перетинаються, оскільки не всі програмні рішення можуть бути прийняті незалежно.
Окремі розділи акцентують увагу на кінцевому вигляді коду, читабельності, структурі програми, практиці програмування, паралелізації, портативність, повторному використанню та ефективності виконання, а новий розділ присвячена об'єктно-орієнтованим функціям. Кожний розділ закінчується стислим списком настанов, що містяться у ній. Останній розділ показує повну реалізацію прикладу Dining Philosophers, наданого доктором Майклом Б. Фельдманом та паном Бйорном Каллбергом. При створенні цього прикладу було використано багато рекомендацій з цієї книги. У додатку наведено матрицю перехресних посилань між розділами довідника Ada Reference Manual (1995) та рекомендаціями цього посібника зі стилів.
Ця книга написана з використанням загального словника програмної інженерії, розробленого за останні 20 років. Інженерія програмного забезпечення - це дисципліна, що швидко розвивається, з відносно новими поняттями та термінологією. Однак, щоб встановити загальну систему координат, необхідні визначення взяті з Ada Reference Manual (1995) та Rationale (1995).
У книзі є посилання на інші джерела інформації про стиль написання на мові Ada та інші питання, пов'язані з цим. Список використаних джерел наведено наприкінці книги. Також подано бібліографію.
У цій книзі термін "Ada" відноситься до останнього стандарту Ada, випущеного в лютому 1995 року (іноді також відомий як Ada 95). Посилання на більш ранній стандарт Ada чітко позначаються як "Ada 83".
Представлення та читабельність вихідного коду#
Розділи 2 і 3 порушують питання створення чіткого, читабельного і зрозумілого вихідного тексту. Розділ 2 присвячений форматуванню коду, а Розділ 3 розглядає питання використання коментарів, угод про імена та типи.
Існує два основних аспекти зрозумілого коду: (1) ретельне і послідовне розташування вихідного тексту на сторінці або екрані, про що йдеться у Розділі 2, що може значно покращити його читабельність; (2) ретельна увага до структури коду, про що йдеться у Розділі 3, що може зробити код легшим для розуміння. Це стосується як дрібних деталей (наприклад, ретельний вибір імен ідентифікаторів або дисципліноване використання циклів), так і великих (наприклад, правильне використання пакетів). Ці настанови стосуються як макета, так і структури.
Уподобання щодо форматування коду та іменування, як правило, є дуже особистими. Ви повинні збалансувати свої особисті уподобання з думкою інших інженерів у проекті, щоб узгодити єдиний набір правил, яких дотримуватиметься вся команда проекту, а автоматичні форматори коду можуть допомогти вам з цим.
Структура програми#
Розділ 4 присвячений загальній структурі програми. Правильна структура покращує зрозумілість програми. Це аналогічно читабельності на нижчих рівнях і включає питання структури високого рівня, зокрема використання пакетів та дочірніх пакетів, видимість та винятки. Більшість настанов у цьому розділі стосуються застосування правильних принципів програмної інженерії, таких як приховування інформації, абстрагування, інкапсуляція та розділення завдань.
Практики програмування#
Розділ 5 містить настанови, які визначають послідовне та логічне використання можливостей мови. Ці настанови стосуються необов'язкових частин синтаксису, типів, структур даних, виразів, операторів, видимості, винятків та помилкового виконання.
Паралельність#
Розділ 6 визначає правильне використання паралелізму для розробки передбачуваного, надійного, повторно використовуваного та переносного програмного забезпечення. Розглядаються такі теми, як постановка задач, захищені модулі, комунікація та завершення роботи. Однією з основних сфер вдосконалення мови Ada була краща підтримка спільного використання даних. Механізм задач був єдиним доступним підходом до захисту спільних даних. Настанови у цьому розділі підтримують використання захищених типів для інкапсуляції та синхронізації доступу до спільних даних.
Переносивність і можливість багаторазового використання#
Розділи 7 і 8 розглядають питання проектування з урахуванням змін з дещо інших точок зору. Розділ 7 присвячений основам переносимості, простоті зміни програмного забезпечення з однієї комп'ютерної системи або середовища на іншу, а також впливу використання певних функцій на переносимість. Розділ 8 присвячен повторному використанню коду, тобто ступеню, до якого код може бути використаний у різних додатках з мінімальними змінами.
Настанови щодо перенесення, розглянуті в Розділі 7, потребують ретельної уваги. Дотримання їх є важливим, навіть якщо потреба у перенесенні отриманого програмного забезпечення наразі не передбачається. Дотримання настанов покращує потенційну можливість повторного використання отриманого коду у проектах, які використовують різні реалізації Ada. Вам слід наполягати на тому, щоб у випадках, коли потреби конкретного проекту змушують послабити деякі з настанов щодо перенесення, непереносимі особливості вихідного тексту були чітко вказані.
Настанови щодо повторного використання, наведені у Розділі 8, ґрунтуються на принципах інкапсуляції та проектування для змін. Ці настанови підкреслюють, що розуміння і ясність, надійність, адаптивність і незалежність є корисними і бажаними навіть тоді, коли повторне використання не передбачається, оскільки отриманий код є більш стійким до запланованих і незапланованих змін.
Об'єктно-орієнтовані функції#
Розділ 9 визначає набір настанов у загальних об'єктно-орієнтованих термінах, які використовують деякі можливості Ada 95, яких немає в Ada 83. У настановах обговорюється використання нових можливостей Ada, таких як розширення типів (мічені типи), абстрактні мічені типи та абстрактні підпрограми для реалізації одиночного успадкування, множинного успадкування та поліморфізму.
Продуктивність#
Розділ 10 визначає набір керівних принципів, спрямованих на підвищення продуктивності. Визнано, що деякі підходи до продуктивності суперечать принципам ремонтопридатності та переносивності. Більшість настанов у цьому розділі починаються словами "... якщо виміряні показники продуктивності вказують". "Вказують" означає, що ви визначили, що вигода від підвищення продуктивності вашої програми у вашому середовищі переважає негативні побічні ефекти на зрозумілість, супроводжуваність та переносимість отриманого коду.
Як користуватися цією книгою#
Ця книга призначена для тих, хто займається безпосередньо розробкою програмних систем, написаних на мові Ada. У наступних розділах обговорюється, як найефективніше використати поданий матеріал. Читачі з різним рівнем досвіду роботи з Адою або різними ролями в програмному проекті будуть використовувати книгу по-різному.
Цю книгу можна використовувати по-різному: як посібник з гарного стилю Ada; як вичерпний перелік настанов, що сприятимуть створенню кращих програм Ada; або як довідник, де можна знайти приклади використання та обговорити специфічні особливості цієї мови. Книга містить багато настанов, деякі з яких є досить складними. Вивчати їх усі одночасно не обов'язково; навряд чи ви будете використовувати всі можливості мови одночасно. Однак, рекомендується, щоб усі програмісти (і, за можливості, інші співробітники проекту Ada) доклали зусиль, щоб прочитати і зрозуміти Розділи 2, 3, 4 і Розділ 5 аж до Розділу 5.7. Деякий матеріал є досить складним (наприклад, Розділ 4.2, де обговорюється видимість), але він охоплює питання, які є фундаментальними для ефективного використання Ada і є важливими для будь-якого програміста, що займається створенням систем на Ada.
Ця книга не є вступним текстом про Ada або повним посібником з мови Ada. Передбачається, що ви вже знаєте синтаксис Ada і маєте елементарне розуміння семантики. На цьому тлі настанови будуть для вас корисними, інформативними, а часто й повчальними.
Якщо ви вивчаєте мову Ada, вам слід підготувати всебічний вступ до неї. Два хороших вступних тексти про Ada 83 належать Барнсу (Barnes, 1989) та Коену (Cohen, 1986). Обидва автори опублікували нові книги, які охоплюють Ada 95 (Barnes 1996, Cohen 1996). Ознайомившись з цими текстами, ми рекомендуємо використовувати їх разом з Rationale (1995). Довідковий посібник Ada (1995) слід розглядати як доповнення до цих книг. Більшість настанов посилаються на розділи довідника Ada (1995), які визначають особливості мови, що обговорюються. Додаток А містить перехресні посилання на розділи Довідника з мови Ada в настановах.
Новому програмісту Ada#
На перший погляд, Ada пропонує вражаючу різноманітність функцій. Це потужний інструмент, призначений для вирішення складних завдань, і майже кожна функція має законне застосування в певному контексті. Це робить особливо важливим дисципліноване та організоване використання можливостей Ada. Дотримання цих вказівок може полегшити вивчення Ada і допомогти вам опанувати її позірну складність. З самого початку ви зможете писати програми, які використовують найкращі можливості мови так, як було задумано розробниками.
Програмісти, які мають досвід роботи з іншими мовами програмування, часто піддаються спокусі використовувати Ada так, ніби це їхня звична мова, але з дратівливими синтаксичними відмінностями. Цієї пастки слід уникати будь-якою ціною; вона може призвести до заплутаного коду, який підриває саме ті аспекти Ada, які роблять її такою придатною для побудови високоякісних систем. Ви повинні навчитися "думати Адою". Дотримання рекомендацій цієї книги та ознайомлення з прикладами їх використання допоможе вам зробити це якомога швидше і безболісніше.
Певною мірою програмісти-початківці, які вивчають Ada, мають перевагу. Дотримання рекомендацій з самого початку допомагає виробити чіткий стиль програмування, який ефективно використовує мову. Якщо ви належите до цієї категорії, рекомендуємо вам прийняти ці вказівки для тих вправ, які ви виконуєте в рамках вивчення Ada. На початковому етапі розвитку навичок програмування, зосереджуючись на самих настановах і прикладах, що їх підтримують, важливіше, ніж розуміння обґрунтування кожної настанови.
Обґрунтування багатьох настанов допомагає досвідченим програмістам зрозуміти і прийняти пропозиції, представлені в настановах. Деякі з настанов також написані для досвідчених програмістів, яким доводиться йти на інженерні компроміси. Це особливо актуально у сферах перенесення, багаторазового використання та продуктивності. Ці настанови та обґрунтування допоможуть вам усвідомити проблеми, що впливають на кожне програмне рішення. Потім ви зможете використовувати цю обізнаність для розпізнавання інженерних компромісів, які вам зрештою доведеться робити, коли ви станете досвідченим програмістом Ada.
Досвідченому програмісту Ada#
Як досвідчений програміст Ada, ви вже пишете код, який відповідає багатьом настановам цієї книги. Однак у деяких сферах ви, можливо, прийняли особистий стиль програмування, який відрізняється від представленого тут, і, можливо, не бажаєте його змінювати. Уважно перегляньте ті настанови, які не відповідають вашому поточному стилю, переконайтеся, що ви розумієте їх обґрунтування, і розгляньте можливість їх прийняття. Загальний набір рекомендацій у цій книзі втілює послідовний підхід до створення високоякісних програм, який був би ослаблений надто великою кількістю винятків.
Узгодженість - ще одна важлива причина для загального прийняття єдиних настанов. Якщо всі співробітники проекту пишуть вихідний текст в одному стилі, то багато критично важливих проектних дій стають простішими. Узгоджений код спрощує формальний і неформальний перегляд коду, системну інтеграцію, повторне використання коду в рамках проекту, а також надання і застосування допоміжних інструментів. На практиці корпоративні або проектні стандарти можуть вимагати, щоб відхилення від настанов були чітко прокоментовані, тому застосування нестандартного підходу може вимагати додаткової роботи.
Деякі настанови в цій книзі, зокрема в розділах про паралелізм, переносивність, повторне використання, об'єктно-орієнтовані можливості та продуктивність, зосереджені на компромісах у проектуванні. Ці настанови просять вас над тим, чи використання можливостей Ada є правильним проектним рішенням для вашого додатку. Часто існує декілька способів реалізації певного проектного рішення, і ці настанови обговорюють компроміси, які ви повинні враховувати при прийнятті рішення.
Досвідченим об'єктно-орієнтованим програмістам#
Як досвідчений об'єктно-орієнтований програміст, ви оціните зусилля, які було докладено для елегантного розширення мови Ada, щоб включити в неї потужні об'єктно-орієнтовані можливості. Ці нові можливості тісно інтегровані з існуючими функціями та словником мови. Ця книга навмисно написана таким чином, щоб надати погляд з точки стилю, тому об'єктно-орієнтовані можливості Ada використовуються в ній повсюдно. Дисципліноване використання цих можливостей сприятиме створенню програм, які легше читати і модифікувати. Ці можливості також дають вам гнучкість у створенні компонентів, які можна використовувати повторно. Розділ 9 присвячено об'єктно-орієнтованому програмуванню та питанням успадкування і поліморфізму. Попередні розділи містять перехресні посилання на рекомендації Розділу 9.
Вам буде легше скористатися багатьма концепціями з Розділу 9, якщо ви вже виконали об'єктно-орієнтоване проектування. Результатом об'єктно-орієнтованого проектування буде набір змістовних абстракцій та ієрархія класів. Абстракції повинні включати визначення об'єктів проектування, включаючи структуру і стан, операції над об'єктами і передбачувану інкапсуляцію для кожного об'єкта. Деталі проектування цих абстракцій та ієрархії класів виходять за рамки цієї книги. Існує низка хороших джерел, зокрема Rumbaugh та ін. (1991), Jacobson та ін. (1992), ADARTS Guidebook (Software Productivity Consortium 1993) та Booch (1994).
Керівнику проекту з розробки програмного забезпечення#
Технічний менеджмент відіграє ключову роль у забезпеченні того, щоб програмне забезпечення, створене в ході проекту, було правильним, надійним, підтримуваним та переносним. Керівництво повинно створити в рамках всього проекту прихильність до створення високоякісного коду; визначити стандарти кодування та настанови для конкретного проекту; сприяти розумінню того, чому однакове дотримання обраних стандартів кодування є критично важливим для якості продукту; а також розробити політику та процедури для перевірки та забезпечення дотримання цих стандартів. Настанови, що містяться в цій книжці, можуть допомогти в цих зусиллях.
Важливою діяльністю для менеджерів є визначення стандартів кодування для проекту або організації. Ці настанови самі по собі не повним набором стандартів, проте вони можуть слугувати основою для стандартів. Деякі настанови вказують на діапазон рішень, але не прописують конкретного рішення. Наприклад, друга в книзі (Настанова 2.1.2) рекомендує використовувати однакову кількість пробілів для відступів і вказує в обґрунтуванні, що розумним буде від двох до чотирьох пробілів. Разом зі старшим технічним персоналом ви повинні переглянути кожну таку настанову і прийняти рішення щодо її застосування, яке стане стандартом вашого проекту або організації.
Дві інші сфери потребують управлінських рішень щодо стандартизації. Настанова 3.1.4 радить уникати довільних скорочень у назвах об'єктів або підрозділів. Ви повинні підготувати глосарій прийнятних скорочень для проекту, який дозволяє використовувати коротші версії специфічних термінів (наприклад, ШПФ - швидке перетворення Фур'є або SPN - стохастична мережа Петрі). Цей глосарій має бути коротким і обмежуватися лише тими термінами, які потрібно часто використовувати як частину назв. Необхідність постійно звертатися до великого глосарію для розуміння вихідного тексту ускладнює його читання.
Настанови щодо перенесення, наведені в Розділі 7, потребують ретельної уваги. Дотримання їх є важливим, навіть якщо потреба у перенесенні отриманого програмного забезпечення наразі не передбачається. Дотримання настанов покращує потенційну можливість повторного використання отриманого коду у проектах, які використовують різні реалізації Ada. Ви повинні наполягати на тому, щоб у випадках, коли потреби конкретного проекту змушують послабити деякі з настанов щодо перенесення, непереносимі особливості вихідного тексту були чітко вказані. Дотримання настанов Розділу 7 вимагає визначення та стандартизації специфічних для проекту або організації числових типів, які використовуватимуться замість (потенційно непереносимих) попередньо визначених числових типів.
Ваші рішення щодо питань стандартизації повинні бути включені в документ зі стандартів кодування проекту або організації. Після створення стандартів кодування вам потрібно забезпечити їх дотримання. Дуже важливо заручитися щирою прихильністю ваших програмістів до використання стандартів. Маючи таку прихильність і приклад високоякісної Ada, яку створюють ваші програмісти, буде набагато легше проводити ефективні формальні огляди коду, які перевіряють дотримання стандартів проекту.
Деякі загальні питання, що стосуються управління проектами Ada, обговорюються в роботі Hefley та ін. (1992).
Підрядним організаціям та організаціям зі стандартизації#
Багато з настанов, представлених тут, є достатньо конкретними, щоб їх можна було прийняти як корпоративні або проектні стандарти програмування. Інші потребують управлінського рішення щодо конкретного застосування, перш ніж їх можна буде використовувати як стандарти. У таких випадках у прикладах представлено зразок конкретної реалізації, який використовується у всіх прикладах. Такі приклади слід визнати слабшими рекомендаціями, ніж самі настанови. У деяких випадках, коли приклади взяті з опублікованих робіт, авторський стиль використано без змін.
Інші рекомендації, представлені в цій книзі, навмисно сформульовані в термінах вибору дизайну для розгляду. Ці настанови не можуть бути сприйняті як непорушні правила, яких проєкт зобов'язаний дотримуватися. Наприклад, не слід тлумачити настанови 6.1.1 та 6.1.2 як такі, що забороняють використовувати задач у проекті. Скоріше, ці настанови мають на меті допомогти проектувальнику знайти компроміс між використанням захищених об'єктів і задач, таким чином, щоб він міг зробити більш усвідомлений вибір між цими можливостями.
Настанови, наведені в цьому документі, не призначені для використання в якості стандарту. Часом неясно, чи можна змусити дотримуватися настанови, бо вона лише покликана ознайомити інженера з можливими варіантами та їхніми наслідками. В інших випадках все ще залишається вибір щодо настанови, наприклад, скільки пробілів використовувати для кожного рівня відступу.
Якщо настанова є надто загальною для того, щоб навести приклад, у розділі "Конкретизація" кожної настанови містяться більш конкретні вказівки. Ці конкретизації можна вважати стандартом, і вони мають більше шансів бути застосованими. Будь-яка організація, яка намагається витягти стандарти з цього документа, повинна оцінити весь контекст. Кожна настанова працює найкраще, коли застосовуються пов'язані з нею настанови. Ізольовано настанова може бути малоефективною або взагалі не мати жодної користі.
Планувальники переходу від Ada 83 до Ada 95#
Проблеми переходу поділяються на дві основні категорії: несумісність між мовами, зокрема, висхідна сумісність, та використання нових мовних особливостей.
Сумісність Ada 95 з попередником була основною метою розробки мови. На практиці можливі лише незначні несумісності між Ada 83 і Ada 95, які легко піддаються вирішенню. (див. Обґрунтування Ada 95 [1995], Додаток X під назвою "Висхідна сумісність"). Детальну інформацію про проблеми сумісності можна знайти в Taylor (1995) та Intermetrics (1995).
Планувальник переходу може отримати з цієї книги інформацію про використання мовних особливостей двома способами. По-перше, у таблиці 1 показано вплив нових можливостей мови Ada 95 на розділи посібника зі стилів. По-друге, у Додатку А зіставлено розділи Довідкового посібника з Ada (1995) з конкретними щодо стилю.
Типографічні конвенції#
У цьому посібнику зі стилю використано такі типографічні конвенції:
Шрифт із зарубками Загальне представлення інформації.
Курсивний шрифт із зарубками Назви публікацій та виділення.
Жирний шрифт із зарубками Заголовки розділів.
Жирний шрифт без засічок Підзаголовки для вказівок, конкретизації, прикладів, обґрунтувань, приміток, винятків, приміток щодо автоматизації, застережень та підзаголовків у розділах резюме.
Шрифт друкарської машинки
:
Синтаксис коду.