Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Однако в реальном мире есть только объекты. Классы существуют только в нашем сознании. Можете ли вы привести хоть один пример из реального мира, что класс — это реальная, физическая сущность? Нет, не думаю.
В процедурных программах процедуры вызывают другие процедуры. Процедурный код показывает… процедуры, вызывающие другие процедуры. Все хорошо и просто, так ведь?
В объектно-ориентированных программах объекты посылают сообщения другим объектам. Объектно-ориентированный код показывает… классы, наследующие другие классы. Ой. Кажется, что в ООП между исходным кодом и исполняемой программой нет никакой связи. Наши инструменты плохо помогают нам: IDE ведь показывают классы, а не объекты.
Честно говоря, методы я тоже терпеть не могу.
Примем во внимание то, что на чтение объектно-ориентированного кода мы тратим больше времени, чем на его написание.
Конечно, “бестиповых” языков не существует — существуют статически и динамически типизированные. Статически типизированные мешают писать код в некоторых случаях. В принципе, ничего плохого в этом нет.
Вы реально все это восприняли только в прямом смысле?

Просто в Smalltalk-ах нет разделения на время «редактирования», «выполнения» и «выполнения с отладкой» — любая программа выполняется в единой среде, в которой (если не отключены) живут все объекты, представляющие средства разработки, отладки, сами классы, методы… и вообще почти все, что есть в программной системе. Очень удобно и эффективно (с точки зрения разработчика, как миминимум).
Если это так, то как оно сохраняется?
И есть ли там понятие «перезапустить программу», например (да и есть ли понятие программы вообще)?
Соответственно «перезапуск» программы выполняется остановкой процесса, выполняющего такие вычисления, и запуск нового аналогичным способом.
Поля кажется нет, а проперти да
Окна Watch и Object Browser прекрасно живут как в отдельных вкладках, так и на втором мониторе.
Shift + F12?
Не понял что требуется.
Тогда автор и функции тогда должен не любить. Потому что метод — это функция, где дополнительным параметром будет объект, т.е. экземпляр класса.
Тут автор явно передергивает. Понятно, что классы существуют только в нашем сознании, но, о ужас, не только классы, но и функции, переменные и проч
Для того, чтобы использовать, нет необходимости читать код.
класс в ООП — это, по сути, протокол создания объектов, описатель будущих экземпляров. Что в природе ведёт себя так же, как классы в ООП? Мне в голову ничего не приходит.
Т.е. метафора ООП хоть и не для любых моделируемых сущностей адекватна, но всё же осязаемее, чем «чистые функции» и т.п.
Но после ООП переходить на ФП — здесь уже нужна не практика, а стремление «сделать не как все». Подобное стремление особо развито у программистов не могущих проявить себя на фоне более умелых коллег.
Одно и то же понятие называется по-английски «нитками», по-русски «потоками» — и что, его по-разному из-за этого интерпретируют?
Тут максимум прототипирование, с наследованием ничего общего.
У деталей тоже есть интерфейсы — например, поверхности, которые позволяют их соединять. Соответственно, два предмета с общим механическим интерфейсом являются полиморфными.
Как это ничего общего. В прототипном ООП нет классов, а тут есть класс — чертеж детали, и экземпляр — конкретная деталь, которая обладает своими интерфейсами, определяемыми классом, и состоянием.
И точно так же одна и та же последовательность нуклеотидов (=код класса) всегда порождает одинаковые объекты
> Особи, созданные по одной ДНК — это как? Клонирование что ли?
Да. Классы точно такие же клоны, разве нет?
Добавив ему состояние (которое есть у Васи и Пети) получим разные реакции на одинаковые раздражители. И кстати, никто не запрещает делать это состояние зависимым от бесконечного числа динамических/случайных параметров => разные экземпляры класса практически всегда будут вести себя по разному.
Различная последовательность ни о чем не говорит, тем более без распаковки сравнивать их недопустимо. Не удивлюсь если окажется что все птицы имеют одинаковые участки ДНК, воссоздающие эти органы, но с совершенно разным набором параметров в зависимости от вида.
> Найдёте для них «метасущность», порадившую оба предмета?
Табурет :)
Это не так ru.wikipedia.org/wiki/Клонирование_(биология)
Вы наверное хотели сказать в простой программе?
Я так и не увидел аргументов против того что ДНК это программа, что кстати и написано в её определении:
Это как бы был намёк, что в природе клонирования не существует.
ведь одной из фишек ООП обычно называют как раз отражение реального мира, не так ли?Есть несколько абстракций, которые иногда используются на начальных этапах обучения ООП. Признаться — они меня всегда бесили. По-моему, также, как есть гуманитарный и технический склад ума, тамже существует и «тип мышления, легче обучающегося через аналогии» и «тип мышления, не требующего аналогий при обучении». Мне нафиг не нужны отображения вроде «class Car — это как машина в реальном мире, у неё есть разные характеристики (properties), она всякое умеет (methods)» и т.п. Мне достаточно понимания того, КАК работает та или иная конструкция. Тем не менее, выделение сущностей — чертовски хорошая идея, позволяющая четко отразить взаимосвязи между компонентами, модулями, классами и т.п.
Соответственно, в ФП принято оперировать понятиями из математики — чистые функции, отсутствие состояния, алгебраические типы данных и т.д. ООП само по себе, у него нет «родительской парадигмы» — оно не отражает ни реальный мир, ни какую-то другую науку.
у ООП нет очевидного аналога,
вопрос в том, чему сама парадигма изначально была сопоставлена.
Я согласен со второй цитатой. НЕВОЗМОЖНО создать нечто, не имеющее аналогов в реальном мире.
Про математику я бы не спешил с выводами. Вообще тут еще стоит определиться что есть аналог, но для предметного разговора Вам хорошо бы привести примеры, что есть в математике такое, чему нет никакого соответствия, аналогии в реальном мире. Достаточно одного примера.
Человек, фактически, мыслит в ООП-парадигме, идентифицируя явления окружающего мира в виде объектов (обладающих структурой и поведением, т.е. данные + методы) и обобщая их в виде понятий, идей (классы, дальше иерархия классов).
feed(cat) — покормить кота, а не cat.feed()
Обобщение понятий по общим признакам — это интерфейсы
Отношения между объектами реального мира гораздо сложней, чем это описывает ООП
Бесконечная последовательность.
Вселенная по-вашему конечна? Есть граница?
Cat cat;
cat.eat(); — мы сказали коту «иди поешь!»
Изначально вопрос стоял лишь о наличии аналогий, а не полного соответствия ООП и реальности. Поэтому сравнивать ООП с логическим программированием тоже смысла нет — есть множество способов описания реальности, и будут новые, и ООП не есть серебрянная пуля, это все понятно. Но в каком месте ООП противоречит реальности — я не услышал.
Да нет, нормально оно все отражает, хотя и довольно упрощенно (собственно в этом и есть весь смысл — описать сложную систему так чтобы её можно было понять).
никто не заставляет вас его оживлять, что мешает создать ConnectionManager который будет управлять соединениями вместо самого соединения?
O_O, правда? Может быть объясните почему?
ООП это и есть абстракция реального мира («реальный мир» здесь далеко не в буквальном смысле).
Если над соединением оперируют внешние к нему методы, чем оно, как объект, отличается от структуры в процедурном программировании?
В методе человек:: кормить идет не просто cat.сытость += 10 (т.е. работа с объектом как со структурой, в процедурном стиле)
Посмотрите на мир вокруг: разве он не состоит из объектов (предметов, систем), обменивающихся сообщениями (поля, излучения)?
class HelloWorld
{
print "hello world";
}
Во-вторых, что настолько сложного в изучении ООП? Функциональное программирование после императивного — это да, а разнесение функциональности по классам и прочее чем сложно для понимания?
И в-третьих, большинство повсеместно используемых базовых библиотек написаны без всякого ООП на чистом C, что и дало возможность подключать их к чему угодно, делать биндинги для других языков и так далее.
Всех ООП устраивает
Оскара не устраивает.
анализа литературы по разработке и аудитории различных конференций
Но пока сторонники функциональной парадигмы пишут своё ПО на IDE которое полностью оопэшное и запускают его на осях которые полностью оопэшные.
Мир не-ООП вокруг крайне мал.
Ещё я заметил, что сторонники ООП практически никогда не выступают с критикой других парадигм.
Кстати, я вообще сомневаюсь, что ФП можно назвать парадигмой в силу минимализма ограничений.
Но сколько математики нуждающейся в нарушении принципов ООП даже в математическом проекте типа Matlab или AutoCad? Даже в этих специальных пакетах она накрепко инкапуслирована в своих библиотеках и составляет наверное не очень большую часть кода.
y = cplexqp(cov(dailyReturns), linearPart, -oneVec, 0, expectedReturn - rf, 1);
cplex = Cplex('A');
cplex.Model.sense = 'minimize';
cplex.addCols(zeroVec', [], zeroVec', inf * oneVec');
cplex.addRows(0, oneVec, inf);
cplex.addRows(1, expectedReturn - rf, 1);
cplex.Model.Q = cov(dailyReturns);
cplex.Param.qpmethod.Cur = 6; %(1) concurrent algorithm
cplex.Param.barrier.crossover.Cur = 1; %(2) enable crossover
cplex.solve();
y = cplex.Solution.x;
Об ООП в инженерных пакетах я имел в виду несколько другое — саму программу, а не математические библиотеки и способы их вызова.
template<class T, class U, class R> R add(T x, U y) {
return 2*x + y;
}
add(x, y) = 2*x + y;
IAddable add(IAddable x, IAddable y) {
return x.add(y);
}
IAddable X::add(IAddable y) {
return y.addX(2 * x);
}
IAddable Y::add(X x) {
//наконец-то все типы известны и вызываем operator+(X x, Y y)
return (*this) + x;
}
В C++ ООП реализуется посредством виртуальных функций и наследования, а ОП — с помощью шаблонов классов и функций. Тем не менее, суть обеих методологий связана с конкретными технологиями реализации лишь косвенно. Говоря более формально, ООП основано на полиморфизме подтипов, а ОП — на параметрическом полиморфизме. В других языках то и другое может быть реализовано иначе.
ООП это парадигма программирования реализующая концепции полиморфизма, наследования и инкапсуляции для класов. Всё.
Не надо привязывать парадигму к реализации, какое еще такое «статическое ООП»?
Опять же не смешивайте парадигму с ее реализацией, STL это не обобщенное программирование, а его реализация с помощью шаболнов и функций
Обобщенное программирование и шаблоны в С++ не являются неявной типизацией (duck typing).
«Поддержка обобщенного программирования делала С++ уникальным на то время».? Да ладно
Из перечисленного специфично для ООП только наследование… полиморфизм на интерфейсах (подтипировании) очень негибкий.
STL непосредственно связан с реализацией. Ее нельзя сделать на подтипировании — иерархия интерфейсов будет чудовищной и неэффективной.
Не бывает ООП с типизацией, бывает ОО язык с типизациейНе надо привязывать парадигму к реализации, какое еще такое «статическое ООП»?Без дактайпинга.
Если какой-то один чудак на Stack Overflow использует неправильное выражение, это не значит что оно становиться термином.Обобщенное программирование и шаблоны в С++ не являются неявной типизацией (duck typing).Вы специально не дочитали? Я пишу: дактайпинг времени компиляции. Гуглите по-английски. Возможно есть термины и получше, мне этот нравится, потому что все проблемы дактайпинга в наличии (необходимость анализа трейсбэка и реализации при ошибках).
Как вы странно читаете, между строк. Я перечислил вещи которые в CS считаются основой парадигмы ООП, без привязки к реализации.
Если какой-то один чудак на Stack Overflow использует неправильное выражение, это не значит что оно становиться термином.
Еще раз, STL это реализация generic алглоритмов на основе шаблонов, как инструмента ОП для С++.
А С++ как был 10 лет назад уникальным языком, так им и остается.
public, private, protected, automated и published . В большинстве остальных языков таких модификаторов 3( что верно, ведь программисты Borland засунули в Delphi модификаторы automated и published для внутренних нужд самой IDE ). И вообще, в ООП даже нет такого понятия, как «сокрытие данных». Есть 4 основных понятия: абстракция, полиморфизм, инкапсуляция и наследование.
public enum SmalltalkBool {
FALSE {
public SmalltalkBool And(SmalltalkBool arg) {
return FALSE;
}
public SmalltalkBool Or(SmalltalkBool arg) {
return arg;
}
public void If(Runnable arg) {
}
},
TRUE {
public SmalltalkBool And(SmalltalkBool arg) {
return arg;
}
public SmalltalkBool Or(SmalltalkBool arg) {
return TRUE;
}
public void If(Runnable arg) {
arg.run();
}
};
public abstract SmalltalkBool And(SmalltalkBool arg);
public abstract SmalltalkBool Or(SmalltalkBool arg);
public abstract void If(Runnable arg);
}
class A{
static virtual void F(){
Console.WriteLine("FA");
}
public void G(){ F(); }
}
class B:A{
static override void F(){
Console.WriteLine("FB");
}
}
type
TFoo = class
class procedure Run(); virtual;
end;
TBar = class(TFoo)
class procedure Run(); override;
end;
...
var
tfoo : class of TFoo;
begin
tfoo := TBar;
tfoo.Run(); // Вызывается TBar.Run()
end;
“Си позволяет легко выстрелить себе в ногу; с C++ это сделать сложнее, но, когда вы это делаете, вы отстреливаете себе ногу целиком.”— Отстрелите себе голову. И больше не говорите загадками.
“Я придумал термин ‘объектно-ориентированный’, и вот что я вам скажу: я не имел в виду C++.” — Алан Кей.— А зря!..
“В C++ всего 2 вещи получились не так: начальный замысел и реализация.” — Бертран Мейер— Зря, Скотт Мейерс был иного мнения.
“Внутри С++ сидит более компактный и понятный язык, отчаянно пытающийся выбраться наружу.” — Бьерн Страуструп— Ииии?
“C++ — это история, повторяющаяся как трагедия. Java — это история, повторяющаяся как фарс.” — Скотт МакКей— Трагедия — это объектно-ориентированный PHP. Перечисленное — не трагедия.
“Java, лучший аргумент за SmallTalk после C++.” — Фрэнк Винклер— Скажите это разработчикам на C.
“Если бы у Java был настоящий сборщик мусора, большинство программ удаляли бы себя во время исполнения.” — Роберт Сьюэл— Если бы у бабушки был х… А что случилось со сборщиком мусора у Java? Куда делся? А?..
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп— И чо?..
Классы существуют только в нашем сознании. Можете ли вы привести хоть один пример из реального мира, что класс — это реальная, физическая сущность? Нет, не думаю.— Object в Java, QApplication, QWidget, CDialog и т.п. Нет, ни о чём не говорит? Понятно, что если сразу начинать с Гамма, Хелм, Джамса и Влиссидеса, то понять ничего невозможно.
Вы когда-нибудь задумывались, почему программу на объектно-ориентированном языке понять настолько сложнее, чем на процедурном?— Частенько. Нет, утверждение не верно.
В процедурных программах процедуры вызывают другие процедуры. Процедурный код показывает… процедуры, вызывающие другие процедуры. Все хорошо и просто, так ведь?— А в классах функции класса обращаются к функциям другого класса. Всё также хорошо и просто. Так ведь?
В объектно-ориентированных программах объекты посылают сообщения другим объектам.— Это ооооочень поверхностное увтерждение… к тому же неверное для общего случая…
Я думаю, поэтому SmallTalk’еры так любят программировать в дебаггере— Странно, я всё время считал (по наускиванию Стива МакКонелла), что если человек пытется разрабатывать с помощью отладчика, то он ни черта не соображает в своём собственном коде.
дайте нам IDE, которая будет показывать объекты вместо классов!— А приложение вам не дать с единственным диалоговым окошком «Сделать хорошо? Да и Да-да-да».
но при этом часами пытаемся понять, какие именно строчки нужно написать!— Поправка! ВЫ пытаетесь часами понять, какие именно строчки нужно писать.
Одна из причин, почему мы тратим столько времени, в том, что нам приходится листать код туда-сюда… через множество маленьких методов.— Вы же только что их предлагали?..
Предлагаю вам, однако, назвать хоть один механизм в языках программирования, который поддерживает изменчивость.— Мда…
не код должен генерироваться из модели — модель должна быть кодом.— Легко! Только это будет вполне замечательная модель, из которой генерируется отвратительный код. И наоборот. Это уже сто лет как доступно. Вы не знали?
но мы все еще не овладели этим— Рад, что вы это поняли.
Яваскрипт не является объекто-ориентированным языком
безтиповый указатель (void) не имеет инкримента
incrementing/decrementing a void* pointer, is a valid expression in C (but not in C++).
In the C standard (N1256 draft):
6.2.5-27: A pointer to void shall have the same representation and alignment requirements as a pointer to a character type.
Почему вот этот фиксированный набор методик, выбранный когда-то кем-то, кто-то объявил священной коровой и язык вынуждает меня их использовать везде, вместо того чтобы выбрать что мне нужно?
приемы построения архитектуры программы, и будем иметь только «процедурное программирование с приемами».Вот, пошли «шаблоны проектирования» и прочие «приёмы проектирования» вкупе с книжкой «Как эффективно писать на С++» издания 1998 года. Чем плохи «шаблоны» и «приёмы» — что им можно не следовать. Когда же они «отлиты в
существует очень тонкая грань между хорошо организованным процедурным кодом и плохо организованным ООП.Т.е. вы утверждаете/признаёте, что даже плохо организованный ООП-код находится на, в общем, хорошем уровне организации по меркам процедурного кода?
class A { function b():String { return 'Hello world'; } }function A_b():String { return 'Hello world'; }A a = new A();A.b();A_b();class A { protected SomeClass someClass; function b():void { this.c(); /* что-то ещё */ this.f(); } function c():void { this.f(); /* что-то ещё */ someClass.a(); } function d():void { } function f():void { someClass.d(); }}А чем генетический код не пример реализации ооп?
Ведь статья о взгляде людей, которые создали ООП, на свое творение.
Десять вещей, которые я терпеть не могу в ООП