Что сделало объектно-ориентированное программирование успешным? [закрыто]

17

Что это за особенность, которая, по вашему мнению, сделала объектно-ориентированное программирование настолько успешным?

  1. Передача сообщений
  2. наследование
  3. Полиморфизм
  4. Инкапсуляция

Или какая-то другая функция, которую вы можете представить.

Также я хотел бы знать, какова связь между абстрактным типом данных и объектно-ориентированным программированием?

Тони
источник
популярный и успешный не являются синонимами
Кевин Клайн

Ответы:

76

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

Человеческий мозг может хранить только столько концепций одновременно - часто вспоминается часто упоминаемый предел запоминания 7 +/- 2 независимых предметов.

Когда я работаю на системе 600kloc на работе, я не могу держать все это в голове сразу. Если бы мне пришлось это сделать, я бы ограничился работой на гораздо меньших системах.

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

Все важные концепции ОО предоставляют способы управления сложностью.

Инкапсуляция - позвольте мне разобраться с внешним API, который предоставляет мне различные сервисы, не беспокоясь о том, как эти сервисы реализованы.

Абстракция - позвольте мне сосредоточиться на основных характеристиках и игнорировать то, что не имеет значения.

Композиция - позвольте мне повторно использовать компоненты, которые уже были созданы в новых комбинациях

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

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

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

Лисковская подмена Prinicple - давайте не будем ставить ловушки друг на друга, вводя странные зависимости

Открытый / закрытый принцип - давайте позволим расширение и модификацию способами, которые не требуют от нас риска взлома существующего кода

Внедрение зависимостей - давайте перенесем композицию на следующий уровень и соберем компоненты вместе намного позже.

Разработка, ориентированная на интерфейс - давайте перенесем абстракцию на следующий уровень и будем зависеть только от абстракции, а не от конкретной реализации.

Беван
источник
6
+1. Я могу голосовать только один раз, и это позор, это заслуживает большего.
Ричард
1
В этом есть следствие, жаль, что я не могу сейчас найти ссылку, но я постараюсь вспомнить, чтобы найти ее и отредактировать комментарий. Таким образом, изучение практики проверки кода показало, что проверки кода, как правило, занимают больше времени, чтобы найти ошибки в ОО-коде, чем процедурный код, потому что поток переходит больше в ОО-коде. Такие практики, как TDD и парное программирование, смягчают это, но это все еще интересный (и для меня неожиданный) результат.
5
Это может быть идеальный ответ - информация полная, но достаточно короткая, чтобы читателю не пришлось читать роман. Браво
Тим Класон
@Graham Lee: Мне было бы интересно прочитать это исследование.
Фрэнк Шиарар
13

Графические пользовательские интерфейсы. В конце восьмидесятых, начале девяностых, когда Mac, Amigas, Atari ST, Windows и GEM начали заменять символьные пользовательские интерфейсы, стало очевидно, что такие языки, как C, плохо подходят для написания программ с графическим интерфейсом. В то время как традиционная обработка данных рассматривается как схема «входные данные -> обработка -> выходные данные», которая также может выполняться на процедурном языке, функции ОО просто пригодились для обработки внутренней сложности графического интерфейса пользователя.

user281377
источник
1
+1 за упоминание приложений с графическим интерфейсом. Объектная ориентация была инструментом, позволяющим реализовывать GUI, которые в противном случае (с процедурным кодом) были довольно сложны в управлении.
Джорджио
7

Сокрытие данных, предоставляемое Encapsulation.


источник
Это ответ? ADT обеспечивают скрытие данных (именно поэтому их называют «абстракциями данных»)
Фрэнк Шиарар,
@Frank, он спросил о конкретных функциях, и когда я написал этот ответ, был только один, и я старался не дублировать.
Справедливо, но инкапсуляция не совсем специфична для ОО. Я должен проверить это сам, но я уверен, что мы делали инкапсуляцию задолго до ОО.
Фрэнк Шиарар
1
@ Фрэнк, я согласен, что это не специфично для ОО, это лишь одна из его основных функций.
Это верно для большинства OOPL, но не для всех. CLOS является заметным исключением.
Фрэнк Шиарар
7

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


