Чи стає OOP легше чи складніше? [зачинено]


36

Коли концепції об'єктно-орієнтованого програмування були впроваджені програмістами ще тому, це виглядає цікаво, а програмування було більш чистим. OOP був такий

Stock stock = new Stock();
stock.addItem(item);
stock.removeItem(item);

Це було легше зрозуміти під назвою, що само описується.

Але тепер OOP з таким малюнком, як об'єкти передачі даних, об'єкти цінності, сховище, введення залежностей тощо, став складнішим. Для досягнення зазначеного вам може знадобитися створити кілька класів (наприклад, конспект, фабрика, DAO тощо) та впровадити декілька інтерфейсів

Примітка. Я не проти найкращих практик, що полегшують співпрацю, тестування та інтеграцію


23
Створити хорошу архітектуру програмного забезпечення завжди було важко і завжди буде (швидше за все).
johannes

6
Я хотів би перейменувати addItemдля addі removeItemдля remove. Тому що це легше читати. stock.add(item)або stock.remove(item). І більше орієнтовані на ООП.
razpeitia

1
Оригінальний OOP виглядав майже не так, як показали ви. OOP не про синтаксис , а про якусь абстракцію, популяризовану Smalltalk. Це не обов'язково доводить вашу думку неправильно, а також приміщення не є хибним; скоріше, це навіть правдивіше, ніж ви усвідомлюєте.
Конрад Рудольф

1
ви порівнюєте яблука та апельсин за вашою логікою, тоді імперативне програмування (тобто петлі та умова if) - простіше, ніж усі речі, які ми маємо сьогодні. Імперативне програмування - це будівельні блоки для класів / OOP, а класи / OOP - це будівельні блоки для моделей дизайну. По мірі прогресування речі стають складнішими, оскільки ви вирішуєте складніші проблеми.
Лежати Райан

2
@LieRyan - Я бачив, що проблеми стають складними лише тому, що ніхто з відповідальних не зміг їх вирішити простим імперативним програмуванням і напав на них з дизайнерськими моделями поверх OOP поверх простого імперативного рішення, яке повинно було бути реалізовано поодинці.
mouviciel

Відповіді:


35

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

То чому ж ви сьогодні сприймаєте OOP як складніший, ніж коли ви почали його використовувати?

Однією з причин може бути те, що код, якому ви піддаєтеся, стає складнішим - не тому, що OOP став складнішим, а тому, що ви просунулися на сходах для навчання, і отримаєте можливість читати більші та складні бази коду.

Ще одна причина може полягати в тому, що, хоча парадигма складності не змінилася, розмір і складність середнього програмного проекту, можливо, цілком є. Маючи потужність обробки на мобільних телефонах класу клієнтів, які були б мокрою мрією розробника на сервері менше двох десятиліть тому, широка громадськість, в основному, очікувала, що гладкі анімовані графічні інтерфейси користуються навіть найдешевшим додатком для викиду, а настільний ПК початкового рівня буде більш потужним ніж "суперкомп'ютер" 1980-х років, цілком природно, що планка була піднята з перших днів Smalltalk та C ++.

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

Через це більшість сучасних мов OOP містять функції інших парадигм, що робить їх більш виразними та потужнішими, але й складнішими. C # - це головний приклад для цього: він має очевидні корені OOP, але такі функції, як делегати, події, умовиводи типу, варіанти типів даних, атрибути, анонімні функції, лямбда-вирази, дженерики тощо, походять з інших парадигм, особливо функціонального програмування .


Так шаблони дизайну додали складності. Значення шаблонів дизайну не обов'язково OOP, але додано для покращення OOP.
fasmipe tunmise

@tunmisefasipe: Не зовсім. Шаблони дизайну - це просто перевірені рішення стандартних проблем; вони не є «доповненням» до ООП, а наслідком. Складність була вже там; шаблони дизайну просто забезпечують стратегії кулінарної книги для вирішення цього питання.
tdammers

17

Ні, він стає все більш переробленим. І ви маєте рацію - в чаті SO C ++ ми часто жартуємо про AbstractSingletonFactoryProxyBeanBridgeAdapterManagers, який ми бачимо в коді Java.

Але хороший код не виявляє цю властивість. У хорошому коді ви все ще можете сказати

std::stack<int> s;
s.push(5);
s.pop();

4
Не зрозуміло з вашої посади, але я думаю, що надмірна інженерія очевидна і в коді Java, і в C ++. Це не властивість жодної мови сама по собі, а практика програмістів ... Обидві мови дозволяють писати хороший код, хоча жодна (ІМО) для цього особливо не підходить :) Рамки в Java, на жаль, смокчуть.
Андрес Ф.

