Прикладної або системний? h2>
Євген Каратаєв p>
В
розробці програми зустрічаються неясні питання щодо того, як
спланувати той чи інший код, куди його віднести і як класифікувати. Код
може бути класифікований по самих різних класифікацій - на код верхнього
і нижнього рівня, на специфічний і бібліотечний, і іншим. p>
Правильна
класифікація часто на перших же кроків розробки (як проектування, так і
реалізації) може допомогти у виявленні помилок. Якщо читаєш схему даних або код,
призначений для виконання певного завдання, яка класифікується
певним чином і при цьому код має ознаки класифікації не
відповідної задачі, то в мене спрацьовує рефлекс і цим кодом (схемою,
діаграмі) я відразу приписую проблемний хрестик. Незалежно від поточного
положення справ розбіжність класифікаційних ознак завдання і реалізації є
індикатор принаймні потенційної помилки або міни, яка рано чи
пізно спрацює. p>
Одним
з предметів спорів іноді може виступати поділ як програмістів, так і
коду на прикладних і системних. До системним програмістам традиційно відносять
розробників операціонок, драйверів, інструменту, а решту - до прикладних.
Тут я опишу своє бачення класифікації коду за ознакою - прикладної або
системний. p>
Відразу
можна помовчати, вислухати купу питань і спроб уточнення на зразок "А
дивлячись що розуміти під прикладним ". Ось в такому вигляді, щоб було зрозуміло
без подібних уточнень, і поведемо далі мова. p>
Одна
з основних аксіом програмування свідчить, що програма є віртуальна
машина для перетворення або передачі інформації, сама по собі є
інформаційної сутністю. Програма по відношенню до одного шару є
переробником інформації, а по відношенню до іншого шару (операційна система)
- Перероблялася інформація. Таким чином, розглядаючи основні способи
побудови програм як сутностей в контексті операційної системи, можна
стверджувати, що існує об'єкт, який обробляє програму і
підтримує її функціонування. p>
Зв'язування
ж двох протилежних сутностей - алгоритмів як незмінних і виконуваних
інформаційних об'єктів і даних як змінних і неісполняемих об'єктів
проводиться через певні угоди про виклик. Ці угоди називаються
декларацією типу та описують, яким саме чином алгоритм повинен отримувати
доступ до гарячої пам'яті. Чудовою ілюстрацією може служити
використання в мовах високого рівня розрізнення між знаковим і беззнакові
цілим. Програміст для обох типів може використовувати однакові операції,
наприклад, складання. Але при цьому транслятор, маючи відомості про тип цілого
(знаковий або беззнакові), генерує різний машинний код. p>
Подальшим
розвитком поняття типу є поняття класу в об'єктно - орієнтованих
мовах. Якщо говорити про С + +, то на ньому програміст може змінити в тому
числі і вбудовані операції мови, наприклад, визначити операцію складання для
рядків. Синтаксично використовуватися ж буде як і раніше оператор додавання, але
транслятор, маючи інформацію про тип, буде генерувати код, описаний
програмістом в перевантаженому оператора. p>
Нескладно
бачити, що реалізація типізований доступу в обох випадках спирається на
"використовуючи інформацію про тип". Незалежно від того, як саме
реалізується підтримка типів - на етапі генерації коду, із застосуванням таблиць
віртуальних функцій або приєднанням тегова даних, де-то все одно має
існувати відповідна інформація. Саме ця інформація і визначає
поведінку виконавчого механізму доступу. Таким чином, що обробляється
інформація описується як власне її змістом, так і її форматом
доступу. p>
Досить
загальновідомі відомості, наведені вище, слід розглядати як освіження
знань і занурення в контекст питання. Тепер про суть теми. Моя думка з
питання розподілу коду на системний або прикладної полягає в правилі - якщо
виконання коду і його плин визначається форматом даних, то це системний
код, а якщо код залежить від змісту даних, то це прикладної код. Правило
дуже просте, хоча й, може бути, спірне. Проте мені воно допомагає в
плануванні модулів і в проектуванні. p>
Як
розрізнити код, що залежить від значень даних і що не залежить від значень даних.
Просто треба подивитися точки розгалужень програми (функції), умовних переходів
і циклів і визначити, від чого залежить виконання умови. Якщо від значення
даних, до того ж оброблюваних, то код повинен бути віднесений до прикладного.
Якщо тільки від якихось констант, типів, даних описують формат інших даних,
то це системний код. Більш того - така оцінка може виявити очевидні
логічні помилки. Наприклад, якщо в коді написано, що якщо параметр
беззнакові, то робити одне, а якщо більше 12, то інше. Наведемо кілька
прикладів, які демонструють розрізнення прикладного і системного контекстів. p>
string
func (string str) p>
( p>
int len = strlen (
str.c_str ()); p>
for (int i = 0; i
str [i] = WinToKoi (str [i]); p>
return
str; p>
)
p>
В
цьому прикладі код не залежить від значення символів в рядку. Які б вони не
були, програма буде виконуватися так само. Таким чином, цей код
є системним. p>
string func (int sum) p>
( p>
if (sum <10) p>
return "мало";
p>
if (sum <100)
p>
return "нормально";
p>
if (sum <
1000) p>
return "багато";
p>
return "дуже багато"; p>
) p>
В
цьому коді виконання алгоритму явно залежить від значень даних. Тому такий
код я класифікують як прикладної. p>
При
розробці програми я б вважав за гарним стилем розміщення наведених функцій у
різних модулях, з тим, щоб існували модулі, що відповідають за прикладну
частину і за системну частину. Втім, для невеликої програми розміщення таких
функцій в одному модулі може бути цілком виправдане. p>
Крім
наведеного правила класифікації коду на системний і прикладної слід
звертати увагу на змішаний випадок, що існує в явному вигляді при
складанні функцій, що оперують візуальним представленням даних. При
візуалізації даних слід враховувати існування національних стандартів
подання даних, які можуть відрізнятися так само і форматом
подання. Наприклад, при візуалізації часу по російському стандарту
слід зазначати годину, хвилину і секунду, а при візуалізації з англійської
стандарту слід дописувати ще й символи вистави "AM/PM".
Таким чином, код незалежний від значення даних, починає залежати від
контексту його роботи, який є дані. Ще більш складний випадок --
формування візуалізації строкового подання із застосуванням особливостей
мови, наприклад "сума прописом". До якої категорії віднести таку
функцію? Думаю, що до прикладної. p>
Наведене
правило класифікації, звичайно, не є догма. Але особисто я намагаюся
дотримуватися таких простих правил в роботі і вони мені допомагають у
проектуванні і відшуканні помилок. p>
Список літератури h2>
Для
підготовки даної роботи були використані матеріали з сайту http://karataev.nm.ru/
p>