источник
6

Я думаю, что наследование является наиболее важным моментом ООП.

[из разработки игры] Вы можете создать что-то вроде класса Drawable с методами и атрибутами рендеринга, а также создать класс Spaceship и Planet, который наследуется от Drawable. Возьмите все объекты из этих [и других дочерних элементов Sprite], добавьте drawableObjArray и просто вызовите метод draw для каждого объекта. Вам просто нужно знать, что это Drawable.

JulioC
источник
2
В самом деле?? Полиморфизм является ПУТИ более важным и не требует наследования (с теоретической точки зрения).
Томас Эдинг
Даже не требует виртуальных функций, просто используйте указатели на функции.
Кальмарий
1
Первоначальная концепция ОО Алана Кея даже не включала наследование, потому что ему не нравилось, как оно было реализовано в предыдущих системах.
Майкл Боргвардт
3

абстракция

Предоставление необходимых услуг, сокрытие ненужных вещей. Смотрите мое объяснение здесь. Что такое абстракция?

Gulshan
источник
Опечатка: «Абстракция» должна стать «Абстракцией»
Ветле
2

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

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

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

" ADT vs objects " был задан здесь несколько раз. Ответ в одной строке: «АТД и объекты противоположны друг другу - то, что один абстрагирует аккуратно, другой не может; каждый допускает гибкость по-разному».

Для более длинного ответа, см. Уильяма Кука О понимании абстракции данных» . Вкратце, объекты позволяют вам легко использовать несколько реализаций / представлений некоторого элемента данных (что-то, что выглядит как список, может быть массивом, или самобалансирующимся деревом, или ...), но затрудняет добавление новых операций (потому что вы необходимо добавить эту новую операцию в каждое из ваших представлений), в то время как ADT упрощают добавление новых операций для вашего типа данных, но затрудняют использование нескольких реализаций.

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

Фрэнк Шиарар
источник
1
Передача сообщений вряд ли может быть ответом, поскольку ни один из успешных языков ООП не использует его.
Джонас
Ваш OO не обязательно мой OO. И большинство языков, которые называются ОО, по определению Алана Кея, не являются. Я забыл точную цитату, но Кей сказал, что объекты были не тем, что было важно в Smalltalk, а передачей сообщений (и это больше всего упускало из виду).
Фрэнк Шиарар
@Jonas Думаю, после перечитывания вопроса и моего ответа, я наполовину говорю: «ОО не удалась, поскольку так мало языков делают это правильно». Но я говорю такие вещи только тогда, когда на мне свой огнеупорный костюм.
Фрэнк Шиарар
0

Мои лучшие три функции. Композиция объектов - позволяет объектам сотрудничать. Полиморфизм - поддерживает динамическое поведение во время выполнения. Наследование - путем повторного использования кода и изменения поведения с помощью переопределения методов.

ADT - это может быть даже в не объектно-ориентированных языках, таких как Pascal. Стек или очередь являются примерами ADT.

StartClass0830
источник
«ADT - это может быть даже в не объектно-ориентированных языках, таких как Pascal. Стек или очередь являются примерами ADT.»: True. Но ООП облегчает определение интерфейса ADT и обеспечивает другую взаимозаменяемую реализацию (подклассы интерфейса / абстрактного класса <---> / конкретные классы). Насколько я знаю, это не так просто в Паскале.
Джорджио
0

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

как ваш вопрос о 4 особенностях ООП, так что вы можете сказать,

  1. Наследование и 4. Инкапсуляция являются наиболее важными функциями, а две другие очень необходимы для достижения первых двух

Итак 1. Передача сообщений и 3. Полиморфизм на самом деле поддерживают 2. Наследование и 4. Инкапсуляция.

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

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

2. Inheritance
3. Polymorphism
4. Encapsulation

Изменить: Еще один момент - это среды разработки IDE и графического интерфейса, такие как Visual studio и Eclipse. Поскольку они охватывают языки ООП, все больше и больше проектов стремятся к ООП.

И, конечно, принципы SOLID - единственные, которые делают программные продукты ROCK надежными и доступными :)

Юсубы
источник