Коли ми фактично використовуємо об'єктно-орієнтоване програмування? [зачинено]


35

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

Я знаю, що об'єктно-орієнтований код не є чистішим за визначенням, і навпаки, не-OO код не є за визначенням crappy. Питання, яке я задаю, може бути більш-менш засноване на думці, але можуть бути деякі правила, про які я не знаю.

Ще трохи інформації про те, що потрібно зробити:

  • проаналізувати .csvфайл та обробити дані на основі конфігураційного файла (стовпці можуть бути різними - наприклад, у кількості стовпців або даних, які вони містять)
  • використовувати вище оброблені дані для створення нових спеціалізованих форматованих даних (або декількох файлів на основі деяких з вищевказаних значень)
  • використовувати останні відформатовані дані для створення XML-файлу.
  • розділити XML-файл на декілька XMLs залежно від їх вмісту
  • додаток має базуватися на CLI
  • Звичайно, є й інші речі, такі як: реєстрація деяких подій, розбір аргументів CLI тощо.

Тепер це взагалі не є великим / важким додатком, воно також майже закінчене, але впродовж усього процесу розробки я постійно запитував себе, чи потрібно це робити за допомогою OOP чи ні.

Отже, моє запитання буде таким: як ви, хлопці, знаєте / вирішували, коли використовувати OOP у додатку?


12
Re: "Клієнт ... не хвилює код, він просто хоче, щоб справа була зроблена". Гаразд, тоді зробіть справу. Але наскільки складна ця річ? Наскільки добре ви насправді розумієте вимоги? Наскільки ймовірно, що клієнт десь пізніше попросить вас змінити річ? Іноді потрібен швидкий і брудний злом, але чим більше часу і енергії ви збираєтеся вкласти в нього, тим більше шансів, що якийсь структурований підхід до вирішення проблеми (наприклад, дизайн OO) піде вам на користь.
Соломон повільно

5
Не використовуйте "EDIT" чи інші подібні засоби у своїх публікаціях. Кожна публікація обміну стеками має детальну історію редагування, яку може переглянути кожен. Інформація на кшталт "Я не запитував, що таке ООП", все одно більш доречна в коментарі, а не ваше питання.
Роберт Харві

@RobertHarvey добре, зрозумів. Я зроблю це наступного разу.
Грайдеану Алекс.

Відповіді:


60

Python - це багатопарадигмальна мова, що означає, що ви можете вибрати парадигму, найбільш відповідну для завдання. Деякі мови, як Java, є однопарадигмою OO, що означає, що ви отримаєте головний біль, якщо спробуєте скористатися будь-якою іншою парадигмою. Плакати, які говорять, що "завжди використовуйте ОО", ймовірно, походять з фонової мови такою мовою. Але на щастя у вас є вибір!

Зауважу, ваша програма - це програма CLI, яка читає деякі вхідні дані (файли csv та config) та дає деякий вихід (xml-файли), але не є інтерактивною, а отже, не має процвітаючого GUI чи API. Така програма природно виражається як функція від введення до виводу, яка делегує інші функції для підзадач.

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

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

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

Підсумок: я пропоную купу функцій, розділених на модулі для організації, але ніяких об'єктів.


8
Нарешті виважена відповідь, яка не просто співає хвалу OOP :-)
cmaster

1
Такої відповіді я очікував. Можна трохи розширити свою відповідь? Поки що це виглядає приголомшливо.
Грайдеану Алекс.

3
@ Dex'ter: ніж ти. Яку додаткову інформацію ви шукаєте?
ЖакБ

3
Я додам до цього, що функціональне програмування може бути парадигмою для читання.
Ендрю каже, що повернеться до Моніки

1
@ Бергі: Так, це є перевагою мови, що містить парадигми. Ви можете використовувати бібліотеки OO без необхідності писати власну програму в OO-стилі.
ЖакБ

15

Розглянемо кнопку на графічному інтерфейсі. Він має стан (розмір, колір, положення, етикетка тощо). З ним можуть трапитися речі (натиснуті, потрібні перемальовки тощо). У таких ситуаціях моделювання його як об’єкта має сенс. Як об'єкт, він може містити його стан, набір дій, які можна виконати на ньому (методи), і він може сповіщати інші частини програми про те, що з ним сталися речі шляхом вистрілення подій.

OOP - це чудовий інструмент для обробки графічних інтерфейсів та інших ситуацій, коли частини системи мають непостійний стан.

