Чому ми повинні вивчити процедурне програмування, перш ніж вивчати об'єктно-орієнтоване програмування [закрито]


10

Я зараз на 4 курсі в ІТ-університеті, і коли я розмовляю зі своїм професором на цю тему, він відкидає мою думку і піддає мені дуже важку критику (в моєму університеті нас викладали на C (ANSI) (у процедурі Клас програмування - на 1 курсі в університеті) до C ++ (в класі OOP на 2 курсі) та інші ...

Але в 13 років мого брата мене вчили, перш за все, Java і нічого іншого. Тепер він може робити майже все, що може зробити звичайний студент 2 курсу з Java.

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


8
Тому що в Асемблера немає об’єктів.

9
Це як, чому нас слід навчити правильно розраховувати, перш ніж навчитися користуватися калькулятором.

22
Оскільки об'єктно-орієнтована конструкція є хибною. Програми - це сукупність поведінки, яка діє на даних. Об'єкти часто вводять зайву складність. Читайте "Як проектувати програми: вступ до програмування та обчислення".

8
Як говорив хтось інший, "Не відволікайте нових програмістів з OOP": prog21.dadgum.com/93.html - в основному все, що OOP перешкоджає навчанню нових програмістів основ. Ви навчаєте їх одночасно двом дійсно складним поняттям.
Джон Ріплі

7
@juxstapose - мовляв, об’єктно-орієнтоване програмування вводить зайву складність - це як сказати, що ми повинні вирізати транспортні засоби з одного блоку сталі. Просто моя думка.

Відповіді:


23

Короткий підсумок:

  1. Тому що в реальному світі рано чи пізно вам доведеться працювати з процесуальним кодексом.

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

  3. Доповнення до відповіді 2. Оскільки ООП є складнішим за процедурне програмування, тому краще спочатку вивчити процедурне програмування.

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

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

  6. [NEW] Оскільки модульне програмування, яке зазвичай змішується і плутається з процедурним програмуванням, може бути застосоване до OOP. Тому питання може бути прочитане як "Чому ми повинні вивчити модульне програмування, перш ніж ми вивчимо об'єктно-орієнтоване програмування"

Опис розширеного розточення:

Пункт 1 дуже зрозумілий, не подальше пояснення.

Пункт 2, Класи, Спадщина, Поліморфізм, Інтерфейси тощо.

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

Те саме я почув від людей, які їхали від звичайного С до С плюс плюс.

Пункт 4. Більшість випадків програмісти поєднують кілька методів програмування або парадигм, або способів вирішення проблеми. Функціональний, процедурний, ООП, логічний.

Навіть Java "Pure OO" не є таким простим програмуванням об'єктів, як це говорить.

+1 бал за словами "Процедурне програмування" замість "Структурне програмування". Або модульне програмування. Це важливо.

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

Сьогодні я прочитав декілька "чистих" програм OO, схожих на "Об'єктно-орієнтований код спагетті", тобто програміст використовував OOP, але його код виглядає безладно.

Багато разів я можу прочитати код ОО і сказати, що програміст навчився Структурному програмуванню перед ООП, оскільки код чіткий і впорядкований.

А для модульного програмування я бачив кілька додатків. в C ++ та PHP, які не використовують модулі. *


18

Я б подумав, що аналогія буде схожа на математику. Вам потрібно спочатку вивчити деякі основні поняття (додавання / віднімання / ...), а потім перейти до більш складних тем (алгебра / числення). Процедурна програма дуже лінійна і її легше зрозуміти потік управління, коли ви вивчаєте синтаксис. OOP, можливо, вважається більш складним, він базується на більш простих конструкціях, що використовуються в процедурних мовах, але є більш абстрактним і важче зрозуміти. Починаючи з мов, таких як C, також зближує вас з обладнанням і змушує вирішувати проблеми розподілу пам'яті та покажчики, які вам потрібно зрозуміти, але насправді не користуєтесь такими мовами, як Java / C #. Будь-яка реальна цінність у тому, щоб зазнати цього в школі, незалежно від того, приходить він перший чи другий.

FWIW, це з часом зміниться. Коли я почав школу, ми вивчили Паскаль та PL / 1. Ми не потрапили до C до того часу, поки не буде просунутий передовий клас мов (що датується мені). Я не брав Java до аспірантури - вона ще не була придумана!


+1 - якийсь парадокс намірів там ... "більш абстрактний і важче зрозуміти" :)

10
@Spacemoses - не дуже, чим абстрактніше щось, тим простіше обговорення, але чим важче зрозуміти реальність того, про що йде мова.

погодився, зараз я бачу вашу думку.
ses011

12

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


3
але функції + стан = об’єкти
Дан Д.

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

