В этой статье мы рассмотрим, как писать чистый, легко тестируемый код в функциональном стиле, используя паттерн программирования Dependency Injection. Бонусом идет 100% юнит-тест coverage.
Рубрика «Проектирование и рефакторинг» - 20
Размыкаем замыкания и внедряем Dependency Injection в JavaScript
2019-02-18 в 6:14, admin, рубрики: BIND, coverage, dependency injection, di, functional programming, javascript, jest, node.js, pool, Блог компании Developer Soft, Программирование, Проектирование и рефакторинг200 — это хорошо или это плохо?
2019-02-15 в 14:10, admin, рубрики: api, http, Анализ и проектирование систем, логи мои любимые, обработка ошибок, Проектирование и рефакторинг, работа в выходныеВ этой трехминутной статье я хочу затронуть наболевшую тему.
Речь пойдет о статус коде HTTP 200 и ошибках в ответе.
HTTP/1.1 200 OK
{
"error": {
code: 2019,
message: "Validation failed: field 'size' is invalid: the value is not a number"
}
}
Нормально ли возвращать такой код, если возникла ошибка?
Нет? Да? Ну-ка давайте разберемся.
Случай 1. HTTP 200 и batch операция
Допустим отправляется один запрос. Запрос выполняется успешно. Возвращаем код 200. Ответ не содержит информации об ошибке. С этим случаем всё предельно просто и понятно. А что делать если требуется выполнить batch операцию?
Читать полностью »
Подводные камни Java
2019-02-09 в 13:10, admin, рубрики: java, java 8, java se, java для начинающих, ошибки программирования, Программирование, Проектирование и рефакторингЗдравствуйте. Хочу представить вашему вниманию небольшую статью.
Цель данной публикации:
Показать наиболее часто встречающиеся ошибки начинающих и некоторые приемы их исправления. Понятно, что некоторые ошибки могут быть сложными и происходить по тем или иным причинам. Цель публикации в некоторой степени проанализировать их и помочь выявить на раннем этапе. Надеюсь данная публикация будет полезна.
Подводные камни Java
Все языки программирования имеют свои достоинства и недостатки. Это обусловлено многими причинами. Язык Java не исключение. Я попытался собрать некоторые очевидные и не очевидные трудности, с которыми сталкивается начинающий программист Java. Уверен, что опытные программисты тоже найдут в моей статье что-то полезного. Практика, внимательность и полученный опыт программирования, помогут избавить вас от многих ошибок. Но некоторые ошибки и трудности лучше рассмотреть заранее. Я приведу несколько примеров с кодом и объяснениями. Многие объяснения вам станут понятны из комментариев к коду. Практика дает очень многое, так как некоторые правила не столь очевидны. Некоторые лежат на поверхности, некоторые скрыты в библиотеках языка или в виртуальной машине java. Помните, что java это не только язык программирования с набором библиотек, это еще и виртуальная машина java.
Для статьи я специально написал работающий код с подробными комментариями. Для написания статьи использовалась java 8. Для тестирования код java помещен в отдельные пакеты.
Пример: «package underwaterRocks.simple;»
С какими трудностями сталкиваются начинающие?
Опечатки
Бывает так, что начинающие программисты делают опечатки, которые трудно обнаружить с первого взгляда.
Пример кода:
Файл: «Simple.java»
Читать полностью »
Почему не взлетел портал недвижимости. Часть 2
2019-02-07 в 7:57, admin, рубрики: Программирование, продвижение, Проектирование и рефакторинг, Развитие стартапа, стартап, Управление продуктом, управление проектами, Управление проектомПродолжаю повествование о проекте Недвижимости, который пытался долго взлететь, но так и не взлетел. Пишу все как есть — личный опыт.
Читать полностью »
Lombok возвращает величие Java
2019-02-04 в 15:14, admin, рубрики: Grubhub, java, jvm, lombok, POJO, Проектирование и рефакторинг
Мы в Grubhub почти во всём бэкенде используем Java. Это проверенный язык, который за последние 20 лет доказал свою скорость и надёжность. Но с годами возраст «старичка» всё-таки начал сказываться.
Java — один из самых популярных языков JVM, но не единственный. В последние годы конкуренцию ему составляют Scala, Clojure и Kotlin, которые обеспечивают новую функциональность и оптимизированные функции языка. Короче говоря, они позволяют делать больше с более лаконичным кодом.
Читать полностью »
Кому эффективнее всего заниматься разводкой печатных плат?
2019-01-29 в 15:29, admin, рубрики: solidworks, Блог компании DassaultSystèmes, инженеры-схемотехники, конструктор изделий, печатные платы, проектирование, Проектирование и рефакторинг, проектирование печатных плат, схемотехникаДавайте вспомним, как распределялись обязанности специалистов в электронной промышленности лет 40 назад. Процесс делился на два основных этапа, первым из которых была разработка принципиальных схем, и занимались этим (да и до сих пор занимаются) инженеры-схемотехники. Многое с тех пор изменилось, но суть осталась той же. Читать полностью »
Рефакторинга много не бывает
2019-01-27 в 13:48, admin, рубрики: перевод, Программирование, Проектирование и рефакторинг, рефакторинг, Совершенный код, стиль программированияПривет! Представляю вашему вниманию перевод статьи "Refactoring — oops, I’ve been doing it backwards" автора Джастина Фуллера (Justin Fuller).
Я очень завишу от рефакторинга, и не боюсь признать это, но есть только одна проблема: я всегда делал это задом наперед. Видите ли, то, что я делал, можно было бы точнее описать как преждевременную абстракцию кода.
Мы все знаем о рефакторинге. Если вы прочитали хотя бы одну книгу по программированию или много времени сидите на Medium, то наверняка слышали об этом. Это важная концепция, которая делает код понятным, поддерживаемым и расширяемым.
Так почему рефакторинг не оправдал моих надежд?
Когда я писал свою последнюю библиотеку, мне потребовалось время, чтобы подумать об эволюции моего кода. Я понял, что до того, как у меня был полностью работающий продукт, и до того, как у меня были идеальные результаты моих модульных тестов, я преобразовал свой код в интерфейс, хотя не был даже уверен в том, понадобится-ли он мне. Я переместил код, сделал его расширяемым, многоразовым, но почему? Этот код даст мне окончательный результат, который мне нужен? Этого я еще не знал.
В конце концов, все получилось, но был ли мой код более сложным, чем нужно? Думаю, что да.Читать полностью »
О сущностях, DTO, ORM и Lazy Load
2019-01-24 в 16:47, admin, рубрики: .net, C#, DDD Lazy Load ORM, Проектирование и рефакторинг, Разработка веб-сайтовОбъектно-ориентированная парадигма — стандарт для прикладного ПО. Реляционные СУБД — стандарт хранения данных в прикладном ПО. Да, можно писать и на Haskell и хранить данные исключительно в ClickHouse. Но речь о мейнстриме.
ORM позволяет натянуть сову на глобус сделать вид, что RDBMS'а нет и данные хранятся в объектной модели, более подходящей для ООП. Остается «маленькая» такая проблемка — эта абстракция, как и многие другие, «течет». Там где в объектной модели ссылка на другой объект в базе данных foreign key и id. В момент материализации сущности мы встаем перед выбором:
- Загрузить все и упасть с out of memory / timeout
- Явно указать какие зависимости мы хотим загрузить, а какие — нет и нарушить принцип tell don't ask
- Загружать зависимости неявно по требованию с помощью Lazy Load и получить проблемы с производительностью где-то в вызываемом коде
Какую-же ногу себе отрезать: левую или правую?
TLDR Lazy Load не так плох, если использовать только для записи и не использовать при чтении. Но все не так просто и есть куча нюансов.
Читать полностью »
Как победить дракона: переписываем вашу программу на Golang
2019-01-24 в 6:10, admin, рубрики: dapp, Go, golang, ruby, werf, Анализ и проектирование систем, архитектура, Блог компании Флант, ооп, переписывание, Программирование, Проектирование и рефакторинг, проектирование по, рефакторингТак случилось, что ваша программа написана на скриптовом языке — например, на Ruby — и встала необходимость переписать ее на Golang.
Резонный вопрос: зачем вообще может понадобится переписывать программу, которая уже написана и нормально работает?
Разработка команды запроса данных из базы — часть 4, завершающая
2019-01-18 в 15:37, admin, рубрики: javascript, tdd, гибкое проектирование, Проектирование и рефакторинг, рефакторингЭто продолжение истории, которая началась здесь, а продолжалась здесь и здесь.
В прошлой части я написал интеграционный тест, демонстрирующий процесс инициализации и выполнения полного набора обработчиков, извлекающих данные из базы. Но поскольку от написания этого теста, до его запуска, может пройти слишком длительное время, необходимое для кодирования не только обработчика, но и правил настройки для всех необходимых запросов к базе, то сегодня я решил реализовать его модульную версию, расчитанную на конфигурирование и запуск всего одного обработчика. Выглядит это тест вот как:Читать полностью »