Как стать автором
Обновить
13.33
Рейтинг

ООП

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

Сначала показывать
  • Новые
  • Лучшие
Порог рейтинга
  • Все
  • ≥0
  • ≥10
  • ≥25
  • ≥50
  • ≥100

Объектно ориентированное программирование на Си без плюсов. Часть 1. Введение

ПрограммированиеСистемное программированиеАлгоритмыCООП
Из песочницы

Приветствую! 

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

Статья рассчитана на тех кто уже знаком с Си, а все примеры ориентированы на ОС Linux. Мои познания Windows закончились на «WinXP», после которой в Windows стало уже очень много политики ("безопасности") и коммерческой составляющей, но я сейчас не об этом и надеюсь, что здесь вы найдёте для себя полезные моменты, а если я в чём-то не прав или заблуждаюсь, то поправите.

Итак, я решил попробовать писать в стиле объектно ориентированного программирования (далее ООП) на Си без плюсов. Многие скажут, что писать в стиле объектно ориентированного программирования (далее ООП) не для Си, и разные приёмы написания это - «псевдо-ООП». Но лично я считаю ООП всего лишь абстрактной парадигмой, определяющей стиль написания ПО и не более чем. А Си очень мощный и самодостаточный язык программирования.

Так сложилось, что изучать традиции ООП я начал с Delphi и Java, являющихся, как считается, на 100% объектно ориентированными языками программирования, а потому аналогия решений у меня ассоциируется именно с ними. И далее в тексте я иногда буду на них ссылаться, что надеюсь не испортит суть полного понимания.

Читать далее
Всего голосов 12: ↑11 и ↓1+10
Просмотры5.6K
Комментарии 37

Новости

Показать еще

Cohesion и Coupling: отличия

ПрограммированиеАнализ и проектирование системСовершенный кодПроектирование и рефакторингООП
Перевод

Эта статья является переводом материала «Cohesion and Coupling: the difference». 

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

Читать далее
Всего голосов 17: ↑17 и ↓0+17
Просмотры4K
Комментарии 2

DI не из ада

ПрограммированиеJavaПроектирование и рефакторингООП

Год назад я написал статью про DI в Spring/Java EE. Мой тезис звучал довольно категорично: "DI через конструкторы является единственно правильным. Все остальное – от лукавого". Прошло время, я пообщался с разными разработчиками на эту тему, сменил проект, компанию, провел множество собеседований, отсмотрел большое количество строк на code-review и сейчас могу сказать, что не все так однозначно. Давайте наконец разберемся, как же все-таки инжектить правильно.

Читать далее
Всего голосов 3: ↑2 и ↓1+1
Просмотры4.8K
Комментарии 12

Книга «Экстремальный Cи. Параллелизм, ООП и продвинутые возможности»

Блог компании Издательский дом «Питер»Высокая производительностьCООППрофессиональная литература
image Привет, Хаброжители! Для того чтобы овладеть языком C, знания одного лишь синтаксиса недостаточно. Специалист в области разработки должен обладать четким, научным пониманием принципов и методик. Книга «Экстремальный Cи» научит вас пользоваться продвинутыми низкоуровневыми возможностями языка для создания эффективных систем, чтобы вы смогли стать экспертом в программировании на Cи.

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

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

Камран Амини научит вас думать, сомневаться и экспериментировать. Эта книга просто необходима для всех, кто хочет поднять знания Cи на новый уровень.
Читать дальше →
Всего голосов 11: ↑10 и ↓1+9
Просмотры4.3K
Комментарии 13

Spring Data: нюансы @Transactional

ПрограммированиеJavaООП
Перевод

Любите Spring? А Spring Data? Я тоже люблю. Если хотите разобраться, почему же возникает этот unexpected transaction rollback, а также быть уверенным, что транзакция отменится, а не закоммитится, добро пожаловать под кат.

Читать далее
Всего голосов 7: ↑7 и ↓0+7
Просмотры4.2K
Комментарии 8

OCP против YAGNI

ПрограммированиеАнализ и проектирование системСовершенный кодПроектирование и рефакторингООП
Перевод

Эта статья является переводом материала OCP vs YAGNI.

В этом посте хочется осветить тему OCP и YAGNI – противоречия между принципом открытости/закрытости и принципом «вам это не понадобится».

Давайте начнем с того, что вспомним, что такое OCP. Принцип открытости/закрытости гласит, что: Объекты программного обеспечения (классы, модули, функции и т.д.) должны быть открыты для расширения, но закрыты для модификации.

Впервые он был представлен Бертраном Мейером в его канонической книге «Конструирование объектно-ориентированного программного обеспечения». С тех пор его популяризировал Боб Мартин, когда он представил принципы SOLID.