1
"Шаблони дизайну, знайдені в цій спільноті" - звучить як особиста проблема в "спільноті Java", якщо це ваша позиція.
ses011

1
@Dan D: орієнтація на об'єкт - це набагато більше, ніж поєднання функцій та стану в об’єкті ...
Marjan Venema

4
@Spacemoses: У мене проблема з будь-якою спільнотою розвитку, яка не відповідає принципу KISS. Найкращим рішенням проблеми найчастіше є найпростіше рішення.
біт-трейдлер

11

Ви цього не робите.

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

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

Єдиної відповіді немає, оскільки:

  • Починати з чогось процедурного, такого як C (або навіть складання), може бути хорошим вибором, адже ви дізнаєтесь, як комп’ютери насправді працюють

  • Починати з чогось об'єктно-орієнтованого Java може бути хорошим вибором, оскільки навчитися та застосовувати OOP в реальному житті порівняно просто, і тому, що він вчить тебе про ** формування

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

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


4
+1 натискаю, і я не можу повірити, що мені довелося прокрутити стільки поганих відповідей, щоб знайти його!
jk.

Насправді у мене були проблеми з поглибленням математичних функцій на деякий час, тому що я спершу навчився кодування, і поняття функції, яка "є", а не "робити речі", мене здивувала. : 3
StarWeaver

6

Мова може бути об'єктно-орієнтована як C ++, Java або C #. І ви можете почати з цих мов. Але справа в тому, що навіть з цими мовами OO, ви повинні спочатку вивчити процедурне програмування, потім OOP. Я думаю, те ж саме зробили і ти з братом.


3
+1 точно. Кожен метод ООП - це коротка процедурна програма. Якщо ви не знаєте , як поєднати невеликі шматочки (тип, літерні значення, змінні, оператори, =присвоювання, if, forі т.д.) в більші шматки (методи), як ви можете сподіватися коли - небудь зрозуміти ООП. Як і у більшості навичок, бути дуже розумним, вмотивованим та / або мати доступ до інструкцій один на один може дозволяти вам вивчати декілька суміжних тем одночасно.
Девід Харкнесс

3

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

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

OOP через C ++ / obj-C вводить схему організації коду, що є ще однією справою. Це може ускладнити вивчення вищезазначених понять.

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

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

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


3

Кишки об'єктів OOP складаються з процедурного програмування.

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

Ви дійсно не навчилися б OOP у вступному класі, це був би просто синтаксис - стрибок прямо в OOP зробить речі складнішими (спочатку), ніж це вже є.

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

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

Якби я тебе , я б забрати деякі з наступних книг: Мова програмування C , The Java Programming Language , шаблони проектування , Банди чотирьох і штрихування . Я б точно взяв копію мови програмування на С, якби серйозно ставився до C / C ++.

Якщо ви просто хочете пройти весь шлях Java (і зробити це за $) id, підберіть кілька книг про шаблони дизайну Java та про те, як використовувати Java з веб-серверами Apache та Tomcat та деякими книгами з програмування баз даних SQL. Java запускає стільки дупи в Інтернеті, вибачте, але в PHP була історія тонн отворів у безпеці, що робить це так само, як біль в попці, як Windows, щоб уникнути вкорінення вашого сервера або введення баз даних SQL.

Ви також повинні витратити час, щоб вивчити SQL, Oracle MySQL Postgresql і MSSQL мають багато спільного щодо синтаксису, але якби мені довелося просто вибрати один для себе вивчення вибору id Id Postgresql тільки тому, що це BSD з ліцензією замість GPL (ви повинні шукати порівняння і контраст на ліцензії GPL / BSD)


2

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

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

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


2

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

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

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


0

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

Перш ніж сказати що-небудь інше, я абсолютно не заперечую проти старших програмістів, багато хто з них просто дивовижно кваліфіковані. На жаль, іноді ті, хто ні, хто змився і ніколи насправді не були по-справжньому хорошими в програмуванні для початку .. стають професорами, коли вони не можуть зламати це у «реальному світі». (Не всі професори також ... але ... МНОГО)

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


2
У мене був вчитель, який використовував C від 1989 року, але це було для мікрочіпа, який очікував, що c '99. Потім був той другий викладач, який використовував 'c ++', але без STL або шаблонів. Можливо, також були структури з функціональними вказівниками в них.
Ape-inago

1
Якщо чесно, STL і шаблони взагалі не є вступними темами C ++. Основна мета будь-якого курсу програмування на 101 рівні - навчити створювати добре структуровану послідовну, умовну та ітераційну логіку в межах обмежень заданого синтаксису. Усі інші мовні особливості - це лише синтаксичний цукор, який дозволяє групувати основні структури управління, а також пов'язувати їх з даними.
біт-трейдлер

