Думаю, вам може бути корисною повідомлення в моєму блозі про непрохідні абстракції. Ось відповідна інформація:
Абстракція - це механізм, який допомагає взяти те, що є спільним серед набору пов'язаних фрагментів програми, усунути їх відмінності та дати можливість програмістам безпосередньо працювати з конструкцією, що представляє цю абстрактну концепцію. Ця нова конструкція (практично) завжди має параметризацію : засіб налаштувати використання конструкції відповідно до ваших конкретних потреб.
Наприклад, List
клас може абстрагувати деталі реалізації пов'язаного списку-- де замість думати з точки зору маніпулювання next
та previous
покажчиків, ви можете думати про рівень додавання або видалення значень до послідовності. Абстракція є важливим інструментом для створення корисних, багатих, а часом і складних рис із значно меншого набору більш примітивних понять.
Абстракція пов'язана з інкапсуляцією та модульністю, і ці поняття часто неправильно трактуються.
У List
прикладі інкапсуляція може бути використана для приховування деталей реалізації пов'язаного списку; наприклад, на об'єктно-орієнтованій мові, ви можете зробити приватні next
та previous
покажчики приватними, коли доступ до цих полів дозволений лише реалізації списку
Інкапсуляція недостатня для абстрагування, оскільки це не обов'язково означає, що ви маєте нову чи іншу концепцію конструкцій. Якщо б усі List
класи дали вам методи аксесуарів стилю ' getNext
' / ' setNext
', він би інкапсулював вас від деталей реалізації (наприклад, ви назвали поле ' prev
' чи ' previous
'? Що було його статичним типом?), Але це мала б дуже низький ступінь абстракції.
Модульність стосується приховування інформації : стабільні властивості задаються в інтерфейсі, а модуль реалізує цей інтерфейс, зберігаючи всі деталі реалізації в модулі. Модульність допомагає програмістам справлятися зі змінами, оскільки інші модулі залежать лише від стабільного інтерфейсу.
Приховування інформації сприяє інкапсуляції (щоб ваш код не залежав від нестабільних деталей реалізації), але інкапсуляція не потрібна для модульності. Наприклад, ви можете реалізувати List
структуру в C, виставляючи « next
» і « prev
покажчики» в світі, але і забезпечують інтерфейс, який містить initList()
, addToList()
іremoveFromList()
функції. За умови дотримання правил інтерфейсу ви можете гарантувати, що певні властивості завжди будуть зберігатись, наприклад, забезпечення того, що структура даних завжди буде у дійсному стані. [Класичний документ про модульність Парнаса, наприклад, був написаний із прикладом у зборі. Інтерфейс - це контракт і форма спілкування про дизайн, його не обов'язково перевіряти механічно, хоча саме на це ми покладаємось сьогодні.]
Хоча такі терміни, як абстрактні, модульні та інкапсульовані використовуються як позитивні описи дизайну, важливо усвідомити, що наявність будь-якої з цих якостей не дає автоматичного дизайну:
Якщо алгоритм n ^ 3 "добре інкапсульований", він все одно буде працювати гірше, ніж вдосконалений алгоритм n log n.
Якщо інтерфейс бере певну операційну систему, жодна з переваг модульної конструкції не буде реалізована, коли, скажімо, відеоігру потрібно перенести з Windows на iPad.
Якщо створена абстракція виявить занадто багато несуттєвих деталей, вона не зможе створити нову конструкцію з власними операціями: це буде просто інша назва для тієї ж речі.