Как стать автором
Обновить
27.79

ООП *

Объектно-ориентированное программирование

Сначала показывать
Порог рейтинга
Уровень сложности

Наследование реализаций: закопайте стюардессу

Время на прочтение3 мин
Количество просмотров47K

Ключевое противоречие ООП


Как известно, классическое ООП покоится на трех китах:


  1. Инкапсуляция
  2. Наследование
  3. Полиморфизм

Классическая же реализация по умолчанию:


  1. Инкапсуляция — публичные и приватные члены класса
  2. Наследование — реализация функционала за счет расширения одного класса-предка, защищенные члены класса.
  3. Полиморфизм — виртуальные методы класса-предка.

Но еще в 1986 году была обозначена серьезнейшая проблема, кратко формулируемая так:


Наследование ломает инкапсуляцию

Как такое может быть?
Всего голосов 71: ↑52 и ↓19+33
Комментарии349

PHP 7.1: Обзор новых возможностей

Время на прочтение7 мин
Количество просмотров69K
image На Хабре уже был перевод с обзором несколько месяцев назад, но недавно вышел первый релиз-кандидат PHP 7.1, а значит никаких существенных изменений больше не будет и можно сказать, какие точно изменения будут в релизе. Я решил немного оживить сухой “changelog” своим вольным переводом изменений, которые принесет нам новая минорная версия 7.х ветки.
Хочу узнать
Всего голосов 46: ↑46 и ↓0+46
Комментарии58

Null, великий и ужасный

Время на прочтение5 мин
Количество просмотров126K

Ошибка дизайна


Именно так и никак иначе: null в C# — однозначно ошибочное решение, бездумно скопированное из более ранних языков.


  1. Самое страшное: в качестве значения любого ссылочного типа может использоваться универсальный предатель — null, на которого никак не среагирует компилятор. Зато во время исполнения легко получить нож в спину — NullReferenceException. Обрабатывать это исключение бесполезно: оно означает безусловную ошибку в коде.
  2. Перец на рану: сбой (NRE при попытке разыменования) может находится очень далеко от дефекта (использование null там, где ждут полноценный объект).
  3. Упитанный пушной зверек: null неизлечим — никакие будущие нововведения в платформе и языке не избавят нас от прокаженного унаследованного кода, который физически невозможно перестать использовать.

Этот ящик Пандоры был открыт еще при создании языка ALGOL W великим Хоаром, который позднее назвал собственную идею ошибкой на миллиард долларов.

На самом деле все не так плохо
Всего голосов 56: ↑45 и ↓11+34
Комментарии290

30 вредных советов для php-разработчиков

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



Итак поехали:
Читать дальше →
Всего голосов 56: ↑23 и ↓33-10
Комментарии62

Истории

ООП будущего: Барух Садогурский и Егор Бугаенко о том, как мы будем программировать через 20 лет

Время на прочтение23 мин
Количество просмотров56K
Концепция объектно-ориентированного программирования воспринимается разработчиками по-разному: кто-то говорит, что ей уже пора на свалку истории; кто-то кодит и не задумывается о том, что, как и почему он делает; а кто-то пытается работать в «pure OOP» парадигме, переворачивая классические паттерны с ног на голову.

В преддверии Joker 2016 мы попросили Баруха Садогурского обсудить судьбу Java и ООП с Егором Бугаенко. Что из этого получилось, слушайте в аудиоформате или смотрите в видео:



А под катом лежит полная расшифровка интервью со всеми ссылками.
Читать дальше →
Всего голосов 68: ↑58 и ↓10+48
Комментарии331

Пример использования policy-based design в С++ вместо копипасты и создания ООП-шых иерархий

Время на прочтение9 мин
Количество просмотров16K
Язык C++ очень часто обвиняют в неоправданной сложности. Конечно же, язык C++ сложен. И с каждым новым стандартом становится все сложнее. Парадокс, однако, состоит в том, что постоянно усложняясь, C++ последовательно и поступательно упрощает жизнь разработчикам. В том числе и обычным программистам, которые пишут код попроще, чем разработчики Boost-а или Folly. Чтобы не быть голословным, попробую показать это на небольшом примере «из недавнего»: как в результате адаптации к различным условиям тривиальный класс превратился в легкий хардкор с использованием policy-based design.
Много примеров кода
Всего голосов 18: ↑17 и ↓1+16
Комментарии6

Вы препарируете труп используя SOLID

Время на прочтение5 мин
Количество просмотров8.8K
Как говорится «это безумие, делая снова и снова одно и тоже, ничего при этом не меняя, надеяться на какой-нибудь другой результат». Но порой используя одни и те же подходы, утверждения и действия для получения, казалось бы, предсказуемого результата, человек искренне удивляется почему не вышло на этот раз.

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

Начнем мы, как и положено, с самой слабой из парадигм «принципов SOLID», которые хорошо, что в граните не выбиваю. Приготовитесь много букв…
Читать дальше →
Всего голосов 62: ↑23 и ↓39-16
Комментарии85

Elixir: Как выглядит ООП в функциональном языке?

