LINUX.ORG.RU

Моё понимание ООП

 


1

1

Мою прошлую тему загадили и утопили в молоке, завалили вопросами типа «а что ты понимаешь под ООП». И жалуются что я не отвечаю. Но не на все вопросы есть простые ответы. «Один дурак может задать столько вопросов, что сто мудрецов не смогут ответить!». И всё же я попробую представить своё видение.

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

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

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

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

Сразу хочу отметить, что я не против банкоматов, они не идеальны, но пока безналичный расчёт не везде принимают, приходится ими пользоваться. Проблема ООП в том, что в нём всё является таким «банкоматом» и везде принимается только нал. Любому очевидно, что когда имеешь дело с банкоматами, ты не можешь ничего оптимизировать.

ООП - это такая модель, в которой «всё является объектом», то есть данные заворачиваются в объект и вместо естественного для вычислительной машины хода обработки данных «данные на входе -> данные на выходе», твой код имеет дело с интерфейсами, т.е. идёт общение с «чёрным ящиком», который «сам знает что делать».

Простой пример: веб-браузер HTML+CSS+Javascript В этом примере HTML - это данные в чистом виде. Они не «знают» как себя отобразить. CSS - тоже данные. Это не объекты. И есть Javascript код, который имеет полный доступ к дереву документа. И когда ты пишешь веб-браузер, у тебя данные на входе - веб страница на выходе - это информационн-ориентированный подход (Data-oriented), в центре которого данные, а не объекты. Сохраняя страницу в формате .pdf ты тоже создаёшь данные на выходе. Эти данные можно отправить в другую программу для дальнейшей обработки. Это как инструмент.

★★

Последнее исправление: svyatozar (всего исправлений: 4)

Ответ на: комментарий от peregrine

Да какое вам дело? Тему не меняйте! Или удалите если вы админ.

svyatozar ★★
() автор топика
Ответ на: комментарий от Siborgium

Ну напиши своё понимание. Я с удовольствием посру в твоей теме.

svyatozar ★★
() автор топика

Один дурак может задать столько вопросов, что сто мудрецов не смогут ответить

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

Просто мудрость.

По теме: откуда вы взяли это ваше «определение» ООП?

Про потребление ресурсов: гуглите концепцию цветных функций.

fernandos ★★★
()

Он полностью сам решает, принимать ли твою банковскую карту или нет.

Очень интересно, а кто должен принимать такое решение в вашей модели?

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

Нет, я знаю. Или не знаю, но узнаю, как только это начнет мне мешать.

ООП - это такая модель, в которой «всё является объектом», то есть данные заворачиваются в объект и вместо естественного для вычислительной машины хода обработки данных «данные на входе -> данные на выходе», твой код имеет дело с интерфейсами, т.е. идёт общение с «чёрным ящиком», который «сам знает что делать».

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

foo(a, b);
// и
a.foo(b);

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


У вас в голове смешались ООП, архитектура и собственные выдумки. Вы упрекаете других в «молоке», но сами путаетесь в терминах.

Siborgium ★★★★★
()
Ответ на: комментарий от svyatozar

Да ладно?

Инкапсуляция, наследование, полиморфизм

И из всех трех вам не нравится именно инкапсуляция, ведь вы пишете:

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

Siborgium ★★★★★
()
Ответ на: комментарий от Siborgium

И потом, если я что-то и путаю, то это потому что тема реально очень сложная и не так много людей в ней разбираются. Даже в Википедии сказано что «точного определения нет. есть такое, а есть вот-такое»…

svyatozar ★★
() автор топика
Ответ на: комментарий от Siborgium

Сам по себе объект - тоже не ООП, ведь любая программа - это объект с инкапсуляцией. Проблема именно в том, что в ООП всё делается через объекты. «всё есть объект» - вот проблема!

svyatozar ★★
() автор топика
Последнее исправление: svyatozar (всего исправлений: 1)
Ответ на: комментарий от svyatozar

«всё есть объект» - вот проблема!

Это не проблема)

TDrive ★★★★★
()
Ответ на: комментарий от svyatozar

ведь любая программа - это объект с инкапсуляцией.

Проблема в том, что всё делается через объекты. «всё есть объект» - вот проблема!

От программ, видимо, стоит отказаться.

Не вижу ни того, чтобы всё «делалось через объекты», ни «все есть объект».

