Пробовали ли вы использовать слайсы в стиле Unix (/ вместо \)?
\ часто являются символом escape или командной строки и могут быть источником путаницы. У меня никогда не было проблем с этим, но у меня также нет Windows, поэтому я не могу его протестировать.
Кроме того, разрешения могут быть основаны на пользователе, выполняющем psql, или, возможно, на пользователя, выполняющего службу postmaster , убедитесь, что оба файла были прочитаны в этом каталоге.
Различие между этими двумя является тонким, но значительным.
В процедурной программе, модули взаимодействуют путем чтения и записи состояния, которое хранится в структурах совместно используемых данных.
В объектно-ориентированной программе, модули в форме объектов взаимодействуют путем отправки сообщений в другие объекты.
Для справедливо in-your-face пример различия между процедурным и OO, попытайтесь изучить Smalltalk. В Smalltalk, всем, и я подразумеваю, что все - объект. Нет никаких операторов "if" или циклов с условием продолжения. Вы достигаете той функциональности путем отправки сообщений в (иначе вызов методов на) другие объекты. Это действительно заставляет Вашу голову кружиться сначала, но я думаю, что Вы будете быстро grok, что OO, как предполагается.
Путем C++ реализован, просто заставляет программирование OO много походить на процедурное программирование. Необходимо сместить взгляды немного.
В объектах C++ имеют методы, которые являются просто процедурами, которые действуют на объект. Но в реальном парадиаметре OO необходимо думать о методах как о потенциальных сообщениях, что объект может получить (т.е. буквы). Объект получает сообщение (параметры представляют полезную нагрузку сообщения т.е. содержание буквы), и изменяет ее состояние на основе сообщения.
Это - упрощенный ответ.
На истинном языке OO, единственное процедурное кодирование сделано в объекте.
C не имеет никаких объектов, и C++ является языком, который поддерживает объекты. Java, с другой стороны, все - объект (кроме примитивов). Все вводится.
Это зависит, как Вы определяете ООП. С точки зрения подобного 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++ реализован просто тем способом.
По моему скромному мнению, объектно-ориентированное программирование является понятием, которое существует в более высоком уровне абстракции, чем процедурное программирование. Эти два не являются взаимоисключающими в этом, отдельные методы в программе OO смотрят в значительной степени то же как отдельные функции в процедурной программе. Это контрастирует с, например, функциональное программирование, которое требует совершенно другого мышления. Кроме того, можно записать процедурно на языке OO путем создания всего статичным и т.д. Можно быть человеческим компилятором и написать эффективно код OO в C при помощи большого количества указателей функции и кастинга указателя структуры.
OO, затем, является большим количеством принципов проектирования и мировоззрения, чем что-то w/строгое определение. Это требует, чтобы наследование, полиморфизм, и т.д. использовалось в качестве главных шаблонов в структурировании Вашего кода, и что синтаксис, который будет обеспечен для создания их выразимыми, не обращаясь к приемам низкого уровня. Это требует, чтобы Вы думали о коде, который действует на состояние набора данных, как являющихся свойством данных, не процедурой, которая существует отдельно. Это не черно и бело. Ваш код может быть "больше" или "меньше" OO в зависимости от того, как в большой степени Вы полагаетесь на наследование, полиморфизм, классы и "методы как свойство данных" мировоззрение как средство структурирования и объяснения/понимания Вашего кода.
Его легче понять в контексте, посмотрите на другие абстракции, введенные между языками.
Ключевое отличие между ассемблером и процедурным языком, таким как C или Pascal, заключается во введении абстракции «процедуры». Люди, пишущие ассемблерный код, создают процедуры, но его сложный и подверженный ошибкам процедурный язык дает вам инструменты, которые облегчают его.
Различие между процедурным языком и ОО-языком, таким как C ++, является абстракцией «объекта». Люди, которые пишут «c», часто создают концептуальные объекты , но это сложный и подверженный ошибкам , язык OO дает вам инструменты, чтобы упростить его.
Такие вещи, как Sing # от Microsoft (или Erlang) добавляют абстракцию Message / Process в язык. Конечно, вы можете передавать сообщения и создавать процессы в ассемблере, C или C ++, но Sing # делает это проще.
Все сводится к одному и тому же машинному коду, эти абстракции предназначены исключительно для блага нашего мозга, а не для компьютера.
Различие - то, что объекты имеют процедуры и связанные данные в том же месте - процедурные языки используют 'структуры' (вещи, которые скрепляют связанные данные), который разделяет данные от процедур. Эффективно, что-либо, что Вы делаете на языке OO, должно быть возможным на процедурном языке с комбинацией структур и процедур.
основным различием является набор ума, что OO языки вставляет программистов.
ОО - это в основном образ мыслей. Вы можете программировать ОО на C (если вы действительно хотите ...), и вы можете прекрасно иметь процедурный код на C ++ / Java; Я имею в виду, что даже если вы используете классы на поверхности, это все равно может быть процедурным.
Идея OO - абстракция государства. Вместо «мышления» в терминах «группировки данных» вы «мыслите» в терминах «объектов», где объект является «интерфейсом» для «группировки данных и способов манипулирования этими данными».
Все это звучит философски, потому что это .
Здесь есть, что сказать, и это нельзя сказать в небольшом SO сообщении, поэтому я оставлю это здесь.
ОБНОВЛЕНИЕ
Как уже упоминалось в ответа Фланагана , ОО-языки реализуют конструкции, использующие эту абстракцию.
Я имею в виду, что вы могли бы технически «взломать» классы и полиморфизм с точки зрения структур, функций и указателей на функции.
Вот пример OO в C
[простите за стиль учебника, уже поздно и я устала]
процедуры обрабатывают данные - данные, применяют некоторую обработку, извлекают данные
иногда, некоторые элементы данных связаны с некоторыми другими элементами данных, и удобно сгруппировать их в структуру данных , которой затем можно манипулировать и обращаться как к одному элементу.
Теперь наша процедура может принимать структуру данных в качестве входных данных и изменять их и / или создавать другую структуру данных в качестве выходных данных
. Иногда мы замечаем, что некоторые процедуры имеют дело только с определенным типом структуры данных; удобно сгруппировать эти процедуры вместе с их структурой данных и назвать ее объектом .
шаблон для создания объектов называется классом ; объект называется экземпляром класса
, мы можем заметить, что один класс очень похож на другой, поэтому вместо копирования и вставки кода мы позволяем одному классу наследовать из другого: подкласс наследуется от суперкласса или «базового класса». Таким образом, подкласс имеет доступ ко всем структурам данных и процедурам суперкласса и может дополнять или переопределять их определенным образом
, если мы вежливо запрашиваем объект, чтобы он что-то сделал для нас, вместо того, чтобы жестоко вызывать его напрямую, это называется передачей сообщений , даже если фактическое «сообщение» не передается. Радость здесь в том, что многие различные виды объектов могут понимать одно и то же сообщение, что приводит к понятию полиморфизма . Например, мы можем попросить много разных видов документов напечатать сами, и каждый из них ответит соответствующим образом.
Язык, который поддерживает объекты (через классы или нет) с передачей сообщений и наследованием, называется объектно-ориентированным . Если нет наследования, язык является просто объектно-ориентированным .
удачи в учебе!
Можно программировать процедурно на большинстве языков OO, но питание OO прибывает из способности наследовать, инкапсулировать и абстрагировать ту процедурную логику. Я думаю, что Вы корректны, библиотека должна много походить на класс. Это должно иметь свой собственный объем и инкапсулировать логику позади функций с понятными именами.
В процедурной программе код является королем, и данные зависимы. Другими словами, у Вас есть программы, которые действуют на данные, и они обычно плотно не связываются.
В мире 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.
Процедурный часть процедурного/функционального/логичного (или ориентированная логика) различие (сравните c, шепелявость и пролог) между различными способами описать то, что должна сделать программа.
Объектная ориентация является ортогональной к этой другой идее и описывает средство группирующихся подпрограмм с данными. C++ и Java являются процедурными языками с объектно-ориентированными функциями; fortran77 является процедурными языками без объектно-ориентированных функций. Язык Common LISP поддерживает объектную ориентацию; некоторые старше шепелявят, не делают. Простой ванильный пролог не поддерживает объекты, и я не могу назвать ориентированный язык логики, который делает (я не делаю, логика ориентировала программирование, это находится в моем списке вещей сделать, когда я имею некоторое обильное свободное время. Я едва делаю функциональное программирование).
, Поскольку другие обратили внимание, однако, на надлежащие объектно-ориентированные интеллектуальные изменения, как Вы делаете свое программирование так же как переключатель от процедурного до функционального.
<час>BTW - я вижу "процедурный", использовал много для различения необъектно-ориентированных процедурных языков от их объектно-ориентированных братьев, но я думаю, что это - плохое использование, управляемое отсутствием чистого прилагательного для "не объектно-ориентированный". YMMV.
Много интересных моментов уже упомянуто здесь.
Один способ думать об этом состоит в том, что в OO, у Вас есть идея 'объектов', которые являются вещами, которые имеют характеристики и поведения, свойственные им. У них обычно есть своего рода общедоступный 'интерфейс', который обеспечивает механизм для получения некоторой информации о них, но сам объект, или скорее его 'класс', пределы, какая информация общедоступна. Внутренности объекта не выставляются общественности, потому что обычно нет никакой потребности знать грязные детали 'под капотом' объекта. Таким образом, объектно-ориентированные программы используют эту конструкцию, а также другие вещи.
Процедурное программирование обычно не использует такую связь данных и поведения в 'объект'. Я видел сделанный в C прежде, но это не было симпатично и не включено слишком много бессмысленной работы для приближения то, что можно было сделать с, скажем, C++.
Одна из идей позади объектно-ориентированной разработки - то, что я не должен мочь унавозить с Вашими данными через любые средства кроме тех, что Вы обеспечили. При обеспечении меня, только хорошо думавший взаимодействует через интерфейс, можно сохранить меня честным. Теперь, если Вы используете процедурный подход, и Вы отправляете мне структуру, которая не имеет никаких встроенных мер защиты, хорошо затем я могу сделать, как мне нравится и если я являюсь немым или злым, я могу изменить вещи, которые Вы не могли бы хотеть, чтобы я изменил.
Предоставленный, можно обойти объект, если Вы умны, но необходимо стараться изо всех сил делать это.
Это не завершено, но это - один аспект.
Вы правы в том, что объектно-ориентированные программы во многом основаны на процедурной парадигме. Вы также правы в том, что синтаксически все, что действительно происходит, это то, что вы вызываете функции. Фактически, вы могли бы реализовать многие функции объектно-ориентированных языков, используя процедурные механизмы (например, указатели на функции в C ++). Таким образом, вы можете сделать объектно-ориентированный дизайн и по-прежнему реализовывать его на процедурном языке (например, как это делали старые компиляторы C ++).
Важность объектно-ориентированной парадигмы не столько в языковом механизме, сколько в процессе мышления и проектирования . В процедурном программировании мы думаем об операциях и разбивке этих операций, используя другие операции, группируя их в модули и т. Д. Это означает, что данные или состояние становятся второстепенными. Это как думать о математических операциях.
С другой стороны, объектно-ориентированная парадигма говорит о том, что вам нужно думать о состоянии и операциях вместе как о сущности, а затем разрабатывать свою программу как взаимодействие между сущностями, которые обмениваются состоянием и активируют операции.