Почему мы должны изучать процедурное программирование, прежде чем изучать объектно-ориентированное программирование [закрыто]

10

Сейчас я учусь на 4-ом курсе в IT-университете, и когда я говорю с моим профессором на эту тему, он отвергает мое мнение и дает мне очень жесткую критику (в моем университете нас учили C (ANSI) (в процедурном Занятия по программированию - в 1-м курсе в университете) до C ++ (в ООП-классе во 2-м курсе) и другие ...

Но в 13 лет я научил моего брата прежде всего Яве и ничему другому. Теперь он может делать практически все, что может делать обычный студент 2-го курса с Java.

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

Люк
источник
8
Потому что у Ассемблера нет объектов.
9
Это то, почему нас должны научить правильно рассчитывать, прежде чем научиться пользоваться калькулятором.
22
Потому что объектно-ориентированный дизайн несовершенен. Программы представляют собой набор поведений, которые работают с данными. Объекты часто вносят ненужную сложность. Читайте "Как разрабатывать программы: введение в программирование и вычисления".
8
Как сказал кто-то еще: «Не отвлекай новых программистов с помощью ООП»: prog21.dadgum.com/93.html - в основном все, что ООП мешает обучать новых программистов основам. Вы учите их двум действительно сложным понятиям одновременно.
Джон Рипли
7
@juxstapose - говорить, что объектно-ориентированное программирование вносит ненужную сложность, все равно что говорить, что мы должны вырезать автомобили из единого стального блока. Просто мое мнение.

Ответы:

23

Краткое резюме:

  1. Потому что в реальном мире рано или поздно вам придется работать с процедурным кодом.

  2. Потому что процедурные языки могут работать как расширение или введение в объектно-ориентированные языки, а не просто как альтернатива.

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

  4. Потому что в реальном мире программисты работают и объединяют несколько способов решения проблем, AKA «многопарадигмальное программирование», а не просто одна парадигма.

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

  6. [NEW] Поскольку модульное программирование, которое обычно смешивается и путается с процедурным программированием, может быть применено к ООП, поэтому вопрос может быть прочитан как «Почему мы должны изучать модульное программирование, прежде чем изучать объектно-ориентированное программирование»

Расширенное скучное описание:

Пункт 1 очень ясный, а не дальнейшее объяснение.

Точка 2, Классы, Наследование, Полиморфизм, Интерфейсы, и так далее ...

Пункт 3, я кодирую Процедурный Паскаль, прежде чем я изучил Объектно-ориентированный Паскаль, когда я туда попал, я сказал: «Послушайте, классы похожи на небольшие процедурные программы ... ... и вы можете заставить их говорить друг с другом, круто !!! ».

Я слышал то же самое от людей, которые перешли от простого C к C плюс плюс.

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

Даже Java "Pure OO" не так простое объектное программирование, как говорится.

+1 балл за «процедурное программирование» вместо «структурное программирование». Или Модульное Программирование. Это важно

Хотя часто эти термины учат друг другу и используются взаимозаменяемо, это не так. Структурированное программирование включает в себя множество концепций, а не просто использование процедур, и одна из них заключается в том, чтобы программа не выглядела как «код спагетти».

Сегодня я прочитал несколько «чистых» ОО-программ, которые выглядят как «Объектно-ориентированный код спагетти», что означает, что программист использовал ООП, но его код выглядит как беспорядок.

Много раз я мог прочитать код ОО и сказать, что программист изучал структурированное программирование до ООП, потому что код понятен и упорядочен.

Что касается модульного программирования, я видел несколько приложений. в C ++ и PHP, которые не используют модули. *

umlcat
источник
18

Я думаю, что аналогия будет похожа на математику. Сначала вам нужно изучить некоторые основные понятия (сложение / вычитание / ...), а затем перейти к более сложным темам (алгебра / исчисление). Процедурная программа очень линейна, и ее легче понять, когда вы изучаете синтаксис. ООП, возможно, считается более сложным, он основан на более простых конструкциях, используемых в процедурных языках, но является более абстрактным и более сложным для понимания. Начало работы с такими языками, как C, также приближает вас к аппаратному обеспечению и заставляет решать проблемы распределения памяти и указателей, которые вам необходимо понимать, но которые вы не можете использовать в таких языках, как Java / C #. Есть некоторая реальная ценность того, чтобы подвергаться этому в школе, независимо от того, идет ли это первым или вторым.

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

tvanfosson
источник
+1 - что-то вроде парадокса намерения там ... «более абстрактно и труднее понять» :)
10
@Spacemoses - не совсем, чем более абстрактно что-то, тем легче обсуждение, но тем сложнее понять реальность обсуждаемого.
согласен, теперь я понимаю вашу точку зрения.
ses011
12

