Подтвердить что ты не робот

Теория объектно-ориентированного программирования

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

4b9b3361

Ответ 1

Ориентация объекта происходит от психологии, а не от математики.

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

Возьмите Жана Пиаже (1896-1980), который работал над теорией познавательного развития детей. Wikipedia говорит:

Пиаже также оказал значительное влияние в области информатики и искусственного интеллекта.

Некоторые когнитивные концепции, которые он обнаружил (что подразумевает концепцию Ориентации объекта):

Классификация Возможность группировать объекты вместе на основе общих функций.

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

Подробнее: Теория развития Пиаже http://www.learningandteaching.info/learning/piaget.htm#ixzz1CipJeXyZ

Ответ 2

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

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

  • Динамическая отправка - когда метод вызывается на объект, сам объект определяет, какой код выполняется, просматривая метод во время выполнения в таблице, связанной с объектом. Эта функция отличает объект от абстрактного типа данных (или модуля), который имеет фиксированную (статическую) реализацию операций для всех экземпляров. Это методология программирования, которая обеспечивает модульную разработку компонентов и в то же время очень эффективную.
  • Инкапсуляция (или несколько методов, в этом случае состояние сохраняется отдельно)
  • Политип подтипа
  • наследование объектов (или делегирование)
  • Открытая рекурсия - специальная переменная (синтаксически это может быть ключевое слово), обычно называемая this или self, которая позволяет телу метода вызывать тело другого объекта того же объекта. Эта переменная связана с поздней задержкой; он позволяет методу, определенному в одном классе, вызывать другой метод, который определен позже, в некотором подклассе.

Ответ 3

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

Ответ 4

Абади и Карделли написали "Теория объектов" , вы можете посмотреть на это. Другое изложение дано почтенным TAPL (IIRC, они приближаются к объектам как рекурсивные записи в типизированном лямбда-исчислении). Я действительно мало знаю об этом.

Ответ 5

Я проверил бы страницу wikipedia на OO http://en.wikipedia.org/wiki/Object-oriented_programming Он получил принципы и основы и историю.

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

Изменить: что еще более интересно, что люди все еще спорят о том, "что делает OO язык OO". Я не уверен, что набор функций даже в целом согласован, что определяет язык OO.

Ответ 6

История (упрощенная) идет следующим образом:

Сначала появился код спагетти. Затем появился процедурный код (Like C и Pascal). Затем появился модульный код (как в модуле). Затем появился объектно-ориентированный код (как в smalltalk).

Что такое пудра объектно-ориентированного программирования?

Вы можете только понять, помните ли вы историю.

Сначала код был просто последовательностью инструкций, данных компьютеру (буквально в двоичном представлении) Затем появились макросборщики. С мемономикой для инструкций. Затем люди обнаружили, что иногда у вас есть код, который повторяется. Поэтому они создали GOTO. Но GOTO (или ветка или прыжок и т.д.) Не может вернуться обратно туда, где он был вызван, и не может давать прямые возвращаемые значения, а также не может принимать формальные параметры (вам приходилось использовать глобальные переменные). Против первой проблемы люди создали подпрограммы (GOSUB-подобные). Группы инструкций, которые можно было бы вызывать повторно и возвращаться туда, где они были вызваны. Затем люди обнаружили, что процедуры будут более полезными, если бы они имели параметры и могли возвращать значения. Для этого они создали функции, процедуры и соглашения о вызовах. Те абстракции, которые называются сверху абстракции, называются стеком. Стек позволяет формальные параметры, возвращаемые значения и что-то называемое рекурсией (прямое или косвенное). С стеком и возможностью для функции, называемой арбитражно (даже косвенно), пришло процедурное программирование, решающее проблему GOTO. Но затем появились крупные проекты и необходимость группировать процедуры в логические объекты (модули).

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

Когда у вас есть модуль, у вас есть локальные переменные модуля.

Подумайте об этом:

Module MyScreenModule;