Официальное определение довольно расплывчато и на самом деле не помогает нам понять основной смысл. Итак, давайте углубимся в этот принцип.

Читать далее
Всего голосов 17: ↑17 и ↓0+17
Просмотры5.5K
Комментарии 24

Программа в 50 строк на Java/Scala, которая сэкономит вам 50 тыс. р. при подаче декларации 3-НДФЛ

ПрограммированиеJavaScalaООПФункциональное программирование
Recovery mode

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

Но если брокер такой как у меня - Interactive Brokers (организация, третьего дня запрещенная на территории РФ), декларацию вам придется делать и подавать самому. Делать это всем, конечно же лень, и неплохо бы отдать подготовку на аутсорс...

Читать далее
Всего голосов 28: ↑16 и ↓12+4
Просмотры7.1K
Комментарии 22

Метрика Cognitive complexity или простой способ измерить сложность кода

ПрограммированиеАнализ и проектирование системСовершенный кодПроектирование и рефакторингООП

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

Цель этой статьи: рассказать не об инструменте, а о метрике, о которой пока написано и рассказано совсем немного. Уверен, что это поможет улучшить качество многих проектов и немного облегчит жизнь программистов.

Читать далее
Всего голосов 4: ↑4 и ↓0+4
Просмотры1.1K
Комментарии 2

Мультивселенная и задачи о переправе

Ненормальное программированиеПрограммированиеООПФункциональное программированиеKotlin

Как-то прочел на Хабре статью «Перевозим волка, козу и капусту через реку с эффектами на Haskell», которая так понравилась, что решил написать фреймворк для всего класса задач о переправах, используя мультипарадигменное проектирование. Наконец удалось найти время, и вот, спустя почти год, фреймворк готов. Теперь персонажи, их взаимодействия и описание искомого результата задаются через domain-specific language, который позволяет решать любые головоломки подобного рода с пошаговым выводом. Ниже приводится поэтапный разбор реализации DSL. Статья подойдет тем кто изучает язык Kotlin или просто интересуется примерами его использования. Некоторые малозначимые детали (вроде импортов и вывода) для кратости опущены.

Начнем писать код
Всего голосов 9: ↑8 и ↓1+7
Просмотры1.9K
Комментарии 0

Как синхронизировать сценарий без транзакций? Штатными средствами Java

JavaАлгоритмыAPIООПБраузеры
Tutorial

Давайте представим, что вы параноик, и параноик вдвойне, когда дело касается многопоточности. Предположим, что вы делаете backend некого функционала приложения, а приложение переодически дергает на вашем серверы какие-то методы. Все вроде хорошо, но есть одно но. Что если ваш функционал напрямую зависит от каких-либо других данных, того же банального профиля например? Встает вопрос, как гарантировать то, что сценарий отработает именно так, как вы планировали и не будет каких-либо сюрпризов? Транзакции? Да это можно использовать, но что если Вы фантастический параноик и уже представляете как к вам на сервер летит 10 запросов к одному методу от разных клиентов и все строго в одно время. А в этот момент бизнес-логика данного метода завязана на 100500 разных данных. Как всем этим управлять? Можно просто синхронизировать метод и все. Но что если летят еще и те запросы, держать которые нет смысла? Тут уже начинаются костыли. Я пару раз уже задавался подобным вопросом, и были интересно, ведь задача до абсурда простая и повседневная (если вы заботитесь о том, чтобы не было логических багов конечно же ). Сегодня решил подумать, как это можно очень просто и без костылей реализовать. И решение вышло буквально на 100 строк кода.

Немного наглядного примера

Давайте предположим, что есть водитель и есть пассажир. Водитель не может менять машину до тех пор, пока клиент, например подтверждает поездку. Это что получается, клиент соглашался на поездку с одними характеристиками машины, а по факту у водителя другая машина? Не дела! Можно организовать что-то подобное:

Читать далее
Всего голосов 13: ↑3 и ↓10-7
Просмотры3K
Комментарии 8

Абстрактные синглтоны, фабрики или 665 принцип ООП

PythonJavaC#ООП
Из песочницы

В современном мире ООП стало неотъемлимой частью разработки. Многие популярные языки, такие как Pyhon, Jaba, Hachkell, GOO и C== поддерживают данную парадигму. В этой статье я постараюсь раскрыть смысл таких архитектурных конструкций, как абстрактный синглтон и фабрика абстрактных синглтонов.

Читать далее
Всего голосов 20: ↑8 и ↓12-4
Просмотры4.7K
Комментарии 8

SQLAlchemy: а ведь раньше я презирал ORM

Высокая производительностьPythonSQLПроектирование и рефакторингООП