Время на прочтение6 мин
Количество просмотров22K
В последнее время участились статьи и обсуждения на тему прощания с ООП и поиски смысла, который Алан Кэй изначально вкладывал в это понятие.

Несколько высказываний Кэя для тех, кто пропустил
I made up the term “object-oriented”, and I can tell you I didn't have C++ in mind

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

I’m sorry that I long ago coined the term “objects” for this topic because it gets many people to focus on the lesser idea. The big idea is “messaging”.

The key in making great and growable systems is much more to design how its modules communicate rather than what their internal properties and behaviors should be.

Late binding allows ideas learned late in project development to be reformulated into the project with exponentially less effort than traditional early binding systems (C, C++, Java, etc.)

I’m not against types, but I don’t know of any type systems that aren’t a complete pain, so I still like dynamic typing.

В связи с этими обсуждениями, часто всплывает мысль о том, что Erlang/Elixir очень хорошо удовлетворяют критериям, которые Кэй предъявлял к понятию «объектно-ориентированный». Но далеко не все знакомы с этими языками, поэтому возникает непонимание как функциональные языки могут быть более объектно-ориентированными, чем популярные C++, Java, C#.

В этой статье я хочу на простом примере с exercism.io показать как выглядит ООП на Elixir.

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

В конце концов, вы должны быть в состоянии:

  • Добавить имя школьника в класс
  • Получить список всех школьников, обучающихся в классе
  • Получить отсортированный список всех учащихся во всех классах. Классы должны быть отсортированы по возрастанию (1, 2, 3 и т.д.), а имена школьников — по алфавиту.

Читать дальше →
Всего голосов 36: ↑32 и ↓4+28
Комментарии410

Все программисты думают что C++ поддерживает ООП, кроме автора ООП

Время на прочтение5 мин
Количество просмотров37K
В последнее время заметил статьи на тему «ООП крут vs процедурное программирование плохо» и «ООП плохо vs процедурное программирование круто» и «ООП и процедурное плохо vs будущее за XYZ принципами», где XYZ какое-то модно новое понятие.

image

Самое смешное в этих статьях то, что многие под ООП понимают некий принцип когда-то заложенный в C++. И редко кто реально понимает что такое ООП. Вдруг мне показалось что 99% программистов вообще плохо понимают что такое ООП. Но может быть я ошибаюсь? Давайте посмотрим…
Читать дальше →
Всего голосов 55: ↑24 и ↓31-7
Комментарии310

Прощай, объектно-ориентированное программирование

Время на прочтение8 мин
Количество просмотров105K


Я в течение десятилетий программировал на объектно-ориентированных языках. Первым из них стал С++, затем был Smalltalk, и наконец .NET и Java. Я фанатично использовал преимущества наследования, инкапсуляции и полиморфизма, этих трёх столпов парадигмы объектно-ориентированного программирования. Мне очень хотелось воспользоваться обещанным повторным использованием и прикоснуться к мудрости, накопленной моими предшественниками в этой новой и захватывающей сфере. Меня волновала сама мысль о том, что я могу мапить объекты реального мира в классы и думал, что весь мир можно аккуратно разложить по местам.

Я не мог ошибаться сильнее.
Читать дальше →
Всего голосов 225: ↑118 и ↓107+11
Комментарии329

Почему ООП не инкапсуляция, наследование и полиморфизм, или как я научился не волноваться и полюбил разметку

Время на прочтение8 мин
Количество просмотров19K

Всем привет!


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


Читать дальше →
Всего голосов 58: ↑29 и ↓290
Комментарии122

Маслобойка

Время на прочтение4 мин
Количество просмотров48K

Ты слышал про парня, который попрощался с OOП?


О нет. Ещё один? Что же он сказал?

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


Ох. Да, я слышал всё это раньше...

Таким образом, OOП окончательно умерло, и мы можем двигаться дальше.


Двигаться дальше к чему?

Ты чего? К следующему технологическому прорыву, конечно!


А, к этому… И что там у нас на очереди?

Читать дальше →
Всего голосов 178: ↑136 и ↓42+94
Комментарии326

О том, как мы на PHP запускали настоящий MS Excel и что из этого вышло

Время на прочтение6 мин
Количество просмотров28K
Не секрет, что зачастую PHP-программистам приходится решать задачи, весьма далёкие от бытового представления о «веб-разработке». Развитие языка в последние годы привело к тому, что PHP всё чаще считают языком общего назначения, пригодным не только для сайтов, но и для других задач.

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

Дано


  • Многие наши партнёры (скажем прямо — это крупные банки) любят считать что-то в Excel. Причем «любят» — это очень нежно сказано. Сложнейшие скоринговые модели могут быть «запрограммированы» в Excel, в файле из сотни листов с десятками макросов
  • Перевести «программы», написанные в Excel на какой-либо язык программирования — практически нереально. Это займет уйму времени, а проблема постоянного обновления и проверки корректности делает такую задачу и вовсе нерешаемой


Требуется


  • Основная информационная система нашей компании написана на PHP. Она содержит в себе как веб-интерфейсы, так и множество консольных сервисов и воркеров.
  • С этими «программами» в Excel нужно как-то взаимодействовать из консольных приложений на PHP — передавать в них данные, обсчитывать, получать результаты

Некоторое время нам хватало возможностей популярной библиотеки PHPExcel. Но когда от бизнеса поступило очередное требование «нужно, чтобы работали макросы, и еще бы хорошо всё это сохранять в PDF», стало понятно, что выбранный путь — тупиковый. Нужно не парсить файлы xlsx, не имитировать просчёт, и даже не использовать Open Office, а научиться взаимодействовать с «настоящим» Microsoft Excel.


Что из этого вышло - под катом
Всего голосов 50: ↑46 и ↓4+42
Комментарии102

Ближайшие события

One day offer от ВСК
Дата16 – 17 мая
Время09:00 – 18:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн
Антиконференция X5 Future Night
Дата30 мая
Время11:00 – 23:00
Место
Онлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург
Summer Merge
Дата28 – 30 июня
Время11:00
Место
Ульяновская область

Простой Dependency Injection в Node.js

Время на прочтение2 мин
Количество просмотров17K

Прочитав несколько статей на тему DI мне захотелось использовать его в Node.js; после недолгих поисков оказалось, что модулей для этого не так много, из них самый интересный — di.js от Angular, но он мне не подошел и я решил написать свой.

Читать дальше →
Всего голосов 13: ↑8 и ↓5+3
Комментарии34

Как начать разработку крупного, нетипичного проекта. Практическое пособие

Время на прочтение6 мин
Количество просмотров27K

image


Выбор платформы для бекенда

Чтобы создать качественное и производительное Web-приложение, необходимо уделить должное внимание выбору платформы для разработки. Этим нужно заняться сразу же после того, как вы ознакомились, какие задачи должно выполнять это приложение.


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

Читать дальше →
Всего голосов 23: ↑15 и ↓8+7
Комментарии64

Реализация интерактивных диаграмм с помощью ООП на примере прототипа редактора UML-диаграмм. Часть 2

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

Сейчас я перехожу к более рутинным вопросам и рассмотрю построение класса, отвечающего за обработку событий мыши и масштабирование, панорамирование, выделение объектов и drag&drop.

Читать дальше →
Всего голосов 10: ↑9 и ↓1+8
Комментарии5

Язык Go, микросервисы и DevOps – хорошая компания?

Время на прочтение5 мин
Количество просмотров21K
Привет, Хабр!

Напоминаем, что все желающие по-прежнему могут приобрести отличную книгу Сэма Ньюмена "Создание микросервисов". Поскольку наши ожидания эта тема более чем оправдала, мы продолжаем искать связанную с ней литературу и не так давно обратили внимание на книгу о программировании микросервисов на языке Go



Интересную статью с обоснованием этого подхода мы нашли в блоге Agile Maverick, и ее перевод размещаем под катом.

Приятного чтения!

Читать дальше →
Всего голосов 17: ↑13 и ↓4+9
Комментарии13

Реализация интерактивных диаграмм с помощью ООП на примере прототипа редактора UML-диаграмм. Часть 1

Время на прочтение15 мин
Количество просмотров14K
С потребностью создания двумерных интерактивных графических компонент разработчикам программного обеспечения приходится сталкиваться довольно часто. Программисты, ранее привыкшие работать только с алгоритмами обработки данных, при возникновении подобных задач сталкиваются с большими трудностями, если только нельзя обойтись каким-нибудь совсем уж примитивным решением, вроде статической картинки с заранее определёнными «активными» областями. Нестандартность задачи многих отпугивает и заставляет искать готовые средства и библиотеки для отрисовки графов. Но сколь бы многофункциональной не была библиотека, для решения именно вашей задачи в ней будет чего-то недоставать.

В этой статье мы подробно разберём создание «с нуля» компоненты с интерактивными, «перетаскиваемыми» элементами в объектно-ориентированной среде разработки. В качестве примера мы построим прототип UML-редактора.

Читать дальше →
Всего голосов 11: ↑10 и ↓1+9
Комментарии2

Алан Кэй, создатель ООП, про разработку, Лисп и ООП

Время на прочтение5 мин
Количество просмотров60K
image

Если вы никогда не слышали про Алана Кэя, то как минимум слышали его знаменитые цитаты. Например, это высказывание 1971 года:
The best way to predict the future is to invent it.
Лучший способ предсказать будущее это изобрести его.


У Алана очень яркая карьера в информатике. Он получил Премию Киото и Премию Тьюринга за работу над парадигмой объектно-ориентированного программирования. Он был одним из первопроходцев в области персональных компьютеров и графического интерфейса, он разработал Smalltalk — один из первых самых влиятельных языков программирования всех времен.

У нас в Хекслете, особенно в чате, постоянно поднимается вопрос «что такое ООП» и «что имел ввиду Алан Кэй на самом деле». В этой заметке собраны интересные цитаты Алана о состоянии современной разработки, ООП и языке Лисп.
Читать дальше →
Всего голосов 42: ↑37 и ↓5+32
Комментарии139

Вклад авторов