Объектно-ориентированное программирование - это организованный сборник процедурных фрагментов. Я думаю, что урок, который вы изучаете, заключается в том, что объектно-ориентированная методология помогает поддерживать организацию и ремонтопригодность. Есть много программистов, которые не могут сделать это различие и будут утверждать, что их программы являются объектно-ориентированными, когда они более процедурны.

ses011
источник
3
но функции + состояние = объекты
Дан Д.
4
Ориентация на объекты часто усложняет обслуживание, потому что это увеличивает объем кода. Системы на основе Java - это кошмар для обслуживания из-за уровня чистоты ОО и паттерна проектирования, обнаруженного в этом сообществе.
немного крутой
1
«Шаблоны дизайна, найденные в этом сообществе» - звучит как личная проблема в «сообществе Java», если это ваша позиция.
ses011
1
@Dan D: объектная ориентация - это гораздо больше, чем объединение функций и состояния в объекте ...
Marjan Venema
4
@Spacemoses: у меня проблема с любым сообществом разработчиков, которое не поддерживает принцип KISS. Лучшее решение проблемы часто является самым простым решением.
битник
11

Вы не

Сначала мы изучили функциональное программирование , используя Scheme. Затем мы перешли к процедурному, затем ООП, а затем декларативному программированию. И верьте, хотите нет, хотя я уже знал программирование, я думаю, что на самом деле это было проще и для других людей: потому что FP - это как математика! Итак, вы уже знаете основы.

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

Там нет однозначного ответа, потому что:

  • Начинать с чего-то процедурного, такого как C (или даже сборки), может быть хорошим выбором, потому что вы узнаете, как на самом деле работают компьютеры.

  • Начинать с чего-то объектно-ориентированного Java может быть хорошим выбором, потому что его относительно легко изучить и применить ООП в реальной жизни, и потому что он учит вас ** формированию

  • Начинать с функционального программирования, такого как Scheme, может быть хорошим выбором, поскольку оно учит вас думать более абстрактно (с точки зрения функций вместо переменных), что в конечном итоге делает вас лучшим программистом.

Если ваш учитель не учит этому хорошо, то не имеет значения, с чего вы начинаете; они в значительной степени получат то же самое.

user541686
источник
4
+1 удар, и я не могу поверить, что мне пришлось пролистать так много плохих ответов, чтобы найти его!
JK.
У меня действительно были проблемы с поиском математических функций какое-то время, потому что я сначала выучил немного кодирования, и концепция функции «есть» вместо «делать вещи» сбила меня с толку. : 3
StarWeaver
6

Язык может быть объектно-ориентированным, как C ++, Java или C #. И вы можете начать с этих языков. Но дело в том, что даже с этими ОО-языками вы должны сначала изучить процедурное программирование, а затем ООП. Я думаю, вы сделали то же самое с вашим братом.

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

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

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

ООП через C ++ / obj-C вводит шаблон организации кода, который является еще одной вещью для изучения. Это может усложнить изучение приведенных выше понятий.

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

В конце концов, я думаю, что это компромисс между изучением того, как работает оборудование, и изучением шаблона организации кода. Что касается того, что более важно, я действительно не знаю. Реальный мир требует знания обоих, по крайней мере, в некоторой степени.

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

Кертис Батт
источник
3

Внутренности объектов ООП состоят из процедурного программирования.

Если вы не можете сделать цикл for, используйте указатели правильно, объявите ваши типы и функции, вы не сможете писать интерфейсы для своих классов, тем более заставляя внутренности делать что-то стоящее.

В любом случае, вы действительно не будете изучать ООП во вводном классе, это будет просто синтаксис - прыгание прямо в ООП усложнит понимание (на первый взгляд), чем уже есть.