Інші ситуації, наприклад, описана вами, коли дані зчитуються з джерела, обробляються та записуються до місця призначення, добре обробляються за допомогою іншого підходу: декларативного (або функціонального) програмування. Декларативний код для обробки даних, як правило, простіший для читання та коротший, ніж рішення OOP.

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

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


6

Об'єктно-орієнтоване програмування додає у ваш арсенал чотири нові інструменти :

  1. Інкапсуляція
  2. Абстракція
  3. Спадщина
  4. Поліморфізм

Ви б використовували OOP у своїй програмі, коли вона зросла досить великою і складною, щоб скористатися цими інструментами.


18
Абстракція та поліморфізм - інструменти, що надаються багатьма "орієнтаціями" програмування. OOP фактично пропонує більш слабку форму капсулювання, ніж інші підходи, оскільки успадкування заохочує протікання конструкцій абстрагування. Єдине, що OOP дійсно додає до інструментарію - це успадкування, яке в цілому сприймається як погана річ.
Девід Арно

4
@DavidArno: Ви в основному говорите "Ніколи не використовуйте OOP".
Роберт Харві

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

6
Жоден із чотирьох інструментів (інкапсуляція, абстракція, спадкування, поліморфізм) не є специфічним для ООП. Можливо, ви повинні пояснити, чим OOP відрізняється від інших парадигм wrt від цих вимірів.
Джорджіо

4
@gardenhead ваше дивне почуття переваги нічого не робить для вашої позиції. Можливо, вам слід розгорнути запитання під назвою "Чому найчастіше використовуються мови OO?" А ще краще, Ctrl + F і введіть "GUI".
Гусдор

1

Це питання мені здається трохи заплутаним. Якщо ви пишете це на Python, ви напевно будете використовувати об’єкти. Коли ви відкриваєте файл, він повертає об'єкт. Коли ви отримуєте результат, він повертає об'єкт ітератора. Кожна створена вами функція - це об'єкт. Питання про значення ОО в додатках Python, здається, найменш дивним.

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

Можливо, ці відмінності навколо дизайну ОО та функціонального дизайну стають застарілими. Якщо я створюю взяти поліморфну ​​функцію на об'єкті, призначеному для OO *, і передати покажчик на цю функцію на об'єкт як параметр на функціонально стильовану функцію *, це OO чи це функціонально? Я думаю, що це і дійсно ефективний підхід до вирішення проблем.

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

* надмірність навмисна: я не хочу, щоб мене звинувачували в тому, що припускають, що об'єкти є OO або що функції функціональні.


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

Ви можете досить легко вважати об'єкт Python / JavaScript Записом, який є досить функціональним. У функціональних мовах є об'єкти. Ключ у другому слові: орієнтоване. Мови OOP повністю орієнтовані на використання об’єктів, тоді як деякі інші мови просто здаються їм ще однією частиною вашої панелі інструментів.
Ден Комора

0

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

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

І як тільки ви розмірковуєте про стан, то легко створити хороший код OOP, оскільки як тільки ваш код стає занадто складним, ви помітите, що більше не можете міркувати про свій стан і знаєте, що вам потрібно зробити рефактор.

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

І приємна річ: ви можете на тест.


3
Ваш приклад з читанням файлу з диска порівняно з читанням файлу з Інтернету також може бути реалізований з різними функціями. Для цього вам не потрібно ОО.
ЖакБ

0

Простіше кажучи:

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

Зважаючи на це, існують і інші фактори, які слід враховувати:

  • Чи володіють вашими програмістами OOP / OOD?
  • Чи володіють вашими програмістами мовою ООП?
  • Як ви думаєте, програмне забезпечення стане складним з часом?
  • Чи плануєте ви в майбутньому масштабувати чи повторно використовувати код?
  • Як ви думаєте, ваш "дизайн" може стати перевагою? тобто чи зможете ви використовувати це для зростання чи як фундамент для майбутніх проектів?

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

Але ...

Якщо ваша команда не володіє OOP / OOD і не має досвіду в цій галузі, займіться наявними ресурсами.


-2

