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


11

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

Любые идеи ??


2
Задав этот вопрос на сайте programmers.stackexchange.com, вы получите больше ответов.
Реджи

2
Какова ваша аудитория? Опытные не OO программисты (кобол и т. Д.)? малоопытные программисты (студенты и т. д.)? Руководители (вообще не программисты)?

Я не слышал об этом раньше, но я прочитал FAQ, и я думаю, что лучше спросить там.
Ахмед

малоопытный.
Ахмед

4
Я хотел бы, чтобы некоторые ОО программы были структурированы лучше.
Скотт Уитлок

Ответы:


17

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

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

  • ОО-программирование - это дисциплина, налагаемая на указатели на функции (косвенная передача контроля)

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

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

Это немного сложнее понять ОО. Мы часто определяем ОО как инкапсуляцию, наследование и полиморфизм. Что менее известно, так это то, что все три из этих атрибутов достижимы и часто были достигнуты в C. Действительно, C ++ начинался как просто препроцессор, компилируемый до C. На самом деле нетрудно инкапсулировать в C. И не сложно построить структуры данных, которые являются подмножествами друг друга, имитируя наследование. Полиморфизм, однако, немного сложнее. Требуются указатели на функции, которыми в Си трудно хорошо управлять. Языки, подобные C ++, дали нам дисциплину, навязанную этим указателям на функции. Компилятор C ++ создал для нас vtables и инициализировал указатели внутри них в соответствии со строгим формализмом. Так что в реальном смысле ОО это просто дисциплинакосвенная передача управления, т.е. указатели на функции.

Структурированное программирование о том, как не использовать goto. ОО о том, как не использовать указатели на функции. И функциональное программирование тоже все о том, чего не делать. В функциональном программировании мы не присваиваем переменные, кроме как в самых строго контролируемых случаях.

Таким образом, в конце концов, все эти «технологии» в программировании на самом деле ограничивают дисциплины, а не создают технологии. Они говорят нам , что не делать больше , чем они говорят нам , что для делать. А это значит, что разработка программного обеспечения не росла за последние 40 лет. Скорее это сократилось. Это становится еще более ограниченным, поскольку мы узнали все, что не должны делать.

Учиться тому, чего не следует делать - это хорошо; но вот мешая вопрос: Какие новые вещи мы узнали , чтобы сделать?


@Ahmed: +1 для «TL; DR, спасибо за видео» - подозрительный комментарий (шучу)
n611x007

ссылка гниль ... мертвая ссылка
slashdottir

7

Есть 3 основных способа программирования компьютера:

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

На мой взгляд, объектно-ориентированное программирование - это нечто иное. Речь идет о том, как организовать вашу программу в большем масштабе. Он не заменяет и не устаревает ни одной из 3 парадигм, которые я упомянул выше - в теле метода вам все равно нужно выбрать одну из 3 парадигм из списка для записи.


Я вас плохо понимаю! Вы имеете в виду, что мы должны использовать одну из 3 парадигм, но МЫ не знаем ... а ООП - это просто организация?
Ахмед

Вы не можете программировать без изучения структурированного императивного программирования или структурированного функционального программирования. Эти две парадигмы о достижении цели. ООП, с другой стороны, касается модульности программ, которая вступает в игру только после того, как ваша программа достигает определенного размера. Хотя он определенно появляется в библиотеках, которые вы используете при программировании все время, можно иметь совершенно хорошую библиотеку классов без таких функций OO, как наследование, например библиотеки классов Haskell, LISP или Standard ML.
Кен Блум

4

Это все о том, как вы ожидаете перемен.

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

Можно сказать, что ООП наследует все функциональные возможности структурного программирования с дополнительными функциональными возможностями наследования! :-D


Я не очень люблю наследство в данный момент.

4
Я тоже, но это потому, что правительство выгнало моего деда из его пенсии. Однако с точки зрения ООП наследование послужило мне довольно хорошо!
corsiKa

По моему опыту, лучше всего избегать наследования в ООП. Как часто вы на самом деле строите суперкласс, а не интерфейс? Пользуйся композицией как правило.
Янв

1
@Janx: «Как часто вы на самом деле строите суперкласс, а не интерфейс?» А? Вы не «строите суперклассы»; вы берете существующие классы и строите из них подклассы, и делаете это постоянно. Если вы не используете наследование, вы не получаете преимуществ от замещения и полиморфизма Лискова, так что вы делаете в первую очередь в объектно-ориентированном программировании? Композиция - это другой инструмент с другим вариантом использования, а не замена наследования. Вы не должны «отдавать предпочтение» одному другому; Вы должны использовать оба, каждый для того, для чего они полезны.
Мейсон Уилер

1
@ Мейсон - стоит отметить, что Барбара Лискова (из принципа подстановки Лискова) на самом деле сказала (длинное видео), что она не особенно любит наследование.
Эйдан Калли

2

Понятия ортогональны. Структурированное программирование - это структурирование кода внутри процедур / функций / методов. Совершенно возможно (и желательно) следовать принципам структурированного программирования в методах класса при выполнении ООП.


1

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

Разговор о сокрытии информации и модульности - это хороший способ мотивировать ООП как стиль.

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


0

ООП легче понять, когда вы делаете бизнес-модель. Когда вы думаете об элементах приложения, вы используете некоторые ОБЪЕКТЫ и ОТНОШЕНИЯ между ними, например, Книга имеет Автор (ы), Название, ISBN. Книга для сдачи в библиотеку и может быть заимствована студентом. Структурное программирование заставляет думать о конкретных процессах, реализациях не в абстракции.

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


0

Переменная Область:

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

  • Глобальная сфера
  • Местный / Функция / Область применения метода

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

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

Это одна из замечательных особенностей ООП.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.