Структурне програмування проти програмування OO


11

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

Будь-які ідеї ??


2
задавши це запитання на programmers.stackexchange.com, ви дасте більше відповідей.
реггі

2
Яка ваша аудиторія? Досвідчені непрограмістські програмісти (cobol тощо)? малодосвідчені програмісти (студенти тощо)? Керівники (зовсім не програмісти)?

Я про це раніше не чув, але я прочитав поширені запитання і, мабуть, краще запитати там.
Ахмед

мало досвідчений.
Ахмед

4
Хочеться, щоб деякі програми ОО були структуровані краще.
Скотт Вітлок

Відповіді:


17

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

  • Структуроване програмування - це дисципліна, що накладається на goto (пряма передача контролю)

  • Програмування ОО - це дисципліна, що накладається на покажчики на функції (непряма передача контролю)

  • Функціональне програмування - це дисципліна, накладена при призначенні.

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

Трохи складніше зрозуміти ОО. Ми часто визначаємо ОО як інкапсуляція, успадкування та поліморфізм. Що менше відомо, це те, що всі три ці атрибути є досяжними, і часто вони були досягнуті в C. Дійсно, C ++ почався як просто препроцесор, який склався до C. Це не так важко інкапсулювати в C. Не важко побудувати структури даних, які є підмножинами один одного, імітуючи спадкування. Поліморфізм, однак, трохи складніше. Він вимагає вказівників на функції, якими в С важко керувати. Мови на зразок C ++ дали нам дисципліну, нав'язану цим покажчиками функцій. Компілятор C ++ створив для нас vtables і ініціалізував покажчики всередині них відповідно до суворого формалізму. Тож у цілком реальному сенсі ОО є просто дисципліною, що накладається на ньогонепряма передача контролю, тобто покажчиків на функції.

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

Отже, врешті-решт, усі ці "Програмувальні технології" насправді обмежують дисципліни, а не підтримують технології. Вони кажуть нам , що НЕ робити більше , ніж вони говорять нам , що для робити. А це означає, що за останні 40 років розробка програмного забезпечення не зросла. Швидше, вона скоротилася. Це стає все більш обмеженим, оскільки ми дізналися все, чого не повинні робити.

Навчання того, що не робити - це добре; але ось заважаючи питання: Які нові речі ми дізналися , щоб зробити?


@Ahmed: +1 за "TL; DR, спасибі за відео" - підозрілий коментар (жартує)
n611x007

посилання гниття ... мертве посилання
slashdottir

7

Існує 3 основних способи програмування комп’ютера:

  1. Неструктуроване програмування - з gotos, як у старих інтерпретаторах BASIC, або в мові складання. Мало хто вже програмує цей шлях.
  2. Структуроване імперативне програмування - як на C, або PASCAL.
  3. Структуроване функціональне програмування - як у Haskell, ML або Lisp.

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


Я вас добре не розумію! Ви маєте на увазі, що ми повинні використовувати одну з 3-х парадигм, але ми не знаємо .. і OOP - це лише більше організації ??
Ахмед

Ви не можете програмувати, не вивчаючи ні структурованого імперативного програмування, ні структурованого функціонального програмування. Ці дві парадигми стосуються того, щоб зробити справи. З іншого боку, OOP - це про модуляризацію програми, яка вступає в дію лише після досягнення вами програми певного розміру. Хоча це безумовно виявляється в бібліотеках, які ви використовуєте при програмуванні весь час, можна мати ідеально хорошу бібліотеку класів без таких функцій OO, як спадкування, наприклад, бібліотеки класів Haskell, LISP або Standard ML.
Кен Блум

4

Вся справа в тому, як ви передбачаєте зміни.

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

Можна сказати, що OOP успадковує всю функціональність структурного програмування з додатковою функціональністю успадкування! :-D


На даний момент я не дуже люблю спадщину.

4
Ні я, але це тому, що уряд викрутив мого діда з пенсії. Що стосується ООП, однак, спадщина послужила мені досить добре!
corsiKa

На мій досвід, спадкування найкраще уникати в ООП. Як часто ви насправді будуєте суперклас на відміну від інтерфейсу? Улюблена композиція як загальне правило.
Янкс

1
@Janx: "Як часто ви фактично будуєте суперклас на відміну від інтерфейсу?" Так? Ви не «будуєте суперкласи»; ви берете існуючі класи і будуєте з них підкласи, і ви робите це постійно. Якщо ви не використовуєте спадщину, ви не отримуєте переваг заміни Ліскова та поліморфізму, то що в першу чергу ви робите в об'єктно-орієнтованому програмуванні? Склад - це інший інструмент із іншим випадком використання, а не заміна спадкування. Ви не повинні «віддавати перевагу» один одному; ви повинні використовувати обидва, для чого вони корисні.
Мейсон Уілер

1
@ Мейсон - варто відзначити, що Барбара Лісков (з принципу заміни Ліскова) насправді сказала (довге відео), що їй не дуже подобається спадщина.
Айдан Каллі

2

Поняття ортогональні. Структуроване програмування - це структурування коду в межах процедур / функцій / методів. Цілком можливо (і бажано) дотримуватися принципів структурованого програмування в межах методів класу при виконанні OOP.


1

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

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

Цікаве питання щодо цього питання було складено Стівом Йегге - в деяких аспектах - один з кращих описів відмінностей у підходах між двома стилями.


0

OOP легше зрозуміти, коли ви робите бізнес-модель. Якщо ви думаєте про елементи програми, ви використовуєте деякі ОБ'ЄКТИ та ВІДНОСИНИ між ними, наприклад, Книга має автора (-ів), заголовок, ISBN. Книгу потрібно пускати в бібліотеку, і студент може її запозичити. Структурне програмування змушує задуматися про конкретні процеси, не в абстракції.

OOP призначений для легких змін. Зміна структурної програми можлива, але повинна бути описана кодом. Зміна програми ОО може бути описана абстрактною зміною моделі.


0

Змінна сфера застосування:

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

  • Глобальна сфера застосування
  • Локальний / Функція / Область застосування

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

Мови OOP на зразок C ++ додають новий тип сфери застосування - область класу / об'єкта шляхом інкапсуляції. Цей розмах додатково покращується приватними / публічними варіаціями. І це вирішує багато проблем змінного масштабу. Області застосування більш визначені в OOP. І вказівники менш потрібні.

Це одна з чудових особливостей ООП.

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