12
Якщо говорити про надмірну
Безпечний

3
@AndresF. правда, але ви, схоже, не так багато отримуєте в коді C ++, тоді як у Java та .NET: просто подивіться на шаблон дизайну MVVMVMMD msdn.microsoft.com/en-us/magazine/hh965661.aspx, як один приклад того, як ви берете «простий код» і плескаєте по ньому шаблон дизайну, щоб він виглядав «простіше», а потім ляпайте іншим дизайнерським малюнком по дизайнерському шаблону, оскільки оригінальний шаблон був не таким простим, як рекламований. Надмірна техніка стає дедалі звичнішою.
gbjbaanb

5
Я б сперечався з «стаючим» бітом. Надмірна техніка така ж стара, як і техніка.
Gort the Robot

4
@AndresF. Ми особливо анти-Java в чаті, але це правда, що Java, більше ніж C ++ , заохочує надмірну інженерію, тому що робить її більш доступною (GC), а популярні корпоративні Java-бібліотеки популяризували цей стиль, як ви зазначили себе.
Конрад Рудольф

10

Я б сказав, що проблеми зі «складністю», про які ви згадуєте, не мають нічого спільного з ООП. Це має більше спільного з відокремленням проблем.

Багато років тому я працював над системою, де доменний клас відповідав за завантаження з бази даних, наприклад

var userId = Request.QueryString["UserID"].ToInt();
var user = new User(userId);
user.Name = ...;
...
user.Save();

Це дуже чіткий код. Немає проблем у розумінні цього. Однак проблема полягає в тестуванні коду. А саме, як би я тестував Userклас, не завантажуючи його з бази даних? І як би я перевірив цей код обробки веб-запитів, не маючи доступу до бази даних? Це просто неможливо.

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

Тож якщо ми повернемося до прикладу, який ви пишете, що б ви зробили з запасом після його створення? Збережіть його в базі даних

Stock stock = new Stock();
stock.addItem(item);
stock.removeItem(item);
this.StockRepository.Add(stock);

Там, зробили! Немає руху в прогресуванні ООП, що говорить про те, що це повинно бути важче. На жаль, якщо ви вибрали для використання коду доступу до даних АБО Map Map, ви можете зіткнутися з проблемою, що картографічний оператор OR АБО встановлює обмеження щодо того, як можна записати вашу систему. Але це вже інша справа.

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


Ви знаєте зусилля, які потрібно докласти, щоб створити своє сховище. Хоча після встановлення він стає багаторазовим.
fasmipe tunmise

можливо, проблема полягає в тестуванні одиниць, якщо б у нас були кращі інструменти для тестування цілого (як у вас все одно) замість крихітних фрагментів, у нас були б системи з меншою кількістю помилок?
gbjbaanb

2
@ gbjbaanb: у нас це вже є, це називається інтеграція / функціональне тестування. Тестування блоку служить іншій, але не менш необхідній цілі
Кевін

@gbjbaanb - У нас вже є чудові інструменти для загальносистемного / приймального тестування, наприклад, огірок на платформі Rails. Але команди, які дійсно хороші і пишуть дуже мало помилок, але також швидко доставляють, вони пишуть безліч одиничних тестів і лише кілька загальносистемних тестів. Дивіться про "трикутник тестування", наприклад, тут jonkruger.com/blog/2010/02/08/the-automated-testing-triangle
Піт

4

Ні. Наші проблеми насправді не змінилися; панель прийнятного коду піднята.

Для досягнення зазначеного вам може знадобитися створити кілька класів (наприклад, конспект, фабрика, DAO тощо) та впровадити декілька інтерфейсів

Вам не потрібно цього робити. Але якщо ви цього не зробите, проблеми виникають; проблеми, які завжди були там. Однак програмісти мають достатньо досвіду для виявлення цих проблем та створення механізмів їх полегшення (якщо потрібно). Ми дізнаємось більше про них і підходимо до кращих рішень (див., Наприклад, погляд програмістів на синглтон).

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


3

Приклади "введення в ОО" набагато простіші, ніж у реальному світі. Вам потрібен лише один клас, щоб досягти сказаного. Проблема в тому, що він не робить багато. Деякі зразки дизайну намагаються наблизитися (наприклад, ActiveRecord.) Але в кінцевому підсумку будь-який приклад, який не є тривіальним, матиме більше одного класу; що це нормально.


Також зауважте, що рамки створюються з часом. Так що так, програмування вимагає більше знань. Це також означає, що можна зробити більше за менший час.
Жанна Боярський

3

