Каково различие между процедурной программой и объектно-ориентированной программой? [закрытый]

Пробовали ли вы использовать слайсы в стиле Unix (/ вместо \)?

\ часто являются символом escape или командной строки и могут быть источником путаницы. У меня никогда не было проблем с этим, но у меня также нет Windows, поэтому я не могу его протестировать.

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

29
задан 10 February 2009 в 07:40
поделиться

15 ответов

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

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

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

13
ответ дан Serx 11 October 2019 в 14:30
поделиться

Для справедливо in-your-face пример различия между процедурным и OO, попытайтесь изучить Smalltalk. В Smalltalk, всем, и я подразумеваю, что все - объект. Нет никаких операторов "if" или циклов с условием продолжения. Вы достигаете той функциональности путем отправки сообщений в (иначе вызов методов на) другие объекты. Это действительно заставляет Вашу голову кружиться сначала, но я думаю, что Вы будете быстро grok, что OO, как предполагается.

0
ответ дан moffdub 11 October 2019 в 14:30
поделиться

Путем C++ реализован, просто заставляет программирование OO много походить на процедурное программирование. Необходимо сместить взгляды немного.

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

0
ответ дан Martin York 11 October 2019 в 14:30
поделиться

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

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

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

  • Линейная прогрессия происходит в объектах, но сами объекты являются просто наборами кода и данных.
1
ответ дан WolfmanDragon 11 October 2019 в 14:30
поделиться

Это зависит, как Вы определяете ООП. С точки зрения подобного 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, и т.д., обеспечивают синтаксический сахар для легкого управления объектами, и это - основное различие между "процедурными языками" и "объектно-ориентированными языками".

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

1
ответ дан sebnow 11 October 2019 в 14:30
поделиться

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

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

10
ответ дан dsimcha 11 October 2019 в 14:30
поделиться

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

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

Различие между процедурным языком и ОО-языком, таким как C ++, является абстракцией «объекта». Люди, которые пишут «c», часто создают концептуальные объекты , но это сложный и подверженный ошибкам , язык OO дает вам инструменты, чтобы упростить его.

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

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

2
ответ дан Community 11 October 2019 в 14:30
поделиться

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

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

6
ответ дан vanja. 11 October 2019 в 14:30
поделиться

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

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

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

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

ОБНОВЛЕНИЕ
Как уже упоминалось в ответа Фланагана , ОО-языки реализуют конструкции, использующие эту абстракцию.

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

Вот пример OO в C

8
ответ дан Community 11 October 2019 в 14:30
поделиться

[простите за стиль учебника, уже поздно и я устала]

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

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

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

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

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

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

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

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

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

6
ответ дан Steven A. Lowe 11 October 2019 в 14:30
поделиться

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

21
ответ дан Aram Verstegen 11 October 2019 в 14:30
поделиться

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

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

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

n = n * 2

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

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

n.double();

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

С OO, Вы создаете строковый объект, который может также взять 'двойное' сообщение. Код для удвоения строки принадлежит строковому объекту, таким образом, это знает, что должно действовать по-другому к объекту числа. Если бы это решило, что "боб" * 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.

35
ответ дан paxdiablo 11 October 2019 в 14:30
поделиться

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

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

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

<час>

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

4
ответ дан dmckee 11 October 2019 в 14:30
поделиться

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

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

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

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

Предоставленный, можно обойти объект, если Вы умны, но необходимо стараться изо всех сил делать это.

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

0
ответ дан itsmatt 11 October 2019 в 14:30
поделиться

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

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

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

15
ответ дан Uri 11 October 2019 в 14:30
поделиться