У классической реализации фабричного метода на C++ есть один существенный недостаток — используемый при реализации этого шаблона динамический полиморфизм предполагает размещение объектов в динамической памяти. Если при этом размеры создаваемых фабричным методом объектов не велики, а создаются они часто, то это может негативно сказаться на производительности. Это связанно с тем, что во первых оператор new не очень эффективен при выделении памяти малого размера, а во вторых с тем что частая деаллокация небольших блоков памяти сама по себе требует много ресурсов.
Для решения этой проблемы было бы хорошо сохранить динамический полиморфизм (без него реализовать шаблон не получится) и при этом выделять память на стеке.
Если вам интересно, как это у меня получилось, добро пожаловать под кат.
Рубрика «Проектирование и рефакторинг» - 60
Фабричный метод без размещения в динамической памяти
2014-11-28 в 21:35, admin, рубрики: c++, c++11, ненормальное программирование, ооп, Проектирование и рефакторинг, фабричный методКак я документирую процесс разработки
2014-11-26 в 13:20, admin, рубрики: Анализ и проектирование систем, документация, Проектирование и рефакторинг, разработка, тз, управление проектамиВы пишите лишнюю документацию для вашего проекта? Нет? Тогда вам ее недостаточно!
Угадать для каждого конкретного проекта необходимый объем технической документации крайне сложно и важно. Важно — потому, что от этого зависит скорость процесса, качество и стоимость. Сложно — потому что сам процесс может меняться со временем, могут меняться исполнители, да и для заданного состояния процесса не так просто подобрать нужный набор и объем документации.
Здесь хотел бы рассказать о своем подходе к документированию работ по небольшим проектам. Небольшой проект это: руководитель-аналитик, 1-3 разработчика, тестеровщик или что-то подобное. Под документацией я понимаю какие-либо артефакты, создаваемые для поддержки следующих процессов: обсуждения, управление требованиями, управление изменениями, управление версиями. Другие процессы я не документирую.
Читать полностью »
Рефакторинг C++ кода в Visual Studio 2015
2014-11-18 в 8:29, admin, рубрики: c++, Visual Studio, Блог компании Инфопульс Украина, Проектирование и рефакторингHello C++ World!
В прошлую пятницу вышел релиз Visual Studio 2015 Preview, в котором были представлены новые возможности увеличения продуктивности разработки, в том числе рефакторинг кода на С++. В значительной мере на реализацию этого функционала повлияли отзывы комьюнити, которые были получены в ходе тестирования Visual Studio «14» CTPs, так что спасибо всем поучаствовавшим.
В этой статье мы рассмотрим такие возможности Visual Studio 2015 Preview по работе над С++ кодом, как:
- Переименование (Rename)
- Извлечение функции (Extract Function)
- Генерация заглушек чисто виртуальных методов (Implement Pure Virtuals)
- Генерация объявлений/заглушек методов (Create Declaration/Definition)
- Перемещение объявлений функций (Move Function Definition)
- Преобразование в Raw-String (Convert to Raw-String Literal)
Cohesion in Enterprise Applications
2014-10-30 в 7:50, admin, рубрики: architecture, cohesion, enterprice, java, patterns, архитектура приложений, Программирование, проектирование, Проектирование и рефакторингВведение
Структура кода, структура проекта, дизайн проекта, архитектура проекта — эти понятия могут иметь различные значения, сложность или глубину для архитектора, разработчика, руководителя проекта или консультанта. Дальше должно идти долгое копание в терминологии, однако позвольте мне быть ленивым и считать, что в рамках этой статьи все эти понятия выражают примерно одно и то же, а именно набор шаблонов, правил, которые говорят, каким образом нужно писать код, правильно реагируя на приходящие требования. К примеру, если для доступа к базе данных мы используем DAO (Data Access Object), то вместе с созданием новой структуры в базе данных, нужно будет создать новый DAO или расширить существующий, но никак не писать SQL, скажем, на уровне презентации.
Что бы стало еще понятнее, добавлю, что речь пойдет о том же, о чем писал «классик» — Patterns of enterprise application architecture by M. Fowler. Читать полностью »
Укрощение интерфейсов или один доклад на Wake Up Province
2014-10-27 в 9:01, admin, рубрики: usability, интерфейсы, интерфейсы и юзабилити, как убедить заказчика, Проектирование и рефакторинг, проектирование интерфейсов
25 октября прошла вторая саратовская конференция веб-разработчиков Wake Up Province, где мне посчастливилось выступить докладчиком. Сегодня же я решил поведать хабрасообществу о своем докладе на ней — думаю, кому-то это может быть интересно. Тема, в общем-то, проста и неказиста: Почему компьютеры причиняют страдания и как объяснить это заказчику. Способы проектирования интерфейсов и принципы «прозрачной» разработки.
Доклад основан на собственном опыте применения в реальной разработке мыслей и выводов одного очень известного человека — Алана Купера. При этом многие наработки «взращены» мною самим, а некоторые — заимствованы с Хабра.
Под катом несколько облагороженный текст доклада и почти полтора десятка слайдов (~660Kb). Дабы не разрывать текст, слайды спрятаны в спойлеры.
Читать полностью »
MindStream. Как мы пишем ПО под FireMonkey. Часть 3. DUnit + FireMonkey
2014-10-23 в 0:04, admin, рубрики: Delphi, FireMonkey, FireMonkey mobile, tdd, Проектирование и рефакторингMindStream. Как мы пишем ПО под FireMonkey. Часть 3. DUnit + FireMonkey
Здравствуйте.
В этой статье я хочу познакомить читателей с процессом переноса VCL кода в FireMonkey. В стандартной поставке Delphi, начиная по-моему с версии 2009, проект DUnit идёт из коробки.
Однако писался он в далекие времена VCL. И хотя и позволяет тестировать код написанный для FireMonkey (Благодаря консольному выводу), но у него нет «няшного» GUIRunner'a, к которому многие из нас привыкли, ведь в нём очень быстро и легко можно «убрать» те тесты которые мы не хотим запускать «именно сейчас».