Так вышло, что на заре моей карьеры в IT меня покусал Oracle -- тогда я ещё не знал ни одной ORM, но уже шпарил SQL и знал, насколько огромны возможности БД.

Знакомство с DjangoORM ввело меня в глубокую фрустрацию. Вместо возможностей -- хрена с два, а не составной первичный ключ или оконные функции. Специфические фичи БД проще забыть. Добивало то, что по цене нулевой гибкости мне продавали падение же производительности -- сборка ORM-запроса не бесплатная. Ну и вишенка на торте -- в дополнение к синтаксису SQL надо знать ещё и синтаксис ORM, который этот SQL сгенерирует. Недостатки, которые я купил за дополнительную когнитивную нагрузку -- вот уж где достижение индустрии. Поэтому я всерьёз считал, что без ORM проще, гибче и в разы производительнее -- ведь у вас в руках все возможности БД.

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

SELECT article FROM habr
Всего голосов 38: ↑32 и ↓6+26
Просмотры15K
Комментарии 118

Распознавание команд

МессенджерыООПФункциональное программированиеKotlinNatural Language Processing

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

Читать далее
Всего голосов 5: ↑5 и ↓0+5
Просмотры2.1K
Комментарии 1

Почему концепция Exception в C# — зло

Блог компании Retail Rocket.NETC#ООП

В этой заметке я поделюсь наблюдениями о проблемах концепции exception в языке C#, именно о тех, которые возникают от самого факта наличия такой ее реализации. И оставлю “за скобками" проблемы, которые появляются от ее неправильного использования. Ниже я перечислю и опишу их.

Читать далее
Рейтинг0
Просмотры794
Комментарии 23

Принцип подстановки Барбары Лисков (предусловия и постусловия)

PHPПрограммированиеСовершенный кодПроектирование и рефакторингООП
Из песочницы

​Почему у многих возникают проблемы с этим принципом? Если ли более простое объяснение?

​️В данной статье мы НЕ будем рассматривать общие примеры данного принципа, о которых уже есть много материалов (пример с квадратом и прямоугольником или управления термостатами). Здесь мы немного подробнее остановимся на таких понятиях как «Предусловия», «Постусловия», рассмотрим что такое ковариантность, контравариантность и инвариантность, а также что такое «исторические ограничения» или «правило истории».

Интересно...
Всего голосов 22: ↑20 и ↓2+18
Просмотры7.6K
Комментарии 19

“Заапрувьте мой ПР!”: инструменты гита через CQRS и Event Sourcing для пользователей

Блог компании БАРС ГрупАнализ и проектирование системПроектирование и рефакторингООПМикросервисы
Tutorial

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

Современные приложения работают со все большим количеством информации, и, понятно, что чем эффективнее подходы работы с потоками данных, тем эффективнее работа приложения в целом. 

За пять предыдущих лет человечеством было произведено информации больше, чем за всю предшествующую историю (из них половина была произведена в нашем отделе УНП). 

Проблематика

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

Мы занимались разработкой именно такой системы, и сегодня речь пойдет о новой версии реализации системы, которую мы разработали совместно со Skirgus.

Читать далее
Всего голосов 7: ↑7 и ↓0+7
Просмотры1.7K
Комментарии 2

Prototype Design Pattern в Golang

PHPПрограммированиеПроектирование и рефакторингООПGo

Привет друзья! С вами Алекс и я продолжаю серию статей, посвящённых применению шаблонов проектирования в языке Golang.

Интересно получать обратную связь от вас, понимать на сколько применима данная область знаний в мире языка Golang. Ранее уже рассмотрели шаблоны: Simple Factory, Singleton и Strategy. Сегодня хочу рассмотреть еще один шаблон проектирования - Prototype.

Читать далее
Всего голосов 2: ↑0 и ↓2-2
Просмотры1.9K
Комментарии 4

В поисках упорядоченного множества в Python: разбираемся с теорией и выбираем лучшую реализацию

Блог компании МаклаудPythonПрограммированиеСовершенный кодООП


Множество (Set) — структура данных, которая позволяет достаточно быстро (в зависимости от реализации) применить операции add, erase и is_in_set. Но иногда этого не достаточно: например, невозможно перебрать все элементы в порядке возрастания, получить следующий / предыдущий по величине или быстро узнать, сколько элементов меньше данного есть в множестве. В таких случаях приходится использовать Упорядоченное множество (ordered_set). О том, как оно работает, и какие реализации есть для питона — далее.

Читать дальше →
Всего голосов 31: ↑27 и ↓4+23
Просмотры4.6K
Комментарии 1

Dependency Injection в мире Software Engineering

Блог компании АвитоPHPПрограммированиеСовершенный кодООП

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

Читать далее
Всего голосов 29: ↑28 и ↓1+27
Просмотры15K
Комментарии 8

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