Обновить
12.18

Проектирование и рефакторинг *

Реорганизация кода

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

Проектирование программного обеспечения

Время на прочтение5 мин
Количество просмотров134K
Если бы мы запланировали статью, которая не будет никому интересна, то наверное написали про важность проектирования зданий перед их постройкой. Но, к счастью, любой человек понимает, почему не стоит строить дома на глазок, добавляя фичи прямо в процессе строительства. При разработке же программного обеспечения по-прежнему полезно напоминать о том, что начинать её следует с проектирования — т.е. с полного планирования того, что непосредственно нам придётся разрабтывать, в какие сроки, с какими исходными данными и ожидаемым результатом.



За 13 лет опыта компании «Эдисон» в аутсорс-разработке для средних и крупных компаний из России, США, Европы и Австралии мы выработали собственную схему проектирования ПО, о которой в этом посте и расскажем.
Читать дальше →

По итогам Rambler.iOS #4

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


В прошлый четверг на уютной мансарде компании Rambler&Co прошла четвертая встреча iOS разработчиков Москвы.
Читать дальше →

Техобслуживание кода. Как «продать» рефакторинг бизнесу

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

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

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

Управление сложностью в проектах на ruby on rails. Часть 2

Время на прочтение7 мин
Количество просмотров11K
В предыдущей части я рассказал про представления. Теперь поговорим про контроллеры.
В этой части я расскажу про:
  • REST
  • gem responders
  • иерархию контроллеров
  • хлебные крошки

Контроллер обеспечивает связь между пользователем и системой:
  • получает информацию от пользователя,
  • выполняет необходимые действия,
  • отправляет результат пользователю.

Контроллер содержит только логику взаимодействия с пользователем:
  • выбор view для отображения данных
  • вызов процедур обработки данных
  • отображение уведомлений
  • управление сессиями

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

Читать дальше →

Python 3.5; async/await

Время на прочтение5 мин
Количество просмотров293K
Тихо и незаметно (с), вышел Python версии 3.5! И, безусловно, одно из самых интересных нововведений релиза является новый синтаксис определения сопрограмм с помощью ключевых слов async/await, далее в статье об этом.

Поверхностный просмотр «PEP 0492 — Coroutines with async and await syntax» поначалу оставил у меня вопрос «Зачем это надо». Сопрограммы удовлетворительно реализуются на расширенных генераторах и на первый взгляд может показаться, что все свелось к замене yield from на await, а декоратора, создающего сопрограмму на async. Сюда можно добавить и возникающее ощущение, что все это сделано исключительно для использования с модулем asyncio.

Но это, конечно же, не так, тема глубже и интереснее.
Читать дальше →

Старый код: почему он такой

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

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

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

Управление сложностью в проектах на ruby on rails. Часть 1

Время на прочтение5 мин
Количество просмотров20K
В этой серии статей я соберу бОльшую часть своего опыта разработки на Ruby on Rails. Эти методики позволяют контролировать сложность и облегчают сопровождение проекта. Большинство из них придумал не я, и, по возможности, буду указывать источник.

Основная проблема проектов на RoR в том, что, как правило, всю логику пытаются уместить в модели, контроллеры и представления. Т.е. код находится только в моделях(ActiveRecord::Base), контроллерах, хэлперах и шаблонах. Такой подход приводит к печальным последствиям: код становится запутанным, долго делаются фичи, появляются регрессии, у разработчиков пропадает мотивация. В качестве примера можно посмотреть на исходники redmine.

Выход из данной ситуации довольно-таки очевидный. Будем делать проекты не на ruby on rails, а с использованием ruby on rails. Как это будет выглядеть: мы никуда не уходим от MVC и Rails, просто пересмотрим Model, View, Controller. Для начала расширим понятие модели. Модель — это не просто класс-наследник ORM. Модель — это вся бизнес логика приложения. Модель включает в себя: модели, сервисы, политики, репозитории, формы и другие элементы, которые я опишу далее. Так же расширим представления. Представления — это шаблоны, презентеры, хелперы, билдеры форм. Контроллеры — это все то, что связано с обработкой запросов: контроллеры, responders.
Читать дальше →

Рефакторинг схем баз данных

Время на прочтение19 мин
Количество просмотров20K
Я хочу рассказать о рефакторинге схем баз данных MS SQL Server.

Рефакторинг — изменение во внутренней структуре программного обеспечения, имеющее целью облегчить понимание его работы и упростить модификацию, не затрагивая наблюдаемого поведения.
— Martin Fowler