Отже, моє запитання буде таким: як ви, хлопці, знаєте / вирішували, коли використовувати OOP у додатку?

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

  • Об'єкти структури малих даних, оскільки вони є так, часто є поліморфними, наприклад, проміжна структура даних після розбору чогось часто має декілька малих сутностей, які мають спільну поведінку, проте вони також є спеціалізованими. Це чудовий випадок використання для загального базового класу чи інтерфейсу зі спеціалізованими реалізаціями та поведінкою, тобто ієрархією класів (поліморфізм).

  • реєстрація, як приклад, тому що це дозволяє легко замінити інший реєстратор

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

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


6
Я не робив жодної позиції (хоч я і був поруч із цим), але я думаю, що це є причиною того, що ви отримали проти них: "Завжди використовуйте це, тому що це здорово" рідко є гарною порадою. Завжди є винятки. Жоден інструмент не випливає з недоліків, і OOP не є винятком. Скажіть людям, що це добре, розкажіть людям, для чого це добре, розкажіть людям, чому це добре, скажіть людям уникати альтернатив, якщо вони можуть, але ніколи не кажіть людям не думати про альтернативи.
cmaster

@cmaster, я в порядку, якщо люди зволікають, це їх вибір, і я це теж зробив. Щодо теми, я все ще думаю, що це правильна відповідь для людини, яка задає питання; ІМХО, ОП потрібно стрибати повністю і використовувати OOP, а не намагатися вирішити, коли використовувати OOP, а також час від часу вибирати клас, але в іншому випадку писати процедурний код.
Ерік Ейдт

2
@cmaster Я можу оцінити поради Еріка. Настільки часто, наскільки відповідь "це залежить" може бути політично правильним шляхом, давайте зіткнемося з людьми, ОО значною мірою стало базовим рівнем для програмних середовищ, які його підтримують. Тож не давайте ми себе думати, навряд чи ви можете помилитися з ОО. Описаний сценарій хоча і лінійний, досить складний, щоб об'єкти приносили вам певну користь.
Мартін Мейт

2
@ErikEidt "ОП потрібно перестрибнути всю дорогу і використовувати OOP". Ви можете перефразувати це як "ОП потрібно перестати думати про найкращий спосіб вирішити проблему замовника і просто слідувати Єдиному вірному шляху до Просвітництва". До жаль, я повинен був мати справу з великою кількістю так званих комп'ютерних професіоналів , які роблять слідувати цій методології проектування програмного забезпечення. Обов’язковий мультфільм Ділберта: dilbert.com/strip/1996-02-27
alephzero

1
настільки ж просто, як махнути цим рухом, як "ще один бездумний завзяття OOP", я думаю, що можна сказати, що насправді йдеться на 100% у щось, щоб справді інтерналізувати та поглинати це. не так, ви можете використовувати його щодня протягом усього життя, але так ви насправді ВИВЧАЙТЕ сильні та слабкі сторони, а не просто читаєте про них. Я б рекомендував майже будь-кому витратити кілька місяців, переходячи на хардкор OOP та кілька місяців хардкор-FP (á la haskell) і кілька місяців процедурного C і так далі. просто заходьте туди і збивайтеся з ним.
сара

-2

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

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

Що робити - Ця частина полягає в тому, що блоки виконують фактично самі роботи. Тут клас походить від базових класів, створених у розділі "Як розділити".

Оно може отримати велику користь від OOPS

  1. якщо ви можете повторно використати існуючий фреймворк і потрібно лише виконати конкретні деталі в розділі "що робити".
  2. Функціонал, який реалізується для поточного проекту, є загальним / загальноприйнятий один та інші проекти / майбутні проекти можуть отримати користь від рамок, що створюються під час розробки поточного проекту.
  3. Розбиття величезних проектів на загальновідомі зразки для вирішення великої проблеми.
  4. Використовуйте OOPS навіть для невеликого проекту, щоб звикнути до його використання та будьте готові, коли виникнуть проблеми із 1 - 3 типами

Отже, ви в основному говорите, що завжди слід використовувати OOP, незалежно від фактичного завдання, яке ви хочете вирішити?
ЖакБ

Ні :), там є багато програмних іграми, і деякі піддаються вирішенню певної проблеми краще, ніж інші. OOPS - це далеко не найкраще рішення для всіх, але OOPS - досить популярний. знадобиться час і практика, щоб створити хороший клас і структури в OOPS, тому, якщо ви хочете ефективно використовувати OOPS, краще почніть з менших проектів. Після того, як ви це освоїте, це повністю залежить від вас. Концепції OOPS я бачу в основному як інструмент для побудови фреймворку.
Рахул Менон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.