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

Какая разница между процедурной программой и объектно-ориентированной программой?

Я новичок в программировании, но я читал интересные обсуждения по StackOverflow о различных подходах к программированию. Я все еще не на 100% понимаю, какая разница между процедурным программированием и объектно-ориентированным программированием. Похоже, что объектно-ориентированное программирование по-прежнему использует процедуры (методы), но все организовано иначе, потому что объект является звездой шоу. Но мне кажется, что процедуры все же позволяют вам делать все то же самое. Как и в C, вы можете поместить все свои аналогичные процедуры в библиотеку. Неужели вы не могли сказать, что библиотека в C похожа на объект в С++?

4b9b3361

Ответ 1

Различие между двумя является тонким, но значительным.

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

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

Ответ 2

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

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

Например, скажем, у вас есть номер, и вы хотите удвоить его. Процедурный способ сделать это:

n = n * 2

Код здесь явно умножает n на 2 и сохраняет результат обратно в n.

Способ OO заключается в том, чтобы отправить "сообщение" на объект числа, говорящий ему удвоить себя:

n.double();

Преимущество этого называется полиморфизмом. Что произойдет, когда вы решите, что хотите удвоить строку, например "bob". В процедурный мир вам нужно будет предоставить больше кода для удвоения, но вам также придется вызывать этот код по-разному.

С помощью OO вы создаете строковый объект, который также может принимать сообщение "double". Код для двойной строки относится к строковому объекту, поэтому он знает, что он должен действовать по-разному на числовой объект. Если он решил, что "bob" * 2 "bobbob", код будет выглядеть примерно так:

class number:                    class string:
    int n                           char array s
    procedure double:               procedure double:
        n = n * 2                       s = string_join(s,s)

Тогда вы могли бы вызвать x.double() независимо от того, какой фактический тип x был (число или строка), и он знал бы, какой код запускать - это значительно упрощает ваш код. Вы можете удвоить целое число, строки, матрицы, сложные числа, реалы, размеры окон на вашем мониторе и всевозможные разные вещи.

И вы правы, библиотека C может быть сделана, чтобы выглядеть немного как объекты. Классическим примером является stdio.h - вам все равно, что на самом деле указывает FILE*, только тот факт, что он будет вести себя определенным образом. FILE*, fopen(), fclose() и другие функции - это класс сортов, представляющий возможности ввода-вывода C.

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

IMHO, объектно-ориентированное программирование - это концепция, которая существует на более высоком уровне абстракции, чем процедурное программирование. Эти два не являются взаимоисключающими в том, что отдельные методы в программе OO выглядят почти так же, как отдельные функции в процедурной программе. Это контрастирует, например, с функциональным программированием, которое требует совершенно иного мышления. Кроме того, вы можете писать процедурно на языке OO, делая все статичным и т.д. Вы можете быть человеческим компилятором и эффективно писать OO-код на C, используя множество указателей на функции и кастинг с указателем структуры.

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

Ответ 6

OO - это в основном набор разума. Вы можете запрограммировать OO на C (если вы действительно хотите...), и вы можете отлично иметь процедурный код на С++/Java; я имею в виду, даже если вы используете классы на поверхности, он все равно может быть процедурным.

Идея OO - это абстракция состояния. Вместо "мышления" в терминах "группировки данных" вы "думаете" в терминах "объектов", где объект является "интерфейсом" для "группировки данных и способов управления этими данными".

Все звучит философски, потому что это так.

Здесь можно много сказать, и это не может быть сказано в маленьком сообщении SO, поэтому я оставлю его здесь.

UPDATE
Как упоминалось в ответе Фланагана, языки OO реализуют конструкции, которые используют эту абстракцию.

Я имею в виду, что вы можете технически "взломать" классы и полиморфизм в терминах структур, функций и указателей функций.

Здесь приведен пример OO в C

Ответ 7

Разница заключается в том, что объекты имеют процедуры и связанные с ними данные в одном и том же месте - процедурные языки используют "структуры" (вещи, которые содержат связанные данные вместе), которые сохраняют данные отдельно от процедур. Фактически все, что вы делаете на языке OO, должно быть возможным на процедурном языке с комбинацией структур и процедур.

Основное различие заключается в том, что набор языков OO помещает программистов в.

Ответ 8

[pardon the primer style, это поздно, и я устал]

процедуры обрабатывают данные - данные в, применяют некоторую обработку, получают данные из

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

теперь наша процедура может принимать структуру данных в качестве входных данных и изменять ее и/или создавать другую структуру данных в качестве вывода

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

шаблон для создания объектов называется классом; объект называется экземпляром класса

