Смущенный.Является ли объектно-ориентированный подход по своей сути императивным или он мультипарадигмальный?

StackOverflow https://stackoverflow.com/questions/553536

  •  23-08-2019
  •  | 
  •  

Вопрос

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

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

Если да, то почему при этом исключается другая парадигма более низкого уровня для работы на такой платформе?

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

Или я вообще что-то упускаю?

Это было полезно?

Решение

Нет.ОО и императив — два ортогональных понятия.

Например:

  • Объектная система Common Lisp является примером объектно-ориентированной системы Lisp и, возможно, самой сложной объектной системой.
  • OCaml — это функциональный язык с объектной системой и системой модулей, поддерживающей объектно-ориентированную организацию.
  • Scala — функциональный язык с очень гибкой объектно-ориентированной системой.
  • Haskell позволяет писать объектно-ориентированный код, используя полиморфизм высшего рода.

Существует множество различных способов объектно-ориентированного подхода.

Другие советы

Большинство объектно-ориентированных языков являются обязательными, но вы может используйте их в несколько функциональном стиле.Некоторые функциональные языки основаны на объектно-ориентированной структуре (наиболее очевидным примером является F# на .NET), жертвуя некоторой «чистотой», чтобы получить массивную структуру, которую можно использовать там, где это необходимо.

Я думаю, что есть много достаточно места для «в основном объектно-ориентированных» языков, чтобы сделать больше для программирования в функциональном стиле - лучшая поддержка неизменяемости является наиболее очевидной особенностью, за которой, возможно, следует лучший вывод типов.(По крайней мере, если говорить о C#, который, вероятно, является наиболее ярким примером того, как традиционный язык пытается вступить в функциональную дверь.)

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

Состояние, действие и последовательность являются понятиями процедурного программирования и не присутствуют в немонадическом функциональном программировании (монады используются для реализации состояния, действия и последовательности в чисто функциональных языках Haskell, которые в противном случае не имели бы этих понятий).

Если посмотреть на это с другой точки зрения, большинству людей нравится мыслить императивно (а не рекурсиями или RPN).Из этого следует, что большинство языков будут императивными.

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

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

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

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

Примером декларативного языка может быть Пролог, примером императивного языка может быть Фортран (и Настоящий программист может писать программы FORTRAN на любом языке.).

В качестве примера кода, который одновременно является императивным и декларативным, рассмотрим следующую реализацию последовательности Фибоначи в Perl6:

my @fibonacci-sequence := 0, 1, * + * ... *;

Это явно декларативное описание последовательности.Однако, как * и ... являются допустимыми операторами Perl6 — «whatever-star» можно использовать для создания лямбда-выражений, оператор «sequence» — для создания ленивых списков — это также императивный оператор, вызывающий внутренний код времени выполнения.

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

А функциональная парадигма по своей сути является декларативным, поскольку моделирует вычисления как отношения между множествами.

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

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

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

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

Основы объектной ориентации:

  1. объекты сохраняют состояние (т.е. ссылки на другие объекты)
  2. объекты получают (и обрабатывают) сообщения
  3. обработка сообщения может привести к
    • сообщения, отправляемые самому объекту или другим объектам
    • изменение состояния объекта

Это означает, что оо-программирование требует изменяемого состояния. удерживается объектом(!).Если вы моделируете изменение состояния, создавая серию объектов, вы нарушаете эти инварианты, вот и все.

Огненная приманка: Если вы не согласны с этим определением объектной ориентации, обсудите его с Аланом Кеем.

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

Я бы охарактеризовал суть ООП использованием Объекты с поведением.

Википедия характеризует Объекты следующими тремя свойствами:

  1. Личность:свойство объекта, отличающее его от других объектов
  2. Состояние:описывает данные, хранящиеся в объекте
  3. Поведение:описывает методы в интерфейсе объекта, с помощью которых объект можно использовать.

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

Функциональные языки также могут использовать классы (например.Классы типов в Haskell).Но то, что у них есть классы, не означает, что они объектно-ориентированы или допускают объектно-ориентированное программирование.Чтобы остановиться на примере Haskell:У вас даже нет объектов!Нет такого понятия как «Идентичность»!Все, что вы можете сделать, это составить чистые функции!

Тот факт, что кто-то использует термин «классы», не означает, что он занимается объектно-ориентированным программированием!

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

Так Да, императивное программирование присуще ООП.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top