оуч два канали. побачив, що один з них = P дивний для мене, хоча, як думка спочатку виходив від старшого програміста, який допоміг мені оговтатися від поганого навчання. @Ape: Керівник нашого відділу CS намагався навчити нас COBOL протягом року ще в 2004 році XD (найменше моїх турбот, пов'язаних з його "викладацьким" стилем, я нічим не заперечую, оскільки я можу працювати над деякими точками продажу машини хаха, але гуси ... серйозно?)
Гарет Клаборн

1
@ bit-twiddler - Так сер, дуже дивно. Я багато не покладаюсь на цей досвід у цій думці, але я заглянув в інші місця. Я дуже люблю обидва стилі програмування, і мені здається, вони повинні навчати їх разом. Я просто вважаю, що навіть трохи молодші професори не мають однакового відсотка завзяття з цього приводу. ІМО, це гарна річ. Я розумію, що деякі вважають, що процедурні спочатку важливі.
Гарет Клаборн

1
@ bit-twiddler: Так, але це був не вступний курс. Це був 4-й курс просунутого курсу з розробки баз даних, і ми повинні були використовувати c ++. Це просто почувалося не так, переживши c ++ на такому високому рівні з попередніми курсу.
Апе-інаго

0

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

Тут також є додатковий елемент: два підходи до навчання з питань програмування. Можна починати з мінімальної кількості (наприклад, збірка, в багатьох місцях процедурна, деякі інші починаються з ланцюгів), а потім піднімається вгору (в бік OO / Functional / Managed). Інший підхід - починати з фізичного світу (наприклад, браузер / Windows 7 тощо), а потім починати заглиблюватися. У кожного підходу є плюси і мінуси. Ваш університет обрав перший і почати з процедурних. Може бути якесь обгрунтування або вони просто скопіювали когось іншого :-).


1
"Програмування ОО прийшло для вирішення проблем процедурного програмування". Це була мета, але ОО створило стільки проблем, скільки вирішило.
біт-твідлер

@ bit-twiddler: Дуже велика історія. Орієнтуючись на (або звужуючи його) на педагогічний аспект, він робить випадок: що у нас це було, як ми зробили це краще: що (ви сперечаєтесь, чи краще чи ні)
Димитріос Мітріотіс

0

Не існує жодної причини, окрім інституційної інерції. Подивіться на КМУ, вони викинули всю навчальну програму OOP та замінили її функціональним програмуванням. Отже, ще раз, відповідь на ваше запитання полягає в тому, що це довільний вибір, який роблять адміністратори будь-якої школи, яку ви відвідуєте. Якщо хтось цікавиться фактичним твердженням, яке я висловив тут, це повідомлення про зміну навчальної програми в КМУ одним професором / адміністратором: Навчання ФП першокурсникам .


1
-1 введення в оману - хоча я побачив нитку (за допомогою google search), яка стверджувала, що КМУ викинув OOP зі свого навчального плану першого курсу CS та замінив його функціональним програмуванням, офіційна навчальна програма КМУ починається з мови програмування Alice, яка є об'єктом, орієнтований [див. enr-apps.as.cmu.edu/assets/SOC/CS_SPRING.htm]
Стівен А. Лоу

1
@ davidk01: (1) фактично неправильне твердження у відповіді. (2) "Аліса - це вільно доступний навчальний інструмент, призначений для першої експозиції студентів до об'єктно-орієнтованого програмування " від alice.org
Стівен А. Лоу

2
@Steven A. Lowe: Прямо з вуст коня: "Об'єктно-орієнтоване програмування повністю виключається із вступного навчального плану, оскільки воно є антимодульним та антипаралельним за своєю суттю, а отже, непридатним для сучасної навчальної програми CS. Запропонований новий курс з об'єктно-орієнтованої методології проектування буде запропонований на рівні другокурсників для тих студентів, які бажають вивчити цю тему ". - Навчання
ПП

1
@ davidk01: відмінне посилання, дякую. З цитованої в цій статті статті комітету "Хоча об'єктно-орієнтоване програмування (у безлічі його форм) залишається домінуючою темою у розробці промислового програмного забезпечення, використання об'єктно-орієнтованих мов, таких як Java, на вступному рівні вносить значну складність та відволікає. від основних цілей на вступному рівні . Здається, краще надавати більш детальне висвітлення методології розробки та впровадження ООС, як пізніше в навчальній програмі, щоб дозволити більш цілеспрямовану концентрацію основ на вступному рівні ". [наголос мій] ...
Стівен А. Лоу

1
@ davidk01: Я радий погодитися погодитися. Назвіть мене педантичним, якщо вам подобається, але для мене є значна різниця між зміною акценту на вступному рівні та "викинувши всю їх навчальну програму OOP". Навряд чи я б назвав зменшення обсягу вступних занять "великою зміною" ;-)
Стівен А. Лоу
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.