мы можем заметить, что один класс очень похож на другой, поэтому вместо копирования и вставки кода мы позволяем одному классу наследовать от другого: подкласс наследуется от суперкласса или "базового класса". Таким образом, подкласс имеет доступ ко всем структурам данных и процедурам суперкласса и может определенным образом расширять или переопределять их.

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

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

Удачи вам в учебе!

Ответ 9

Процедура является частью процедурного/функционального/логического (или логически ориентированного) различия (сравните c, lisp и пролога) между различными способами описания того, что должна делать программа.

Ориентация объекта ортогональна этой другой идее и описывает средство группировки подпрограмм с данными. С++ и java - это процедурные языки с объектно-ориентированными функциями; fortran77 - это процедурные языки без объектно-ориентированных функций. Общий lisp поддерживает ориентацию объекта; некоторые старые лисы не делают. Простой валидный пролог не поддерживает объекты, и я не могу назвать логически ориентированный язык, который делает (я не занимаюсь логико-ориентированным программированием, это в моем списке вещей, когда у меня есть достаточно много свободного времени. функциональное программирование).

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


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

Ответ 10

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

Ключевое различие между языком ассемблера и процедурным языком, например C или Pascal, - это введение абстракции "процедуры". Люди, записывающие код сборки, создают процедуры, но его жесткий и подверженный ошибкам, процедурный язык дает вам инструменты, облегчающие его.

Разница между процедурным языком и языком OO, подобным С++, является абстракцией объекта. Люди, которые пишут "c", часто создают концептуальные объекты но его трудные и подверженные ошибкам, язык OO дает вам инструменты, облегчающие его.

Такие вещи, как Sing # от Microsoft (или Erlang), добавляют абстракцию Message/Process в язык. Конечно, вы можете выполнять передачу сообщений и создавать процессы в сборке, C или С++, но Sing # упрощает.

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

Ответ 11

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

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

Ответ 12

Разница заключается в

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

пример: Pascal и C

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

Пример

: С++ и Java

Ответ 13

Это упрощенный ответ.

  • В истинном языке OO единственное процедурное кодирование выполняется внутри объекта.

  • C не имеет объектов, а С++ - язык, поддерживающий объекты. Java, с другой стороны, все является объектом (кроме примитивов). Все напечатано.

  • Линейная прогрессия происходит внутри объектов, но сами объекты представляют собой только коллекции кода и данных.

Ответ 14

Это зависит от того, как вы определяете ООП. С точки зрения Java-подобного ООП, где вы называете методы на объектах, процедурное программирование практически одинаково. Насколько я могу судить, вы можете эмулировать все принципы ООП (инкапсуляция, абстракция, полиморфизм, наследование) на языке процедур, например C. Доказательство этого GObject, в некоторой степени Objective-C и многих других реализаций языка ООП с использованием C, например cPython. Это делается с помощью структур и работы с этими структурами с использованием функций:

typedef struct {
    Object *isa;
    String *name;
    Date *birthday;
} Person;

Person *Person_new();
String *Person_name(Person *self);
void Person_setName(Person *self, String *newName);
// ...

Интерфейс очень похож на ООП. Это не позволяет полиморфизм, но это также возможно. Он очень похож на интерфейс Python, за исключением того, что атрибуты отделены от "методов":

class Person(object):
    def __init__(self):
        self._name = ""
        self._age = datetime.datetime.now()

    @property
    def name(self):
        return self._name

    @property
    def age(self):
        return self._age

Я выбрал Python для примера, потому что "я" явно, как в примере на C. Многие языки ООП, такие как Java, абстрактно это.

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

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

Действительно, библиотека, или, скорее, набор функций, работающих в структуре, такая же, как и объект в С++. На самом деле С++ реализован именно таким образом.

Ответ 15

Много интересных вопросов, уже упомянутых здесь.

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

Процедурное программирование обычно не использует такую ​​связь данных и поведения в "объект". Я видел, как это делалось на C раньше, но это было не очень и слишком много для бизнеса обезьян, чтобы приблизиться к тому, что можно было бы сделать, скажем, на С++.

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

Конечно, вы можете обойти объект, если вы умны, но вам нужно уйти с пути, чтобы сделать это.

Это не полно, но это один из аспектов.

Ответ 16

Способ реализации С++ просто делает программирование OO очень похожим на процедурное программирование. Вам нужно слегка передумать.

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

Ответ 17

Для справедливого примера разницы между процедурным и OO, попробуйте изучить Smalltalk. В Smalltalk все, и я имею в виду, что все является объектом. Нет if-операторов или while-loops. Вы достигаете этой функциональности, отправляя сообщения (на вызовы методов a.k.a.) на другие объекты. Сначала это заставляет вашу голову вращаться, но я думаю, вы быстро поймете, что такое OO.