Siborgium ★★★★★
()
Ответ на: комментарий от svyatozar

Зачем ты добавляешь слово «проблема» ко всему подряд?

TDrive ★★★★★
()
Ответ на: комментарий от Siborgium

Википедия:

По мнению Алана Кэя, создателя языка Smalltalk, которого считают одним из «отцов-основателей» ООП, объектно-ориентированный подход заключается в следующем наборе основных принципов (цитируется по вышеупомянутой книге Т. Бадда).

  • Всё является объектом.
  • Вычисления осуществляются путём взаимодействия (обмена данными) между объектами, при котором один объект требует, чтобы другой объект выполнил некоторое действие. Объекты взаимодействуют, посылая и получая сообщения. Сообщение — это запрос на выполнение действия, дополненный набором аргументов, которые могут понадобиться при выполнении действия. Каждый объект имеет независимую память, которая состоит из других объектов.
  • Каждый объект является представителем класса, который выражает общие свойства объектов (таких, как целые числа или списки).
  • В классе задаётся поведение (функциональность) объекта. Тем самым все объекты, которые являются экземплярами одного класса, могут выполнять одни и те же действия.
  • Классы организованы в единую древовидную структуру с общим корнем, называемую иерархией наследования. Память и поведение, связанное с экземплярами определённого класса, автоматически доступны любому классу, расположенному ниже в иерархическом дереве.
svyatozar ★★
() автор топика
Ответ на: комментарий от svyatozar

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

WitcherGeralt ★★
()
Ответ на: комментарий от svyatozar

По мнению Алана Кэя, (цитируется по вышеупомянутой книге Т. Бадда).

Вы уверены, что Алан Кэй знает, какое у него мнение из процитированной книги?

vM ★★
()

ООП - это такая модель, в которой «всё является объектом»

Кто так сказал?

ООП - это парадигма, а не модель, и у этой методологии 4 принципа (к слову сказать, начиналось всё с 3 принципов).

Как можно обсуждать то, что ты понимаешь не так как другие?

vvn_black ★★★★★
()
Ответ на: комментарий от vM

Вы уверены, что Алан Кэй знает, какое у него мнение из процитированной книги?

Да мне пофиг.

svyatozar ★★
() автор топика
Ответ на: комментарий от vvn_black

Кто так сказал?

ООП - это парадигма, а не модель, и у этой методологии 4 принципа (к слову сказать, начиналось всё с 3 принципов).

Как можно обсуждать то, что ты понимаешь не так как другие?

Обсуждать можно всё что угодно. Расскажи как правильно понимать.

svyatozar ★★
() автор топика
Ответ на: комментарий от svyatozar

тема реально очень сложная

Нет.

не так много людей в ней разбираются

Да. Но это следствие не сложности, а какрго-культа на пустом месте и с другой стороны всяких Java, извративших концепцию, заставив неокрепшие умы вверить в то, что это и есть ООП.

WitcherGeralt ★★
()
Ответ на: комментарий от WitcherGeralt

Да. Но это следствие не сложности…

Давай уже расскажи, раз это не сложно. Я же жду. Сейчас вот-вот кто-то да и расскажет. Это ж просто! В двух словах…

svyatozar ★★
() автор топика
Ответ на: комментарий от svyatozar

Ты считаешь, что это модель, я считаю что это методология.

Исходя из того, что ООП - «модель», можно рассуждать о правильной или неправильной реализации модели.

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

И где нам найти пересечение для продуктивного диалога, если терминология разная?

vvn_black ★★★★★
()
Последнее исправление: vvn_black (всего исправлений: 1)
Ответ на: комментарий от svyatozar

Смысл повряться, если ты с первого раза не понял? Идёшь в прошлый тред, нажимаешь Ctrl+F, ищешь мои сообщения. Вперёд.

Если не поймёшь, переспроси ещё раз. Так и быть, отвечу.

WitcherGeralt ★★
()
Последнее исправление: WitcherGeralt (всего исправлений: 1)
Ответ на: комментарий от svyatozar

Что к чему… Кто тебя спрашивал про твою портянку, тем более про дохлый Smalltalk? Это никого не волнует.

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

Siborgium ★★★★★
()

Ты какой-то странный. Кого волнует твое понимание ООП? И почему ты полагаешь, что твое определение ценнее, чем определение Алана Кея?