Мови програмування, які сьогодні використовують OO, намагаються задовольнити складні вимоги та умови, які постійно змінюються. OO дозволяє своїм приймачам приховувати різноманітні рівні складності (серед інших особливостей), щоб кодування стало більш зрозумілим і легшим у побудові та розумінні. Однак ця функція не завжди є поза рамкою. У вашому прикладі, OO дозволило вам приховати від мене деякі деталі, надавши метод управління елементами в колекції і, можливо, навіть зберегти його за допомогою методу "AddItem". Витрати зусиль на приховування складності можуть призвести до простоти у використанні та багаторазового використання, що спрощує життя. Наприклад, багато реалізацій ORM дозволяють спілкуватися з базами даних, не вимагаючи від програміста запису даних про SQL. Це дійсно потужно і робить його простішим для розробника.

Шаблони, на які ви посилаєтесь, - це саме те. Вони повинні полегшити ваше життя. Але від вас залежить їх прийняття та коригування. Те, що потрібно більше працювати, це лише тому, що ви отримуєте більше переваг. Це як платити більше за Ferrari. Якщо ви хочете, щоб ви доплачували за них. Отже, якщо ви вирішили створити масштабоване рішення N-Tier, яке можна запустити на декількох серверах і різних базах даних із зворотнього боку, для цього є вартість. Якщо ваша заявка не потребує такої складності, ігноруйте зайві фрагменти та поверніться до найпростішого рішення, яке покриває ваші потреби (KISS & YAGNI).

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


Чіткі точки. Я знаю ЯГНІ. Що таке KISS?
фансипі тунісу

2
@tunmisefasipe, KISS - це коротка назва принципу дизайну. Оригінальні слова - "Keep It Simple (Stupid)" (ref: en.wikipedia.org/wiki/KISS_principle ), але більш ввічливою фразою може бути "Зробіть так просто".
NoChance

3
@tunmisefasipe - KISS = Тримай просто, глупо. Фраза, яку я повторюю НАЙКРАЩЕ, і НАД, і ВІД, і вона все ще не завжди
забуває

@MichaelKohne, ми все робимо! Я здогадуюсь, що це мистецтво вміти спрощувати речі. E = M C C говорить дуже багато у дуже стислій формі!
NoChance

3

Коротка відповідь : Так, тому що ви вирішуєте більш складні проблеми.

Довгий відповідь (сильно упереджений) : Для мене шаблони дизайну зазвичай вказують на те, що деякі парадигми мають проблеми в даній області. Шаблони OOP стосуються проблем OOP (на нижньому рівні шаблони Java стосуються проблем Java), моделі FP - проблеми FP тощо.

Під час програмування у вас можуть бути різні пріоритети. Ви можете мати правильну програму, ви можете мати короткий час на ринок, найшвидшу програму, довгострокову ремонтоздатність або миттєву ремонтопридатність новим наймом. Залежно від густоти, в якій ви перебуваєте, у вас буде дуже різне - якщо ви програмуєте контролер електростанції, ви хочете робити це вперше, а не виправляти помилки ("Чи відбувається занепад кожного разу, коли ви натискаєте Ctrl+Alt+Del?"). Якщо ви перебуваєте в HPC, логіка може бути відносно простою, але ви хочете виконати її якомога швидше тощо. Крім того, деякі парадигми краще відповідають певним проблемам (скажімо, AI та логічне програмування, дані та реляційні бази даних).

OOP до певної міри "занадто хороший" у простих випадках, і це історія "моделювання реального живого". Наприклад , в першій книзі про ООП я прочитав там були класи Person, Employeeі Managerз is-aвідношенням. Поки що добре, але що робити, якщо працівника підвищують до менеджера?

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

PS. Так - відповідь упереджена щодо ООП, і я визнаю, що певною мірою це "реакція" на ООП. OOP має свої цілі, але, на мою думку, це не єдине, остаточне рішення.

PPS. Так - використовуйте шаблони дизайну - вони роблять програмування OOP в кінцевому рахунку більш простим.

PPPS. Я використовував OOP як синонім імперативного програмування OOP.


2

Я вважаю, що справа в тому, що документи та приклади стають більш реалістичними.

Ранні книги OOP (особливо ранні книги Java) представляли абсурдно спрощений погляд на програмування додатків. Приклади "Дебетування банківського рахунку з програмою Java на 10 ліній" завжди були особливо прикро, оскільки я бачив приклади реального життя цього простого завдання, що працює на 6000 рядків коду COBOL (і спроба заміни Java працює до 3500 рядків до того, як вона була відмовлена як нездійсненне!).

На щастя, книги OO тепер, як правило, визнають складнощі реального життя та надають корисні приклади того, як з ними боротися.

Але якщо ви хочете побачити, як запустити банківський рахунок лише у 15 рядках функціонального програмування коду, це ваш чоловік

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.