Что это за особенность, которая, по вашему мнению, сделала объектно-ориентированное программирование настолько успешным?
- Передача сообщений
- наследование
- Полиморфизм
- Инкапсуляция
Или какая-то другая функция, которую вы можете представить.
Также я хотел бы знать, какова связь между абстрактным типом данных и объектно-ориентированным программированием?
object-oriented
Тони
источник
источник
Ответы:
Я бы предположил, что наиболее важной характеристикой объектно-ориентированного программирования является управление сложностью .
Человеческий мозг может хранить только столько концепций одновременно - часто вспоминается часто упоминаемый предел запоминания 7 +/- 2 независимых предметов.
Когда я работаю на системе 600kloc на работе, я не могу держать все это в голове сразу. Если бы мне пришлось это сделать, я бы ограничился работой на гораздо меньших системах.
К счастью, мне не нужно. Различные шаблоны проектирования и другие структуры, которые мы использовали в этом проекте, означают, что мне не нужно иметь дело со всей системой сразу - я могу подбирать отдельные части и работать над ними, зная, что они вписываются в более широкое приложение в четко определенных направлениях.
Все важные концепции ОО предоставляют способы управления сложностью.
Инкапсуляция - позвольте мне разобраться с внешним API, который предоставляет мне различные сервисы, не беспокоясь о том, как эти сервисы реализованы.
Абстракция - позвольте мне сосредоточиться на основных характеристиках и игнорировать то, что не имеет значения.
Композиция - позвольте мне повторно использовать компоненты, которые уже были созданы в новых комбинациях
Полиморфизм - позвольте мне попросить об услуге, не беспокоясь о том, как разные объекты могут предоставлять ее по-разному.
Наследование - позвольте мне повторно использовать интерфейс или реализацию, предоставляя только те части, которые отличаются от того, что было раньше.
Принцип единой ответственности - позволяет четко и кратко описать назначение каждого объекта, чтобы можно было легко
Лисковская подмена Prinicple - давайте не будем ставить ловушки друг на друга, вводя странные зависимости
Открытый / закрытый принцип - давайте позволим расширение и модификацию способами, которые не требуют от нас риска взлома существующего кода
Внедрение зависимостей - давайте перенесем композицию на следующий уровень и соберем компоненты вместе намного позже.
Разработка, ориентированная на интерфейс - давайте перенесем абстракцию на следующий уровень и будем зависеть только от абстракции, а не от конкретной реализации.
источник
Графические пользовательские интерфейсы. В конце восьмидесятых, начале девяностых, когда Mac, Amigas, Atari ST, Windows и GEM начали заменять символьные пользовательские интерфейсы, стало очевидно, что такие языки, как C, плохо подходят для написания программ с графическим интерфейсом. В то время как традиционная обработка данных рассматривается как схема «входные данные -> обработка -> выходные данные», которая также может выполняться на процедурном языке, функции ОО просто пригодились для обработки внутренней сложности графического интерфейса пользователя.
источник
Сокрытие данных, предоставляемое Encapsulation.
источник
Функция, которая еще не была упомянута ни в одном другом ответе: моделирование домена . Поскольку люди склонны думать о том, чтобы что-то делать с объектами или с ними, а также об объектах, имеющих внутренние свойства, очень легко смоделировать проблему или рабочий процесс с помощью объектно-ориентированного программного обеспечения. По сути, это позволяет нам использовать нашу существующую способность иметь дело с существительными, глаголами и прилагательными в коде.
источник
Я думаю, что наследование является наиболее важным моментом ООП.
[из разработки игры] Вы можете создать что-то вроде класса Drawable с методами и атрибутами рендеринга, а также создать класс Spaceship и Planet, который наследуется от Drawable. Возьмите все объекты из этих [и других дочерних элементов Sprite], добавьте drawableObjArray и просто вызовите метод draw для каждого объекта. Вам просто нужно знать, что это Drawable.
источник
абстракция
Предоставление необходимых услуг, сокрытие ненужных вещей. Смотрите мое объяснение здесь. Что такое абстракция?
источник
Он несколько успешен, потому что поощряет использование человеческим разумом организации вещей в объекты. Люди обычно хорошо видят отношения вещей - такие как различия, сходства и поведение. ОО поощряет разработку программного обеспечения, чтобы подражать человеческому осмыслению мира.
Совпадение разработки программного обеспечения с тем, как мы видим мир, облегчает нашим умам справляться со сложностью.
источник
" ADT vs objects " был задан здесь несколько раз. Ответ в одной строке: «АТД и объекты противоположны друг другу - то, что один абстрагирует аккуратно, другой не может; каждый допускает гибкость по-разному».
Для более длинного ответа, см. Уильяма Кука О понимании абстракции данных» . Вкратце, объекты позволяют вам легко использовать несколько реализаций / представлений некоторого элемента данных (что-то, что выглядит как список, может быть массивом, или самобалансирующимся деревом, или ...), но затрудняет добавление новых операций (потому что вы необходимо добавить эту новую операцию в каждое из ваших представлений), в то время как ADT упрощают добавление новых операций для вашего типа данных, но затрудняют использование нескольких реализаций.
Edit: я сказал, что передача сообщений была то, что сделало OO успешным. Судя по комментариям Джонаса, это неправильно, потому что большинство языков, которые люди считают ОО, не используют передачу сообщений. Поскольку это не правильно, я выбрал это из своего ответа.
источник
Мои лучшие три функции. Композиция объектов - позволяет объектам сотрудничать. Полиморфизм - поддерживает динамическое поведение во время выполнения. Наследование - путем повторного использования кода и изменения поведения с помощью переопределения методов.
ADT - это может быть даже в не объектно-ориентированных языках, таких как Pascal. Стек или очередь являются примерами ADT.
источник
Проще говоря, ООП является ключом для повторного использования и инкапсуляции, что приводит к созданию больших сред, облегчающих жизнь программистам в эту эпоху, поскольку они могут просто вызывать API и выполнять то, что хотят чаще всего.
как ваш вопрос о 4 особенностях ООП, так что вы можете сказать,
Итак 1. Передача сообщений и 3. Полиморфизм на самом деле поддерживают 2. Наследование и 4. Инкапсуляция.
источник
На мой взгляд, последние три функции являются наиболее важными, когда это повлияло на широкое распространение ООП:
Изменить: Еще один момент - это среды разработки IDE и графического интерфейса, такие как Visual studio и Eclipse. Поскольку они охватывают языки ООП, все больше и больше проектов стремятся к ООП.
И, конечно, принципы SOLID - единственные, которые делают программные продукты ROCK надежными и доступными :)
источник