pinus_nigra
()
Ответ на: комментарий от qaqa

Я согласен, без примеров бесполезно что-то обсуждать. Но если люди к слову «модель» придрались, то они и к идентации кода придерутся…

svyatozar ★★
() автор топика

Объект - это как банкомат.

Любую хорошую идею можно убить плохой аналогией. С ООП так и происходит.

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

vvn_black ★★★★★
()
Ответ на: комментарий от svyatozar

Но если люди к слову «модель» придрались

то ты можешь продолжать беседу с зеркалом.

vvn_black ★★★★★
()

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

Я, конечно, не настоящий сварщик, но если ты не можешь сделать класс-потомок для новых проектов и вместо этого вносишь все изменения в старый класс, то ты ССЗБ.

hateWin ★☆
()
Ответ на: комментарий от pinus_nigra

Ты какой-то странный. Кого волнует твое понимание ООП? И почему ты полагаешь, что твое определение ценнее, чем определение Алана Кея?

Меня спросили - я выложил.

Какое твоё понимание ООП? У тебя его просто нет. И ни у кого его нет. Потому что это бредовая идея и на практике не работает. А работают костыли и спагетти, намотанные на классы и объекты.

svyatozar ★★
() автор топика
Ответ на: комментарий от hateWin

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

hateWin ★☆
()
Последнее исправление: hateWin (всего исправлений: 1)
Ответ на: комментарий от svyatozar

то они и к идентации кода придерутся…

Ну придерутся, и?

qaqa ★★
()
Ответ на: комментарий от vvn_black

Любую хорошую идею можно убить плохой аналогией. С ООП так и происходит.

Предложи хорошую аналогию. Я не считаю ООП хорошей идеей. Она в корне неправильна и она изуродовала С++, для неё придумали целую кучу костылей, и всё равно «телега не едет», а на практике работают лишь те же сопли которые были до неё, только теперь намотанные на классы с объектами…

svyatozar ★★
() автор топика
Последнее исправление: svyatozar (всего исправлений: 2)
Ответ на: комментарий от svyatozar

Да как нет, что ты несёшь.

ООП — это способ композиции кода, не более того. Чтобы композиция была осмысленной, есть набор принципов, который тебе уже назвали выше:

Инкапсуляция, наследование, полиморфизм

WitcherGeralt ★★
()
Ответ на: комментарий от svyatozar

Меня спросили - я выложил.

Теперь возьми совок, убери и больше так на людях не делай.

Вот определение ооп от автора

OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things. 

Можешь попробовать найти хоть одно сходство с той ахинеей, которую ты тут наложил.

pinus_nigra
()
Последнее исправление: pinus_nigra (всего исправлений: 2)
Ответ на: комментарий от WitcherGeralt

Да как нет, что ты несёшь.

ООП — это способ композиции кода, не более того. Чтобы композиция была осмысленной, есть набор принципов, который тебе уже назвали выше:

Инкапсуляция, наследование, полиморфизм

Инкапсуляция сама по себе - это ещё не ООП.

svyatozar ★★
() автор топика
Ответ на: комментарий от svyatozar

А все вместе — ООП. Пример с старыми и новыми проектами и побочными эффектами показывает, что ты не до конца понял, зачем нужно ООП.

hateWin ★☆
()
Ответ на: комментарий от svyatozar

работают костыли и спагетти, намотанные на классы и объекты.

Так же, как и спагетти и костыли, намотанные на процедуры и структуры данных, и другие макаронные изделия и костыли, намотанные на GOTO.

vM ★★
()
Ответ на: комментарий от pinus_nigra

Теперь возьми совок, убери и больше так на людях не делай.

Вот определение ооп от автора

OOP to me means only messaging, local retention and protection and hiding of state-process, and extreme late-binding of all things.

Можешь попробовать найти хоть одно сходство с той ахинеей, которую ты тут наложил.

Да ты даже перевести не удосужился! Очень мило. А вот мне другой собеседник говорит что «инкапсуляция, наследование и полиморфизм». И кто из вас прав?

svyatozar ★★
() автор топика
Ответ на: комментарий от vM

Пора бы уже поговорить и о структурном программировании. А то от него одни проблемы, а все молчат. За всеми этими if/unless/while… не видно реальных goto и любому очевидно что такой код не оптимизировать нормально.

TDrive ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.