Переваги об'єктно-орієнтованого програмування [закрито]


35

Примітка : це питання є відредагованим уривком з публікації в блозі, яку я написав кілька місяців тому. Після розміщення посилання на щоденник у коментарі на Programmers.SE хтось попросив я поставити тут питання, щоб вони могли відповісти на нього. Це повідомлення мій найпопулярніший, так як люди , здається, типу «я не отримую об'єктно-орієнтоване програмування» в Google багато . Сміливо можете відповісти тут, або в коментарі Wordpress.

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

Чи може хтось, будь ласка, дати мені свої уявлення про переваги об’єктно-орієнтованого програмування?


2
О, приємний - складно придумати визначення, з яким погоджуються всі, хто каже, що вони виконують ООП! (Навіть нехтуючи тими, хто насправді просто займається, наприклад, процедурним програмуванням в одязі OOP.)
SamB

10
Це насправді звучить так: "Я не отримую програмування на С. Чи не можемо ми просто використовувати мову складання?" для мене.
тіа

2
@Joel: Я не обов'язково знаю тих самих неінформованих прихильників, як і ви, але, думаю, хороша частина цього може полягати в тому, що вони були введені в програмування класами на мовах ОО. Якщо це ваша основна лінія, ви не розумієте, як це зробити кроком. Моєю першою мовою був Applesoft BASIC, і я навчився декількох діалектів BASIC, плюс C, Pascal і трохи складання x86, перш ніж я був представлений OOP Delphi та C ++. Люди, які пережили різницю, краще пояснюють це.
Мейсон Уілер

3
Більше негативних коментарів про OOP тут: шкідливі.cat-v.org/software/OO_programming , включаючи цитати від Dijkstra та Rob Pike.
imgx64

