Алгоритми описують, що повинен робити комп’ютер. Структура описує, як алгоритм викладений [у вихідному коді]. OOP - це стиль програмування, який використовує певні "об'єктно-орієнтовані" структури.
Книги алгоритмів часто уникають OOP, оскільки вони зосереджені на алгоритмі, а не на структурі. Фрагменти коду, які значною мірою покладаються на структуру, як правило, є поганими прикладами, що містяться в книзі алгоритмів. Крім того, книги OOP часто уникають алгоритмів, оскільки вони захаращують історію. Місце продажу OOP - це його плинність, а прив’язка до алгоритму робить його більш жорстким. Це більше про фокус книги, ніж про все інше.
У реальному коді життя ви будете використовувати обидві сторони. Ви не можете вирішити комп'ютерні проблеми без алгоритмів, за визначенням, і вам буде складно написати хороші алгоритми без структури (OOP чи інше).
Як приклад, де вони розмиваються, візьміть Динамічне програмування. У книзі алгоритмів ви б описали, як взяти однорідний набір даних у масиві та використовувати Динамічне програмування для досягнення рішення. У книзі OOP ви можете натрапити на таку структуру, як Visitor, що є способом створення довільних алгоритмів для безлічі різнорідних об'єктів. Приклад книги DP можна розглядати як дуже простий відвідувач, що працює над об'єктами в загальному порядку "знизу вгору". Візерунок відвідувачів можна розглядати як скелет проблеми ДП, але не вистачає м'яса та картоплі. Насправді вам часто знадобляться обидва разом: ви використовуєте шаблон Visitor для боротьби з неоднорідністю у вашому наборі даних (DP поганий у цьому), а ви використовуєте DP у структурі Visitor для організації свого алгоритму для мінімізації часу виконання (Visitor не '
Ми також бачимо алгоритми, що працюють над вершиною моделей дизайну. Приклади складніше в невеликому просторі, але коли ви маєте структуру, ви починаєте маніпулювати цією структурою, і для цього використовуєте алгоритми.
Чи є якісь проблеми, які може бути представлений і вирішений тільки ООП?
На це питання складніше відповісти, ніж ти думаєш. До першого замовлення не існує обчислювальної причини, чому вам потрібен ООП для вирішення будь-якої проблеми. Простим доказом є те, що кожна програма OOP збирається до збирання, що є мовою, що не є OOP.
Однак у більшій схемі речей відповідь починає соромитися так. Ви рідко обмежуєтесь просто обчисленням методологій. Більшість часу є такі речі, як потреби бізнесу та навички розробника, які входять у рівняння. Багато заявок сьогодні не можна було б написати без ООП не тому, що ООП якимось чином є основоположним завданням, а тому, що структура, надана ООП, мала важливе значення для підтримки проекту в порядку та бюджеті.
Це не говорить про те, що ми ніколи не відмовимось від ООП у майбутньому для якоїсь смішної нової структури. Це просто говорить, що це один з найефективніших інструментів нашого інструментарію для напрочуд великої частини завдань програмування сьогодні. Майбутні проблеми можуть змусити нас підходити до розвитку, використовуючи різні структури. Для одного, я очікую, що нейронні мережі потребують зовсім іншого підходу до розробки, який може бути, а може і не бути "об'єктно-орієнтованим".
Я не бачу, щоб OOP зник у найближчому майбутньому через те, як думають дизайнери алгоритмів. На сьогодні звичайною схемою є те, що хтось розробляє алгоритм, який не використовує OOP. Спільнота OOP розуміє, що алгоритм насправді не відповідає структурі OOP, і насправді не потрібно, тому вони загортають весь алгоритм у структуру OOP і починають його використовувати. Розглянемо boost::shared_ptr. Алгоритми підрахунку посилань, які shared_ptrзнаходяться всередині , не дуже сприятливі для ООП. Однак модель не набула популярності, поки не shared_ptrстворили навколо неї обгортку OOP, яка розкрила можливості алгоритмів у структурованому форматі OOP. Зараз він настільки популярний, що перетворив його на останню специфікацію для C ++, C ++ 11.
Чому це так вдало? Алгоритми чудово вирішують проблеми, але вони часто потребують значних початкових інвестицій, щоб зрозуміти, як їх використовувати. Об'єктно-орієнтована розробка дуже ефективна для розгортання таких алгоритмів та надання інтерфейсу, який потребує менших початкових інвестицій для навчання.