Я б припустив, що найважливішою характеристикою об'єктно-орієнтованого програмування є функція управління складністю .
Людський мозок може вмістити лише стільки понять за один раз - часто згадується межа запам'ятовування 7 +/- 2 незалежних предметів.
Коли я працюю над системою 600клок на роботі, я не можу одразу тримати всю цю річ у голові. Якби мені довелося це робити, я обмежувався б роботою над значно меншими системами.
На щастя, мені не доведеться. Різні шаблони дизайну та інші структури, які ми використовували в цьому проекті, означають, що мені не доведеться мати справу з усією системою відразу - я можу підібрати окремі фрагменти і працювати над ними, знаючи, що вони вписуються в ширший додаток чітко визначеними способами.
Усі важливі поняття ОО надають способи управління складністю.
Інкапсуляція - дозвольте мені мати справу із зовнішнім API, який надає мені різні сервіси, не переживаючи, як ці сервіси реалізовані.
Абстракція - дозвольте зосередитися на суттєвих характеристиках і проігнорувати те, що не має значення.
Склад - дозвольте повторно використовувати компоненти, які вже були побудовані в нових комбінаціях
Поліморфізм - дозвольте мені попросити послугу, не турбуючись про те, як різні об'єкти можуть надавати її по-різному.
Спадкування - дозвольте повторно використовувати інтерфейс чи реалізацію, надаючи лише ті фрагменти, які відрізняються від тих, що були раніше.
Принцип єдиної відповідальності - дозволяє зберігати мету для кожного об’єкта чіткою та стислою, тому про це легко міркувати
Принцип заміщення Ліскова - не давайте ставити пастки один одному, вводячи непарні залежності
Відкритий / закритий принцип - дозвольмо розширення та зміни способами, які не вимагають від нас ризику порушити існуючий код
Ін'єкція залежностей - давайте переймемо композицію на наступний рівень і зібрати компоненти разом набагато пізніше.
Розвиток, орієнтований на інтерфейс - давайте перенесемо абстракцію на наступний рівень і залежатимемо лише від абстракції, а не від конкретної реалізації.