ООП не о каком-то объявлении синтаксиса для формирования классов, а о структурах данных, шаблонах проектирования, полиморфизме, наследовании и композиции.

Чтобы делать все эти вещи, вам нужно знать процедурное программирование, что-то, что легко сделать на C. В любом случае вы можете перенести почти все, что вы узнали с C, на Java или C ++, вам, возможно, придется переосмыслить некоторые вещи, которые вы воспринимали как должное в C, НО ... Вы должны знать грамматику (где вы находитесь во вводной части C), чтобы писать предложения (должны писать процедуры для определения интерфейсов), затем параграфы (должны знать структуры данных), а затем знать некоторые шаблоны проектирования (трагедия, комедия, ошибки) герой, как они взаимодействуют и когда их не использовать), прежде чем вы сможете писать полные романы (полная система ООП).

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

Если вы просто хотите пройти весь путь по Java (и делать это за $), найдите несколько книг о шаблонах проектирования Java и о том, как использовать Java с веб-серверами Apache и Tomcat, а также некоторые книги по программированию баз данных SQL. Java так много задевает в Интернете, извините, но у PHP была история с множеством дыр в безопасности, из-за которой Windows и задница доставляли такую ​​же боль, как и Windows, чтобы не получить рутованный сервер или инъекцию ваших баз данных SQL.

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

Hategrin
источник
2

Я должен сказать, что большая часть кода, написанного на объектно-ориентированных языках, таких как Java, на самом деле не является объектно-ориентированной. Трудно действительно понять идеи, лежащие в основе ОО, в результате чего, предположительно, ОО-код действительно в основном процедурный.

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

Тем не менее, Java скрывает много низкоуровневых деталей о том, что происходит внутри компьютера. C оставляет их гораздо более открытыми. Можно привести хороший пример того, что студенты должны изучить, как работают эти детали низкого уровня, прежде чем использовать язык, который позаботится об этом для них. Но вы также можете заявить, что вам следует игнорировать эти детали и изучить их позже.

Уинстон Эверт
источник
2

Несколько других уже ответили на эту тему, но я думаю, что стоит заявить об этом более подробно.

Даже если вы начнете изучать программирование с объектно-ориентированного языка, такого как Java, вы начнете с изучения методик процедурного программирования, прежде чем приступите к концепции ОО . При обучении нового программиста Java, вы сначала не знакомите их с объектами и классами, вы вводите их в операторы и переменные. К тому времени, когда ученик может многое узнать об объектах и ​​классах, у него уже есть, по крайней мере, основы процедурного программирования.

Поэтому, по крайней мере, вы должны изучать процедурное программирование на Java, а затем изучать объектно-ориентированное программирование на Java. Независимо от того, проводите ли вы целый год в процедурном программировании или просто проводите первые несколько недель курса программирования, и используете ли вы для этого другой язык, вы просто спорите о деталях.

Бен
источник
0

Чтобы быть чрезмерно откровенным, я думаю, что импульс к этому прибывает прежде всего от старых программистов, желающих в старые времена.

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

ООП - это не священный грааль программирования, а процедурное программирование не является реликвией. Хорошо знать хотя бы некоторые из них, но я думаю, что общая практика преподавания процедурного программирования, как правило, является гигантской тратой времени и усилий. Нам нужно учиться программированию в академических кругах, а не только в том или ином стиле. Я связываю с этим довольно много ужасного кода и неправильных представлений, включая мой собственный.