О рефакторинге кода говорят уже давно. На данный момент написано немало литературы, создано множество инструментов, помогающих выполнять рефакторинг кода.
А вот про рефакторинг схем баз данных не так уж и много информации. Я решил немного восполнить этот пробел и поделиться своим опытом.
Читать дальше →

Легко переходим на векторный формат картинок вместо нарезки под разные плотности экранов в Android 4.0+. Часть 2 из 2

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


В предыдущей части мы обсудили библиотеку BetterVectorDrawable, реализующую VectorDrawable для Android 4.0+.
В этой части речь пойдет о преобразовании изображений из SVG в vector drawable XML.
Читать дальше →

Легко переходим на векторный формат картинок вместо нарезки под разные плотности экранов в Android 4.0+. Часть 1 из 2

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


Обычно дизайн приложения рисуется в векторном редакторе (например, Sketch), но типичным форматом картинок в приложении под Android является растровый (как правило, PNG). При разработке приложения необходимо для каждого векторного изображения заниматься утомительной работой по изготовлению набора растровых картинок для разных плотностей экранов. Количество таких комплектов может доходить до шести по числу возможных плотностей: ldpi, mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi (плотность xxxhdpi необходима только для иконки приложения). При верстке иногда приходится задать в разметке явные размеры для изображения, что может потребовать перемасштабирования растровой картинки, а это, в свою очередь, наверняка приведет к появлению артефактов. К тому же наличие нескольких комплектов картинок отрицательно сказывается на размере выходного apk.
Читать решение...

В поисках аналога функций первого порядка в СУБД Caché

Время на прочтение20 мин
Количество просмотров3.6K
Пост написан в дополнение к статье Декларативная разработка на Caché.

[2, 3, 5, 7, 11, 13, 17].forEach(function(i) {
  console.log(i);
});

Как делать такое в Caché с помощью COS?
Под катом несколько упражнений на заданную тему.
Читать дальше →

Пишем реализацию Observer-а над KVO на objective-c

Время на прочтение6 мин
Количество просмотров7.3K
Добрый день, хабрачитатели. Спешу поделиться с вами опытом, недавно мной полученным.


Почему в этом есть нужда?

Как вы, наверное, знаете — создание более менее внятных и серьезных приложений не может обойтись без грамотного проектирования. Одними из основных задач современного программирования — являются контроль над сложностью, требования создания гибких и расширяемых, изменяемых приложений. Из этого вытекают концепции ортогонального программирования, максимального уменьшения связности между классами, использования наиболее подходящих архитектурных решений (алсо грамотные подходы создания архитектуры проекта, подходы к проектированию классов). За многие человекочасы и человекодни мирового опыта всех разработчиков — были выработаны наиболее естественные и удачные подходы, названные паттернами проектирования… А подходы к проектированию классов — могут в некоторой степени изменяться, в зависимости от используемого языка программирования и требуемых свойств объекта. Описываемый сегодня мной паттерн является одним из моих самых любимых (и вообще достаточно значимый), а именно встречайте:… "Observer" (по-русски — Наблюдатель). Исходя из последних двух предложений — вытекает название этой статьи.
Читать дальше →

Краткая история появления Mathematica

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

Перевод поста Стивена Вольфрама (Stephen Wolfram) "There Was a Time before Mathematica…".
Выражаю огромную благодарность Кириллу Гузенко KirillGuzenko за помощь в переводе.

Через несколько недель [пост был написан 6 июня 2013 г. — прим. ред.] будет двадцатипятилетний юбилей: 23 июня 1988 года — день, когда была выпущена Mathematica.

Поздней ночью мы все ещё записывали дискеты и упаковывали их. Однако уже в полдень 23 июня я был в конференц-центре в Санта-Кларе, впервые показав публике Mathematica:

Mathematica 1.0 на Macintosh


Да, именно таким был загрузочный экран, и да, Mathematica 1.0 работала на маках и различных рабочих станциях на Unix; PС тогда не хватало мощности.

