Принципи роботи зі складними системами 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Принципи роботи зі складними системами



 

Крім методичних рекомендацій при конструюванні великих систем часто використовуються прагматичні принципи роботи зі складними системами взагалі. Вони відіграють значну роль у виробленні якісних технічних рішень в досить широкому контексті.

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

Абстракція (abstraction) і уточнення (refinement). Абстракція є універсальним підходом до розгляду складних речей. Інтелект однієї людини досить обмежений і просто не в силах мати справу відразу з усіма елементами і властивостями систем великої складності. Відомо, що людині вкрай важко тримати в голові одночасно десяток-півтора різних речей, а в сучасних системах число істотних аспектів доходить до сотень. Для того щоб якось таки працювати з такими системами, ми користуємося своєю можливістю абстрагуватися, тобто відволікатися від усього, що несуттєво для досягнення поставленої в даній момент приватної мети, що не впливає на ті аспекти розглянутого предмета, які важливі для неї.

Щоб перейти від абстрактного уявлення до більш конкретного, використовується зворотний процес послідовного уточнення. Розглянувши систему в кожному аспекті окремо, ми намагаємося об'єднати результати аналізу, додаючи аспекти по одному і звертаючи при цьому увагу на можливі взаємні впливи і виникаючі зв'язки між елементами, виявленими при аналізі окремих аспектів.

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

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

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

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

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

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

Прикладом розбиття на модулі може служити структура пакетів і класів бібліотеки JDK. Класи, пов'язані з основними сутностями мови Java і віртуальної машини, зібрані в пакеті java.lang. Допоміжні широко застосовуються в різних додатках класи, такі як колекції, представлення дати і пр., зібрані в java.util. Класи, що використовуються для реалізації потокового введення-виведення - в пакеті java.io, і т.д.

Інтерфейсом класу служать його загальнодоступні методи, а інтерфейсом пакета - його загальнодоступні класи.

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

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

Хороше розбиття системи на модулі - непросте завдання. При її виконанні залучаються такі додаткові принципи.

Перевикористання. Цей принцип вимагає уникати повторень описів одних і тих же знань - у вигляді структур даних, дій, алгоритмів, одного і того ж коду - в різних частинах системи. Замість цього в добре спроектованої системі виділяється одне джерело, одне місце фіксації для кожного елемента знань і організовується перевикористання цього джерела у всіх місцях, де потрібно використовувати цей елемент знань. Така організація дозволяє при виникненні необхідності (наприклад, при виправленні помилки або розширенні наявних можливостей) зручним чином модифікувати код та документи системи відповідно з новим змістом елементів знань, оскільки кожен з них зафіксовано рівно в одному місці.

Прикладом може служити організація бібліотечних класів java.util.TreeSet і java.util.TreeMap.

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

Другий клас реалізує те ж саме для асоціативного масиву або словника (map), якщо визначено порядок його ключів. Всі алгоритми роботи зі збалансованим деревом в обох випадках однакові, тому має сенс реалізувати їх тільки один раз.

Якщо подивитися на код цих класів у бібліотеці JDK від компанії Sun, можна побачити, що її розробники так і вчинили - клас TreeSet реалізований як відповідний асоціативний масив TreeMap, в якому ключі представляють безліч збережених значень, а значення в будь-якій парі (ключ, значення) рівне null.

 



Поделиться:


Последнее изменение этой страницы: 2017-01-24; просмотров: 266; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.217.144.32 (0.008 с.)