Гарет Клаборн
источник
2
У меня был учитель, использующий C с 89 года, но это был микрочип, ожидающий c 99 года. Затем был другой учитель, использующий «c ++», но без STL или шаблонов. Также могут быть структуры с указателями функций.
Обезьяна
1
Честно говоря, STL и шаблоны в целом не являются вводными темами C ++. Основная цель любого 101-уровневого курса программирования - научить создавать хорошо структурированную последовательную, условную и итеративную логику в рамках ограничений данного синтаксиса. Все остальные языковые функции являются просто синтаксическим сахаром, который позволяет группировать основные структуры управления, а также связывать их с данными.
битник
ай два отрицания. Я видел, что это пришло = P странно для меня, хотя, поскольку мнение изначально пришло от старшего программиста, который помог мне оправиться от плохого обучения. @Ape: Глава нашего отдела CS пытался научить нас COBOL в 2004 году XD (меньше всего меня беспокоит его стиль преподавания, я не против, потому что я могу работать в какой-то точке продаж машины лол но блин ... серьезно?)
Гарет Клаборн
1
@ bit-twiddler - Да, сэр, очень странно. Я не очень полагаюсь на этот опыт в этом мнении, но я посмотрел в других регионах. Я действительно люблю оба стиля программирования, и мне кажется, что они должны учить их вместе. Я просто нахожу, что даже немного младшие профессора не имеют такого же процента фанатизма по этому вопросу. ИМО, это хорошо. Я понимаю, что некоторые считают, что процедурные сначала важны.
Гарет Клаборн
1
@ bit-twiddler: да, но это не был вводный курс. Это был 4-й курс углубленного изучения дизайна баз данных, и мы должны были использовать c ++. Просто он чувствовал себя не так после опыта с ++ до такого высокого уровня с предыдущими курсами.
Обезьяна
0

Две причины для меня: Один OO программирования пришел, чтобы решить проблемы процедурного программирования. Поэтому, написав некоторое процедурное кодирование и затем те же самые вещи в ОО, легче понять разницу.

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

Димитриос Мистриотис
источник
1
«ОО программирование пришло, чтобы решить проблемы процедурного программирования». Это была цель, но ОО создал столько проблем, сколько решал.
немного крутил
@ bit-twiddler: Очень большая история. Сосредоточив внимание (или сужая его) на педагогическом аспекте, он обосновывает: что у нас было, как мы сделали это лучше: что (вы спорите, лучше это или нет)
Димитриос Мистриотис
0

Нет другой причины, кроме институциональной инерции. Посмотрите на CMU, они выбросили всю свою учебную программу ООП и заменили ее функциональным программированием. Итак, еще раз, ответ на ваш вопрос заключается в том, что это произвольный выбор, сделанный администраторами любой школы, которую вы посещаете. В случае, если кто-то интересуется фактическими утверждениями, которые я сделал здесь, это сообщение об изменении учебного плана в CMU одним профессором / администратором: Обучение FP новичкам .

davidk01
источник
1
-1 вводит в заблуждение - хотя я видел поток (через поиск в Google), в котором утверждалось, что CMU исключил ООП из своего первого курса обучения CS и заменил его функциональным программированием, официальный учебный план CMU начинается с языка программирования Alice, который является объектно-ориентированным. ориентированный [см. enr-apps.as.cmu.edu/assets/SOC/CS_SPRING.htm]
Стивен А. Лоу
1
@ davidk01: (1) фактически неверное утверждение в ответе. (2) «Алиса - это свободно доступный учебный инструмент, предназначенный для того, чтобы студент впервые познакомился с объектно-ориентированным программированием » от alice.org
Стивен А. Лоу,
2
@ Стивен А. Лоу: прямо изо рта лошади: «Объектно-ориентированное программирование полностью исключено из вводной учебной программы, потому что оно антимодульное и антипараллельное по самой своей природе и, следовательно, непригодно для современной учебной программы CS. Предлагаемый новый курс по методологии объектно-ориентированного проектирования будет предложен на втором курсе для тех студентов, которые хотят изучать эту тему ». - Обучение FP первокурсникам
davidk01
1
@ davidk01: отличная ссылка, спасибо. Из документа комитета, процитированного в этой статье «Хотя объектно-ориентированное программирование (в его бесчисленных формах) остается доминирующей темой в разработке промышленного программного обеспечения, использование объектно-ориентированных языков, таких как Java, на вводном уровне вносит значительную сложность и отвлекает от основных целей на начальном уровне . Кажется, предпочтительнее дать более полный охват методологии проектирования и реализации ОО, чтобы позже в учебной программе, чтобы позволить более сосредоточенную концентрацию на основах на начальном уровне ". [выделение мое] ...
Стивен А. Лоу
1
@ davidk01: Я счастлив согласиться не согласиться. Если хотите, назовите меня педантичным, но для меня есть существенная разница между изменением акцента начального уровня и «выброской всей учебной программы ООП». Едва ли я назвал бы сокращение объема вводных классов «радикальным изменением» ;-)
Стивен А. Лоу