Var X, Y : Integer;

Procedure SetX(value : Integer);
Procedure SetY(value : Integer);

End Module.

Существуют переменные X и Y, которые являются локальными для этого модуля. В этом примере X и Y удерживают позицию курсора. Но давайте предположим, что ваш компьютер имеет более одного экрана. Итак, что мы можем сделать сейчас? Только X и Y arent способны удерживать значения X и Y всех экранов, которые у вас есть. Вам нужен способ УСТАНОВИТЬ эту информацию. То, где переход от модульного программирования переходит на объектно-ориентированное программирование.

На языке, не ориентированном на объекты, вы обычно делаете:

Var Screens :  Array of Record X, Y : Integer End;

И затем передайте значение индекса каждому вызову модуля:

Procedure SetX(ScreenID : Integer; X : Integer);
Procedure SetY(ScreenID : Integer; Y : Integer);

Здесь screenid ссылается на несколько экранов, о которых вы говорите.

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

Class MyScreenModule;

Field X, Y : Integer;

Procedure SetX(value : Integer);
Procedure SetY(value : Integer);

End Class.

Это почти то же самое, что и модуль! Теперь вы создаете экземпляр, предоставляя неявный указатель на экземпляр, например:

ScreenNumber1 := New MyScreenModule;

И затем перейдите к использованию:

ScreenNumber1::SetX(100);

Вы эффективно превратили модульное программирование в многоэкземплярное программирование, где переменная, содержащая сам указатель модуля, различает каждый экземпляр. Gotcha?

Его эволюция абстракции.

Итак, теперь у вас есть несколько экземпляров, какой следующий уровень?

полиморфизм. И т.д. Остальные - довольно стандартные объектно-ориентированные уроки.

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

Ответ 7

ИМО хороший пример того, что делает успешный язык OO, можно найти, сравнив сходство между JAVA и С#. Оба они очень популярны и очень похожи. Хотя я думаю, что общую идею минимального языка OO можно найти, посмотрев на Simula67. Я считаю, что общая идея объектно-ориентированного программирования заключается в том, что он кажется, что компьютер больше похож на человека, это поддерживается такими вещами, как наследование (как "горный велосипед", так и "дорожный велосипед" принадлежат к классу "велосипед" ", и имеют те же основные функции). Еще одна важная идея состоит в том, что объекты (которые могут быть исполняемыми строками кода) могут передаваться как переменные, что позволяет программе редактировать себя на основе определенных критериев (хотя этот момент весьма спорный, я цитирую способность изменять каждый экземпляр объект, основанный на одном сравнении). Еще один момент - модульность. Поскольку целые программы могут эффективно передаваться как переменная (поскольку все рассматривается как объект), становится проще изменять большие программы, просто изменяя вызываемый класс или метод и никогда не изменять основной метод. Из-за этого расширение функциональности программы может стать намного проще. Вот почему веб-предприятия любят такие языки, как С# и JAVA (которые являются полноценными OO). Такие игровые компании, как С++, потому что это дает им контроль над императивным языком (например, C) и некоторыми объектами ориентации объекта (например, С# или JAVA).

Ответ 8

В 2000 году в моей диссертации я предложил эту модель; очень скоро:

y + 1 = f(u, x)
x + 1 = g(u, x)

где:

  • u: ввод
  • y: output
  • x: состояние
  • f: функция вывода
  • g: функция состояния

Формально он очень похож на машину конечного состояния, но разница в том, что U, Y, S заданы не конечными, а бесконечными (числовыми) и f и g Touring Machine (TM).

f и g togheter образуют класс; если добавить начальное состояние x0, мы имеем объект. Таким образом, ООП в чем-то более чем ТМ TM представляет собой конкретный случай ООП. Обратите внимание, что состояние x отличается от состояния "внутри" TM. Внутри TM нет побочного эффекта, состояние x для побочного эффекта.

Ответ 9

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

Я нашел это, например: