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

ООП *

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

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

Актуально ли сегодня ООП?

Уровень сложностиСредний
Время на прочтение11 мин
Количество просмотров57K

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

Термин объектно-ориентированное программирование придумал Алан Кэй. Кэй был членом команды PARC, которая изобрела графический интерфейс пользователя, сделавший таким полезным современный Интернет, персональные компьютеры, планшеты и смартфоны. Ещё она изобрела некоторые из объектно-ориентированных языков, на которых мы сегодня реализуем эти GUI.

Если отсечь все эмоции, связанные с ООП, то что останется? По-прежнему ли ООП является эффективным инструментом разработки ПО, или оно превратилось в устаревшее увлечение? Профессионалам важно знать ответ на этот вопрос!
Читать дальше →
Всего голосов 105: ↑85 и ↓20+65
Комментарии179

Новости

Паттерн Aggregate Outside

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров6.4K

Руслан Гнатовский aka @Number55 в свой статье Когда ни туда, ни сюда, или в поисках оптимальной границы Domain слоя описал известную проблему протекания бизнес-логики из агрегата, в случае если эта логика зависит от данных которые находятся вне агрегата, и предложил несколько решений этой проблемы, каждое из которых не лишено недостатков. Многие из этих недостатков были описаны в статье а также в комментариях поэтому я не буду здесь дублировать эту информацию а попытаюсь предложить решение которое этих недостатков лишено.

Читать далее
Всего голосов 25: ↑25 и ↓0+25
Комментарии17

Улучшение кода без споров и цитирования известных практик

Уровень сложностиПростой
Время на прочтение16 мин
Количество просмотров10K

Не секрет, что при формировании новой команды руководители (Team Leader, Tech Leader) сталкиваются с проблемой формирования единого стиля написания программ, так как все члены команды новые, и у каждого из них свой подход к организации кода и выбору используемой практики. Как правило, в большинстве случаев это приводит к длинным диспутам на ревью, которые в итоге перетекают в различные толкования известных практик, таких как SOLID, KISS, DRY, и т.д. Принципы использования этих практик довольно размыты и, при должном упорстве, легко найти парадокс, когда одна из них противоречит другой. Например, рассмотрим Single Responsibility и DRY.

Одна из вариаций определения принципа единой ответственности (Single Responsibility - буква S из аббревиатуры SOLID) гласит, что каждый объект должен иметь одну ответственность, и эта ответственность должна быть полностью инкапсулирована в класс. Принцип DRY (Don’t repeat yourself) предлагает избегать дублирования в коде. Однако, если у нас в коде есть один набор данных (DTO), который может использоваться в разных слоях/сервисах/модулях, какому из этих принципов нам следовать? Безусловно, во многих книгах по программированию разбираются похожие ситуации, как правило, в них говорится, что если речь идет о разных объектах/функциях с одинаковым набором свойств и логики, но принадлежащим разным доменным областям, то дублированием это не является. Но как доказать что эти объекты ДОЛЖНЫ принадлежать разным доменным областям, и, главное, готов (и уверен ли в своих силах) руководитель доказывать это утверждение?

Читать далее
Всего голосов 27: ↑26 и ↓1+25
Комментарии17

Люди не понимают ООП

Уровень сложностиСредний
Время на прочтение15 мин
Количество просмотров113K

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

Похоже, многим не нравится объектно-ориентированное программирование. Первое, что приходит в голову, когда слышишь эту трёхбуквенную аббревиатуру — это пример с автомобилем, наследование, геттеры, сеттеры и ObjectFactoryFactorySingleton.

Мне это всегда казалось довольно странным. Мне не только нравится ООП, я ещё и считаю, что часто это лучший/наиболее очевидный способ моделирования задачи. И ниже я расскажу, почему.
Читать дальше →
Всего голосов 154: ↑147 и ↓7+140
Комментарии457

Истории

Dependency Injection контейнеры .NET, допускающие полиморфное поведение

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров12K


Иногда случается так, что при разработке приложения на платформе .NET с внедрением зависимостей и сервисами от контейнера требуется поддержка полиморфного поведения.

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

Однако стандартный DI контейнер платформы долгое время не давал этой возможности.

В рамках этой статьи я решил напомнить альтернативы для решения этой задачи на тот случай, если вы ещё не успели переехать на .NET 8 или работаете в каком-нибудь Иннотехе, где в наличии только зеркало NuGet-пакетов, выпущенных до начала 2022 года.
Читать дальше →
Всего голосов 60: ↑57 и ↓3+54
Комментарии146

100 вопросов для подготовки к собесу Python

Уровень сложностиСредний
Время на прочтение75 мин
Количество просмотров111K

Доброго времени суток!

Представляю подборку из 100 вопросов с собесов на позицию джуна Python-разработчика. На Хабре есть неплохие статьи на тему подготовки к собеседованию и всё в таком духе, но прямо набора вопросов/ответов на понимание Python в формате чек-листа не встречал.

Для кого статья?

Читать далее
Всего голосов 56: ↑53 и ↓3+50
Комментарии55

Простой ORM для sqlite3

Уровень сложностиСредний
Время на прочтение12 мин
Количество просмотров12K

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

Не бывало ли вам интересно, как работает изнутри такая идейно простая концепция? Благодаря чему достигается удобство работы? Сегодня мы напишем ORM самостоятельно и узнаем, какие инструменты python нам для этого понадобятся.
Читать дальше →
Всего голосов 50: ↑49 и ↓1+48
Комментарии26

В Java 21 собираются реализовать сопоставление с образцом – так, глядишь, я снова на этот язык перейду

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

Преуведомление

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

Выпуск Java 21 состоялся 19 сентября 2023 года. В этой версии поддерживаются паттерны записи в switch-блоках и выражениях. Такой синтаксис выглядит монументально (как минимум, по меркам Java). Это водораздел, после которого мы вправе говорить, что в Java полноценно поддерживаются паттерны функционального программирования, подобно тому, как это сделано в Kotlin, Rust или C#. Вот и первый пункт, который пробуждает во мне зависть (я Kotlin-разработчик).

Читать далее
Всего голосов 29: ↑29 и ↓0+29
Комментарии12

Тебе не нужно классическое ООП в твоём бэкенд микросервисе

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

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

Читать далее
Всего голосов 51: ↑46 и ↓5+41
Комментарии55

Дайте крудошлепа

Уровень сложностиСредний
Время на прочтение7 мин
Количество просмотров112K

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

У нас был 3(три) Т‑Р-И статуса юзера. Anonym → Logined → Phone_Confirmed. Молодой талант до меня увидел в этом граф, и написал класс на 200+ строк, реализующий алгоритм Флойда‑Уоршелла, прикрутил стейт‑машину и не найдя интересных задач, c блеском прошел собес в Яндекс и свалил.

Меня наняли сеньором, и я каюсь ничерта не понял, алгоритм прекрасно работал на первой ступени, на второй давал сбои, тоскливо погуглил этот алгоритм, стер все к черту и написал: if(status==Logined & phone!=null){status=Phone_Confirmed}.

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

Это было вступление.

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

Потому что, только я могу решить задачку, которую вы уже 10 лет решить не можете, когда прилетает пуш‑уведомление или смс и в твоем всплывающем окне написано:

«Ваш шестизначный пароль доступа в наше приложение: 123...»

Не согласен! ...
Всего голосов 465: ↑402 и ↓63+339
Комментарии727

Как я использовал-таки классы в VBA и даже полюбил это дело

Уровень сложностиПростой
Время на прочтение13 мин
Количество просмотров9.9K

На собеседовании:

- Как у вас с Экселем?

- Я его ненавижу!

- О, да вы VBA-разработчик!

Я не могу открывать здесь Америк, ибо не технарь, но раз тут был чей-то текст, как написать "Hello world" в Word'e, и всем понравился, то думаю, что нелишним будет и мой небольшой опыт.

п1. Как обычный пользователь пишет макросы в эксельке

Периодически и даже регулярно мне приходится читать чужой код на VBA. Как русскоязычных соотечественников, так и их зарубежных коллег. И создается впечатление, что что макрописание в MS-продуктах, несмотря на большую распространенность, достаточно неплохо разработанный макрорекордер (по сравнению с импортозамещающими аналогами - так просто идеально разработанный), в русский народ не пошло, или почти не пошло. Подавляющее большинство кода для Экселя - это так или иначе связанные между собой и кое-как зацикленные куски, записанные макрорекордером и обработанные напильником.

Ну, например, очень редко для обращения к ячейке употребляется метод Cells с индексами номера строки и колонки, по большей части используют уродцев типа Cells("A"&(i+1)) , а переход к следующей ячейке делают через Offset (и. что интересно, код работает - умудряются не запутываться в сдвиге А относительно Б, С относительно Б и так далее, могу только предположить, сколько такую связку из офсетов отлаживают). Массивов в их классическом виде средний российский макрописец не признает в принципе, и я догадываюсь, что он просто не знает, что есть такая сущность, и все переборы и вычисления проводит. обращаясь напрямую к ячейкам (хотя сансэй Уокенбах в каждой книжке повторяет, что массивы работают на порядок быстрей).

Читать далее
Всего голосов 37: ↑33 и ↓4+29
Комментарии15

Swagger и полиморфные контракты в .NET 7

Уровень сложностиСредний
Время на прочтение14 мин
Количество просмотров11K

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

В этой статье мы рассмотрим развитие сериализации платформы (System.Text.Json) вместе с возможностями, которые она открывает.
Читать дальше →
Всего голосов 42: ↑42 и ↓0+42
Комментарии3

Как я написал свой язык и онлайн IDE

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

Здесь онлайн интерпретатор, здесь документация.

В сентябре 2020 года я учился на 2 курсе. В том же месяце я впервые написал программу, которая мне понравилась. Она создаёт svg изображения растений, здесь её можно потрогать.

Чуть позже я выяснил, что такие программы называют процедурными генераторами. Я увлекся этим, сделал ещё парочку (1, 2).

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

Читать далее
Всего голосов 57: ↑56 и ↓1+55
Комментарии16

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

Умные указатели в современном C++ с точки зрения новичка

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

Новые (?) пути управления памятью


Указатели в языках C и C++ — те еще штучки. Они чрезвычайно мощные, но в то же время такие опасные: достаточно небольшого недосмотра, чтобы сломать все ваше приложение. Проблема в том, что управление указателями полностью зависит от вас. За каждым динамическим выделением объекта (например, new T) должно следовать ручное удаление (например, delete T). Забудете это сделать, и в итоге получите хорошенькую утечку памяти.

Более того, динамически выделяемые массивы (например, new T[N]) необходимо удалять с помощью другого оператора (например, delete[]). Поэтому приходится мысленно отслеживать, что вы выделили, и соответственно вызывать нужный оператор. Ошибки с выбором формы приводят к неопределенному поведению, чего при работе на C++ нужно избегать любой ценой.

Другая деликатная проблема заключается во владении. Сторонняя функция возвращает указатель: а не динамически ли были выделены эти данные? Если да, то кто отвечает за очистку? Невозможно получить такую информацию, просто посмотрев на возвращаемый тип.
Читать дальше →
Всего голосов 28: ↑27 и ↓1+26
Комментарии29

Ускоряем разработку

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

Любая работа java-программиста опирается на базис, под которым подразумевается не только непосредственно знание самого языка программирования, но также и знание дополнительных компонентов, без которых программирование в чистом виде, становится достаточно затруднительным либо неконкурентоспособным по времени. Именно об этом мы поговорим в этой статье.
Читать дальше →
Всего голосов 40: ↑33 и ↓7+26
Комментарии1

Fluent Generics in C#

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

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

Несмотря на то, что дженерики давно в C#, мне всё же удаётся найти новые интересные способы их применения. Например, в одной из моих предыдущих статей я написал об уловке, позволяющей добиться return type inference, что может облегчить работу с контейнерными union types.

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

После нескольких экспериментов, я нашёл способ решить проблему элегантно, используя подход схожий с паттерном проектирования fluent interface, который был применён не к объектам, а к типам. Мой подход предлагает domain-specific language, который позволяет разработчику построить нужный тип за несколько логических шагов, последовательно его "конфигурируя".

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

Читать далее
Всего голосов 32: ↑32 и ↓0+32
Комментарии43

Simulating Return Type Inference in C#

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

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

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

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

Читать далее
Всего голосов 30: ↑30 и ↓0+30
Комментарии24

Абстракции и наследование в Си — стреляем по ногам красиво

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

Иногда нет-нет да и хочется что-нибудь абстрагировать и обобщить в коде на Си. К примеру, хочешь ты принтануть содержимое структуры несколько раз, пишешь везде, как дурак, printf("%s %d %f\n", foo->bar, foo->baz, foo->boom), и интуитивно кажется, что есть способ сделать foo->print(foo), и так вообще со всеми структурами, не только с foo.

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

Читать далее
Всего голосов 31: ↑28 и ↓3+25
Комментарии37

ORM — отвратительный анти-паттерн

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

От автора перевода: Написанный далее текст может не совпадать с мнением автора перевода. Все высказывания идут от лица оригинального автора, просьба воздержаться от неоправданных минусов. Оригинальная статья выпущена в 2014 году, поэтому некоторые фрагменты кода могут быть устаревшими или "нежелаемыми".

Содержание статьи:

В статье приведены доводы, которые ставят под вопрос правильность присутствия ORM в рамках ООП.

Читать далее
Всего голосов 79: ↑53 и ↓26+27
Комментарии196

Знакомство с ООП на примере JavaScript

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

Всем привет! В этой статье мы рассмотрим основные характеристики объектно-ориентированного программирования (ООП) на практических примерах JS-кода. В ходе обсуждения мы осветим основные принципы ООП, а также ответим на вопросы, почему и когда этот стиль может быть полезен.
Читать дальше →
Всего голосов 54: ↑49 и ↓5+44
Комментарии33
1
23 ...

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