Язык Go: реабилитация императивного программирования
2014-10-20 в 8:36, admin, рубрики: паттерны проектирования, Программирование, Проектирование и рефакторингПрактически все современные языки программирования включают в том или ином виде объектно-ориентированные возможности, тем не менее, авторы языка Go постарались максимально ограничиться императивной парадигмой. Это не должно вызывать удивление, если учесть что одним из авторов языка является Кен Томпсон (разработчик UNIX и языка С). Такая ярко–выраженная императивность языка может ввести опытного объектно-ориентированного программиста в некоторое недоумение и посеять сомнения насчёт возможности решения современных задач на таком языке.
Эта статья призвана помочь программистам, заинтересовавшимся в Go, разобраться в императивных особенностях языка. В частности, помочь реализовывать ключевые паттерны проектирования. Кроме этого, будут приведены некоторые интересные решения реализованные в самом Go, его стандартной библиотеки и инструментарии, которые приятно удивят многих.
Читать полностью »
Миф о идеальном количестве строк в методе
2014-10-09 в 8:11, admin, рубрики: Программирование, Проектирование и рефакторинг, проектирование по Существует миф, что если в функции больше чем n или меньше чем m строк кода, то с функцией есть проблемы в плане проектирования. К примеру, автор публикации «Размышления о принципах проектирования» говорит, что «число строк метода… является необходимым, но недостаточным условием хорошего дизайна». В этой статье я изложу причины, по которым считаю необходимость функции быть определенного размера мифом и приведу примеры, доказывающие это, но сначала давайте рассмотрим причины популярности этого мифа.
Читать полностью »
Как правильно разрабатывать API с поддержкой обратной совместимости. Семинар в Яндексе
2014-09-21 в 8:37, admin, рубрики: api, архитектура, Блог компании Яндекс, обратная совместимость, Проектирование и рефакторингПривет! Меня зовут Сергей Константинов, в Яндексе я руковожу разработкой API Карт. Недавно я поделился опытом поддержки обратной совместимости со своими коллегами. Мой доклад состоял из двух неравных частей. Первая, большая, посвящена тому, как правильно разрабатывать API, чтобы потом не было мучительно больно. Вторая же про то, что делать, если вам нужно что-то рефакторить и не сломать по дороге обратную совместимость.
Если заглянуть в Википедию, то про обратную совместимость там будет написано, что это сохранение интерфейса системы при выпуске новых версий. На самом деле, для конечных пользователей обратная совместимость означает, что код, написанный для предыдущей версии системы, работает функционально так же и в следующей версии.
Для разработчика обратная совместимость в первую очередь подразумевает, что единожды принятое обязательство предоставлять какую-либо функциональность невозможно отменить, исправить или перестать поддерживать.
Читать полностью »
RabbitMQ — Отложенные сообщения
2014-09-04 в 8:53, admin, рубрики: perl, RabbitMQ, Веб-разработка, отложенные сообщения, Проектирование и рефакторинг 
На Хабре имеется серия переводов официального руководства по RabbitMQ (1, 2, 3, 4, 5). К сожалению, в официальном руководстве не рассматривается вопрос организации отложенный сообщений, а я считаю этот вопрос весьма важным. Поэтому я решал сам написать такую статью.
Примеры кода будут на Перле, но никаких специфических для Перла деталей в коде не будет, поэтому примеры могут быть сравнительно легко адаптированы для любого другого языка.
