- •Тема 7. Розробка архітектури прогоамних систем
- •7.2. Розділи, топологія системи та асинхронізація
- •7.3. Розподіл підсистем за процесорами та задачами
- •Оцінка потрібних ресурсів
- •Заміна програм апаратурою
- •Розподіл підсистем за процесорами
- •7.4. Управління сховищами даних
- •7.5. Архітектури прикладних систем
- •7.6. Архітектура системи управління банківською мережею
- •7.7. Розробка об’єктів
- •7.7.1. Спільний розгляд трьох моделей
- •7.7.2. Алгоритм реалізації операції
- •7.7.3. Оптимізація розробки
- •7.7.4. Реалізація управління
- •7.8. Уточнення успадкування класів та розробка залежностей
7.7.2. Алгоритм реалізації операції
Кожній операції, визначеній в уточненій об’єктній моделі, має бути поставлений у відповідність алгоритм, який реалізує цю операцію. При виборі алгоритму можна керуватися такими міркуваннями:
обчислювальна складність алгоритму: для алгоритмів, які застосовуються у доволі великих масивах даних, важливо, щоб оцінка їх обчислювальної складності була розумною; наприклад, навряд чи має сенс уникати побічності у посиланнях, особливо коли введення побічності істотно спрощує розуміння програми, тоді як заміна пухирчастого сортування з оцінкою складності n на алгоритм сортування з оцінкою n log n завжди різко прискорює обчислення;
зрозумілість алгоритму та легкість його реалізації: для досягнення цього можна також піти на невелике зниження ефективності; наприклад, введення рекурсії завжди знижує швидкість виконання програми, але спрощує її розуміння (рис. 76);
гнучкість: велика частина програм рано чи пізно повинна бути модифікована; як правило, високоефективний алгоритм важкий для розуміння та модифікації; одним з виходів є розробка двох алгоритмів виконання операцій: простого, але не дуже ефективного та ефективного, але складного; при модифікації, у цьому разі змінюється простіший алгоритм, що забезпечує працездатність системи на період розробки ефективнішого модифікованого алгоритму.
Визначення функції n!
0!=1
n! = n * (n — 1)!
Нерекурсивний алгоритм Рекурсивний алгоритм
factorial (int n) fact (int n)
{
int i, f = 1; int f = 1;
for (i = n; i > 0; i --) if (n > 0)
f = f * i; f = f * fact (n — 1);
return(f); return (f);
} }
Рис. 76. Порівняння двох алгоритмів
Вибір алгоритмів пов’язаний із вибором структур даних, які обробляються цими алгоритмами. Вдалий вибір структур даних дозволяє істотно оптимізувати алгоритм. Ще одним способом спрощення та оптимізації алгоритмів є введення внутрішніх (допоміжних) класів. Ці класи не мають відповідностей у реальному світі; вони пов’язані з реалізацією, але можуть істотно спростити її ( приклади: клас «стек», клас «двозв’язний список» і т. ін.).
Нарешті, нерідко буває корисно внести деякі зміни до структури об’єктної моделі. Ці зміни зводяться до введення додаткових класів та до перерозподілення операцій між класами. Так, у прикладі, зображеному на рис.75, введення додаткового класу «фрагмент» істотно прискорює видачу зображення.
При розподіленні операцій за класами керуються такими міркуваннями:
якщо операція виконується лише над одним об’єктом, то вона визначається в класі, екземпляром якого є цей об’єкт;
якщо аргументами операції є об’єкти різних класів, то її потрібно розмістити в класі, якому належить результат операції;
якщо аргументами операції є об’єктами різних класів, причому змінюється значення лише одного об’єкта, а значення інших об’єктів лише читаються, то її слід умістити до класу, якому належить змінюваний об’єкт;
якщо класи разом з їх залежностями утворюють зірку з центром в одному з класів, то операцію, аргументами якої є об’єкти цих класів, належить розмістити в центральний клас.