Многие оказались под впечатлением от того, что может делать Mathematica. И были очень приятные речи о перспективах Mathematica от различных лидеров компьютерной индустрии, в числе которых был и Стив Джобс (тогда он был в NeXT'е), который был весьма любезен, чтобы прийти, хоть он и не появлялся на публике в течение некоторого времени. А кто-то на этом мероприятии был достаточно дальновиден, чтобы попросить всех выступающих расписаться на книге о Mathematica, которая только поступила в продажу в тот день в книжных магазинах по всей стране:


Читать дальше →

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

Разговор со спикерами FPConf (часть 2)

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

Конференция FPConf уже завтра, сегодня последний шанс купить билет и присоединиться! Регистрация — тут.

Накануне мы решили задать нашим спикерам один довольно неоднозначный вопрос. Большая часть ответов была опубликована вчера — тут

А сегодня мы получили ответ от нашего гостя Эдварда Кметта. Пока публикуем без перевода, обновим пост после конференции.

image

Вопрос был такой:

В объектно-ориентированных языках есть широко известный список паттернов проектирования (design patterns) от «Банды четырех» (Gang of Four). В функциональных языках такого известного списка не существует. С вашей точки зрения, почему так?
Подобные паттерны не нужны при программировании на функциональных языках или просто их канонический список еще не сложился?


Читать дальше →

Управляем зависимостями в iOS-приложениях правильно: Typhoon Tips & Tricks

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


В предыдущих частях цикла мы рассмотрели основные аспекты работы Typhoon и подготовились к полноценному применению его на практике. Тем не менее, помимо затронутых тем, фреймворк предоставляет большое количество других функций.
Читать дальше →

Нотариальный лёд тронулся

Время на прочтение2 мин
Количество просмотров10K
5 августа 2015 года на сайте Федеральной нотариальной палаты (ФНП) опубликовано сообщение, достойное внимания всех разработчиков. ФНП объявила конкурс на разработку новой Единой информационной системы нотариата РФ (ЕИС).

В соответствии с Основами законодательства Российской Федерации о нотариате, ЕИС это автоматизированная информационная система, которая должна обеспечить комплексную автоматизацию всех процессов нотариальной деятельности и обеспечить информационное взаимодействие нотариусов с различными государственными структурами. В состав ЕИС законодатели включили:

  • электронный реестр нотариальных действий, который к 2018 году должен заменить нотариусам бумажный реестр и позволит перевести в электронную форму часть информации, которую в соответствии с законодательством можно будет предоставить госорганам и иным организациям
  • электронный реестр открытых наследственных дел, который позволит обращаться за оформлением наследства к любому нотариусу региона, в котором проживал наследодатель, и развивает принцип «наследство без границ»
  • также, в составе ЕИС находится реестр уведомлений о залогах движимого имущества, позволяющий перед покупкой, например автомобиля, выяснить не находится ли он в залоге, и таким образом избежать ситуации, когда приобретённый заложенный автомобиль могут отнять у нового владельца.

Читать дальше →

Code contracts vs валидация входящих данных

Время на прочтение4 мин
Количество просмотров13K
Правила валидации входящих данных часто принимают за контракты в коде (как, собственно, и наоборот). Давайте разберемся в чем отличие между этими двумя понятиями и в каких случаях они применимы.
Читать дальше →

Пишем maintainable код

Время на прочтение8 мин
Количество просмотров47K
У нас сотни программных проектов на поддержке, некоторые из них поддерживаются нами почти десять лет. Нетрудно догадаться, что понятие maintainable кода (переведу это понятие как код, легкий в поддержке) является у нас одним из основных. По счастливому стечению обстоятельств легкий в поддержке код также является и легким для (unit-)тестирования, легким для освоения новыми членами команды и т.д. Скорее всего, это связано с тем, что для создания maintainable кода приходится озаботиться хорошей архитектурой проекта и завести несколько хороших привычек.
В этой статье и поговорим о таких привычках, благодаря которым часто хорошая архитектура получается сама собой. Постараюсь также иллюстрировать все хорошими примерами.

Читать дальше →

Как правильно использовать исключения

Время на прочтение6 мин
Количество просмотров49K
Использование исключений для контроля хода выполнения программы (flow control) — давняя тема. Я хотел бы суммировать этот топик и привести примеры правильного и неправильного использования исключений.
Читать дальше →

Исследование Oracle Form при помощи Java Development API(JDAPI)

Время на прочтение2 мин
Количество просмотров8.1K
Для поиска зависимости форма от обьектов базы данных мне нужно было разобрать файл Oracle Form(в дальнейшем — fmb файл).
Fmb — это псевдотекстовый файл, если очень нужно, PL/SQL код можно увидеть и искать как используются обьекты БД там, но все равно трудно понять тип триггера или программы и к какому элементу формы он относится. Можно использовать конвертацию в FMT, но не думаю, что разбор fmt файла легче чем использование API, который дает Оракл.
Тем более, что вся остальная часть моей программы была написана в Java Swing, логичней было использовать JDAPI, который позволяет разобрать форм по полочкам и видеть весь код PL/SQL и properties, которые меня интересовали.
Читать дальше →