3
@Joel: Ти вдарив моє заперечення проти ООП по голові. Люди, які є однодумцями OOP, як правило, мають слабкий погляд на процедурне програмування і майже не мають досвіду в будь-якій іншій парадигмі. Функціональне програмування їм виглядатиме абсолютно чуже (докази: підрахуйте кількість людей, які останнім часом запитують, як робити класи та об'єкти в Ерланге з якоїсь химерної причини), а логічне програмування вибухне їх головою, я переконаний. Я можу лише уявити, що б з ними зробили деякі насправді дивні парадигми ....
ДАЛЕ МОЕ правильне ДУМКА

Відповіді:


7

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

Така машина дуже жорстка у своїй роботі та прийнятні входи. Машини не ставлять під сумнів інтелект дизайнерів, ані його поточне робоче середовище. Він буде продовжувати дотримуватися процедур до тих пір, поки це спрямовано. Навіть якби зміна сировини або компонентів могло б мати драматичний вплив на те, що сталося в наступних операціях, машина все одно виконає свої процедури. Процес потрібно переглянути, щоб побачити, які зміни в процедурах були необхідні для компенсації та отримання бажаного результату. Зміна дизайну або конфігурації виробу також може зажадати значних змін у виконаних операціях або в їх порядку. Хоча відповідальні за виробництво швидко дізналися важливість ізоляції операцій якнайбільше для зменшення небажаних наслідків між ними, багато припущень зроблено щодо компонентів стану, які перебувають під час їх переробки; припущення, які можуть бути не виявлені, поки кінцевий продукт не опиниться в руках користувача в деяких різних робочих умовах.

Ось що таке процедурне програмування.

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

Щодо переваг об'єктно-орієнтованого перед не об’єктно-орієнтованим програмним забезпеченням:

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

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

1
За винятком випадків, коли ОП не запитували про функціональне програмування, тому ваш коментар не має достоїнств. Тим більше, що моя відповідь є прийнятою.
Хупернікетес

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

46

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

По суті, OOP - це спосіб використовувати імперативну парадигму для кращого управління високими ступенями складності, створюючи «розумні» структури даних, що моделюють проблемну область. У (стандартній процедурній, не орієнтованій на об'єкт) програмі у вас є дві основні речі: змінні та код, який знає, що з ними робити. Код приймає дані від користувача та різних інших джерел, зберігає його у змінних, оперує ним і виробляє вихідні дані, які надходять до користувача або різних інших локацій.

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

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

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

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

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

EDIT: У відповідь на запитання Джоела в коментарях,

Чи можете ви пояснити, що містить "об'єктно-орієнтована програма" (крім цих фантазійних визначень, які ви окреслили), що принципово відрізняється від імперативної програми? Як ви "змушуєте котитися кульки?"

Трохи відмови тут. Моя модель "об'єктно-орієнтованої програми" - це в основному модель Delphi, яка дуже схожа на модель C # /. NET, оскільки їх створили колишні члени команди Delphi. Те, що я тут кажу, може не застосовуватись або не застосовуватись в інших мовах ОО.

Об'єктно-орієнтована програма - це та, в якій вся логіка структурована навколо об'єктів. Звичайно, це треба кудись завантажувати. Ваша типова програма Delphi містить код ініціалізації, який створює одиночний об'єкт, який називається Application. На початку програми він дзвонить Application.Initialize, потім дзвінок до Application.CreateFormкожної форми, яку ви бажаєте завантажити з пам'яті спочатку, а потім, Application.Run,яка відображає основну форму на екрані, і запускає цикл введення / події, що утворює ядро ​​будь-якої інтерактивні комп’ютерні програми.

Додаток та ваші форми опитують на вхідні події з ОС та переводять їх у виклики методів на ваш об'єкт. Одне, що дуже часто зустрічається - це використання обробників подій або "делегатів" у .NET-говорінні. Об'єкт має метод, який говорить: "зробіть X і Y, але також перевірте, чи призначений цей обробник подій, і зателефонуйте, якщо він є". Обробник подій - це покажчик методу - дуже просте закриття, яке містить посилання на метод та посилання на екземпляр об'єкта - що використовується для розширення поведінки об'єктів. Наприклад, якщо у мене є об’єкт кнопки у моїй формі, я налаштовую її поведінку, додаючи обробник подій OnClick, який призводить до того, що якийсь інший об'єкт виконує метод при натисканні кнопки.

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


4
Я думаю, ти справді вдарив цвяхом по голові цю відповідь. Коли ви інкапсулюєте маніпуляції з даними (гаразд, вони виділяють тут вказівник, а потім переміщують туди кілька біт ...), що залишилося - це логіка високого рівня програми (якщо це зроблено правильно, ви можете написати жахливий код у будь-якій парадигмі .) .
ChaosPandion

2
Це чудове пояснення, дякую. Чи можете ви пояснити, що містить «об’єктно-орієнтована програма» (крім цих вигадливих визначень, які ви окреслили), що принципово відрізняється від імперативної програми? Як ви "змушуєте котитися кульки?"
Джоель Дж. Адамсон

1
+1: Я думаю, ви насправді зрозуміли, що "це в основному намагаються повторити ті самі речі в меншому масштабі", в основному інший рівень абстракції (або ну, більше схожий на інший можливий рівень для створення абстракції).
n1ckp

1
@Karthik Трохи запізнився на вечірку, але насправді ні, OOP не повинен означати просто повторне використання занять. Вся концепція типової системи - це абстракція для групування об'єктів разом за загальними інтерфейсами. Але ви також можете використовувати систему на основі прототипу (наприклад, Javascript), коли метод викликає об'єкт розв’язувати ланцюг прототипу замість ланцюга класів. Він все ще має всі функції OOP, але дозволяє створювати спеціальні об'єкти та типи, просто додаючи нові речі до вже наявного об'єкта. Тоді ви можете клонувати цей об’єкт, щоб отримати більше того нового типу.
CodexArcanum

2
+1 за те, що чітко вказує на справжню перевагу OOP. "По суті, OOP - це спосіб використовувати імперативну парадигму для кращого управління високими ступенями складності, створюючи" розумні "структури даних, що моделюють проблемний домен."
Karthik Sreenivasan

6

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

Зрештою, коли я був дитячим програмістом, навіть у Фортран, було таке поняття, як вказівник на підпрограму. Дійсно корисно мати можливість передати покажчик на підпрограму як аргумент іншій підпрограмі.

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

Я не впевнений, чи вони коли-небудь вбудовували це у Фортран, але це легко зробити в С та його нащадках.

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


5

Існують різні види систем OO, і важко отримати визначення, з яким всі згодяться. Замість того, щоб спробувати показати, як OO Java схожий на звичайну систему Lisp Object, я розпочну з чогось більш звичайного, крок за кроком.

Припустимо, у вас багато об’єктів, що існують як розкидані дані. Наприклад, точки можуть бути елементами в масиві X, Y і Z. Для того , щоб розглянути саму точку, це має сенс , щоб витягнути всі дані разом в щось на зразок C struct.

Тепер для будь-якого об'єкта даних ми отримали ці дані разом. Однак у процедурній програмі код розсіяний. Припустимо, ми маємо справу з геометричними фігурами. Існує велика функція малювання фігур, і їй потрібно знати про всі фігури. Існує велика функція пошуку площі, а інша - по периметру. Код для кола розсипається по декількох функціях, і для додання іншого типу фігури нам потрібно знати, які функції потрібно змінити. В об'єктно-орієнтованій системі ми збираємо функції в той самий вид речі ( class), що і дані. Тому, якщо ми хочемо переглянути весь код кола, він є у Circleвизначенні, і якщо ми хочемо додати a, Quartercircleми просто пишемо його клас і у нас є код.

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

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

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


3

OO має багато різних визначень, так. Я впевнений, що ви можете знайти багато таких самостійно. Мені особисто подобається Rees Re: OO як спосіб зрозуміти їх. Я здогадуюсь, що ви це прочитали вже з моменту, коли ви цитуєте Пола Грехема. (Я рекомендую його всім, хто цікавиться ОО.) Я буду більш-менш прийняти тут визначення Java {1,2,3,7,8,9}.

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

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

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

Java-ish OO - це рішення на півдорозі цих проблем, які, можливо, виграли конкурс на популярність. Оскільки це той самий механізм, який застосовують люди Java до проблем дрібного масштабу, створених невдалою мовою, він, як правило, починає виглядати як магічне рішення всього, ніж просто спосіб бути організованим. Люди, знайомі з функціональним програмуванням, як правило, віддають перевагу іншим рішенням, наприклад класам типів CLOS або Haskell, або метапрограмуванню шаблонів, коли застрягають у C ++, або ще (як я, щодня працюю в C #) використовують OO, але просто не хочуть все, що від цього хвилює .


+1 - чудова відповідь. "Я не думаю, що ОО є дуже корисним в невеликих масштабах".
Картик Сріенівасан

Я навіть читав статтю ( dl.acm.org/citation.cfm?id=326103 ), в якій говориться, що OOP не виявляє жодної реальної переваги продуктивності від процедурних для перших двох випусків програмного продукту. Наскільки я розумію, тільки починаючи з третього випуску, ви маєте реальні переваги, оскільки ви можете краще використовувати / рефакторний код, написаний у OO-стилі, ніж у процедурному стилі.
Джорджіо

1

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

  • Людина - об’єкт. Людина має деякі властивості, як вік і стать. Людина може робити речі: їсти, спати, керувати автомобілем.
  • Автомобіль також є Об'єктом (хоча і різного типу). Він також має такі властивості, як марка, модель та рік. Автомобіль може робити речі: рухатися.

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


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

1

OOP = структури даних + передача повідомлень + успадкування, все це логічна еволюція в моделях програмування.

OOP можна зрозуміти (програмістами) приблизно за 90 секунд (посилання див. У моєму профілі). Поняття дуже прості.

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


+1 - Я згоден. Як застосовувати ООП, потрібно багато часу та практики, хоча просто знати, що вони є, це не забирає багато часу, оскільки ключове слово тут.
Картик Сріенівасан

0

Нещодавно я писав щоденник, що вам може бути корисним: Процедурний та OOP Пояснений .


Я не знаю, чому люди проголосували за це! Ця стаття краще, ніж усі вищезгадані разом! мій голос за +1
Харіс

Її проголосували за те, що це просто посилання на біг, що сильно не рекомендується. Дивіться мета-запитання про stackoverflow: Чи справді відповіді, що містять посилання в інших місцях, "хороші відповіді"?
icc97

0

Я вперше зрозумів це:

До об'єктно-орієнтованого програмування ви мали структуроване програмування . Все зосереджено навколо процесу. Перше питання, яке ви повинні задати собі, - це " Що я хочу зробити з інформацією? ".

При об'єктно-орієнтованому програмуванні він зосереджений навколо даних. Перше питання, яке ви повинні задати собі, - це " Інформація про відьом, з якою мені потрібно мати справу? ". Це полегшує абстрагування.


0

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

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

Як ви зауважили, існує величезний клас додатків, для яких це не такий чудовий спосіб втілити рішення. Ви, здається, живете в світі, який переважно складається з таких програм. У своєму блозі ви згадуєте про реалізацію проблеми "99 пляшок пива" (вашої "улюбленої вітрини програмування"). 99 пляшок пива, безумовно, входить до цієї категорії. Спроба зрозуміти об'єктно-орієнтоване програмування, дивлячись на реалізацію 99 пляшок пива, трохи схожа на спроби зрозуміти висотку архітектуру, дивлячись на дерево. Навіть дуже добре побудований будинок з дерева може вас тільки так навчити.

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


-1

Я думаю, що сторінка Вікіпедії - це гарне місце для отримання основ:
http://en.wikipedia.org/wiki/Object-oriented_programming

В основному ідея полягає в тому, що процедурне програмування, яке намагалося вдосконалити ООП, зосереджувалося на моделюванні процесів. OOP переходить на модель, де акцентовано увагу на "речах", які ви моделюєте, а процеси та дані цих речей містяться в цих речах.

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

Я сподіваюся, що це допомагає. Просто продовжуйте читати про це і дивитися на код, і він раптом "клацне". Це був мій досвід.


Доводчики піклуються, щоб пояснити причину?
RationalGeek

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