Открыть список
Как стать автором
Обновить
  • по релевантности
  • по времени
  • по рейтингу

God object. Анализ сложных проектов

Ненормальное программирование.NET

Введение


Ни для кого не секрет, что такой архитектурный антипаттерн как God object препятствует эффективному поддерживанию кода проекта. Однако его все равно можно встретить в Legacy-системах корпоративного сектора. Со временем код становится настолько сложным, что изменить его функциональность, даже при наличии Unit-тестирования, становится большой проблемой. Такие системы никто не хочет поддерживать, все боятся что-либо улучшать, количество проблем в трекере держится постоянным числом, но может и расти. Как правило, у команды упавшее настроение, которое со временем становится чемоданным: все хотят свалить.
Иллюстрация проблемы
Читать дальше →
Всего голосов 35: ↑30 и ↓5 +25
Просмотры5.5K
Комментарии 18

ActiveRecord vs DAO – Тест потребления памяти и скорости выполнения запросов

Блог компании АрнионТестирование IT-систем
Recovery mode
В процессе роста и развития проекта «АвтоОфис — Прием платежей и полная автоматизация продаж» мы столкнулись с тем, что при появлении клиентов имеющих у себя в базах более 100 000+ контактов, одна из основных функций, отвечающих за создания и отправку массовых email-рассылок по базе клиентов данных интернет-магазинов стала безбожно тормозить.

Покопавшись в коде, было выявлено, что при выборках данных, насчитывающих 100 000+ записей из таблиц MySQL с использованием класса ActiveRecord, сильно увеличивается потребление оперативной памяти и времени отработки скриптов. Доходило до того, что одна переменная, хранящая в себе результат выборки из 100 000 записей, потребляла 644 750 972 байт (614 Мб) оперативки, а время выполнения скрипта превышало 50 секунд.

Т.к. 100 000 записей, это мягко говоря, не предел мечтаний, и количество клиентов сервиса АвтоОфис уже давно исчисляется тысячами, мы не могли оставить данную проблему без внимания и не принять меры по её устранению. В итоге описанная выше функция была полностью переписана на выборки с использованием широко известного DAO, что существенно снизило расход ресурсов и увеличило скорость выполнения скрипта.

В процессе перехода наши программисты не поленились и сделали несколько тестов, наглядно показывающие сравнительные характеристики использования ActiveRecord и DAO при попытке выборки из БД MySQL 1, 5, 10, 50, 100, 500, 1 000, 5 000, 10 000, 50 000 и 100 000 записей. С результатами данных тестов и предлагаю Вам ознакомиться прямо сейчас.
Читать дальше →
Всего голосов 29: ↑9 и ↓20 -11
Просмотры6.2K
Комментарии 21

Разработка веб-приложения

Разработка веб-сайтовJavaБиблиотека ExtJS/Sencha
Tutorial
Привет, Хабр!

При изучении технологий Ext JS и Java, написал web-приложение «Каталог автомобилей». Хочу поделиться с Вами этим опытом.

Вид и функциональность приложения


  • Добавление;
  • Удаление;
  • Редактирование;
  • Поиск;
  • Валидация данных;


Читать дальше →
Всего голосов 77: ↑34 и ↓43 -9
Просмотры90.1K
Комментарии 19

StorIO — человеческий API для работы с SQLiteDatabase и ContentResolver

Разработка мобильных приложенийРазработка под Android
Не секрет, что API SQLiteDatabase и ContentResolver — отстой, поэтому многие стараются от них абстрагироваться. Кто-то выбирает ORM, кто-то DAO, кто-то пишет своё.

За долгие годы Android разработки мы прошли через все эти этапы: ORM часто становится узким местом в критический для проекта момент, своё DAO требует тестирования и разработки, что отнимает много времени, которое можно было тратить на другие детали реализации приложения, готовые DAO в принципе решают вопрос, но различные библиотеки имеют свои плюсы и минусы (15стандартов.jpg), посмотрите, что предлагаем мы:

1. API для людей: удобные билдеры (помните 5-7 nullов в запросах?), читаемые и очевидные конструкции, Immutability и Thread-safety.
2. Упрощенный набор операций: вместо стандартного CRUD (Create-Read-Update-Delete или Insert-Select-Update-Delete) мы предлагаем три операции — Put, Get, Delete, при этом вы имеете полный контроль над их реализацией, можете, например, упороться и хранить один объект в нескольких таблицах и так далее.
3. Опциональный Type-Safe Object Mapping без Reflection, но если вы хотите работать с Cursor или ContentValues — пожалуйста.
4. Некая схожесть с Retrofit: вы можете выполнить любую операцию как блокирующий вызов либо как rx.Observable, мы можем добавить callback модель выполнения операций в будущем.
5. Reactive — Observable из Get операции будет получать уведомления об изменении таблиц в случае SQLite или Uri в случае ContentResolver, это позволяет полностью заменить лоадеры, API которых просто отвратителен.

Читать дальше →
Всего голосов 12: ↑12 и ↓0 +12
Просмотры12.9K
Комментарии 9

Data Access Object (DAO). Уровень класса

Разработка веб-сайтовJavaSQL
Из песочницы
При проектировании информационной системы выявляются некоторые слои, которые отвечают за взаимодействие различных модулей системы. Соединение с базой данных является одной из важнейшей составляющей приложения. Всегда выделяется часть кода, модуль, отвечающающий за передачу запросов в БД и обработку полученных от неё ответов. В общем случае, определение Data Access Object описывает его как прослойку между БД и системой. DAO абстрагирует сущности системы и делает их отображение на БД, определяет общие методы использования соединения, его получение, закрытие и (или) возвращение в Connection Pool.
Читать дальше →
Всего голосов 14: ↑4 и ↓10 -6
Просмотры106K
Комментарии 8

Забудьте о DAO, используйте Repository

ПрограммированиеJavaПромышленное программирование
Недавно задумался о том, чем отличаются паттерны, позволяющие абстрагироваться от работы с хранилищем данных. Много раз поверхностно читал описания и различные реализации DAO и Repository, даже применял их в своих проектах, видимо, до конца не понимая концептуальных отличий. Решил разобраться, закопался в Google и нашел статью, которая для меня разъяснила все. Подумал, что неплохо было бы перевести ее на русский. Оригинал для англочитающих здесь. Остальным интересующимся добро пожаловать под кат.
Читать дальше →
Всего голосов 28: ↑23 и ↓5 +18
Просмотры138.5K
Комментарии 14

Децентрализованое управление на базе блокчейна

Управление разработкойУправление проектамиУправление сообществомВенчурные инвестицииБизнес-модели
Перевод
image

В мире криптовалют все говорят о «Гражданской войне», и не о той, что развязалась между Капитаном Америкой и Железным человеком. Они говорят о гражданской войне в проекте Bitcoin, которая длится уже год. Это ожесточенное сражение за контроль над масштабируемостью.

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

С другой стороны, есть сторонники из лагеря Bitcoin Classic, которые хотят увеличить ограничение размера блока как минимум до 2 Мбайт. Пока побеждают Core, так как большая часть майнеров Bitcoin придерживается их варианта реализации проекта.

Эти разногласия подняли некоторые фундаментальные вопросы о природе децентрализованного проекта вроде Bitcoin. Кто же в итоге задает направление развития децентрализованного проекта? Кто принимает окончательные решения по разработке? Другими словами, как следует управлять подобным проектом?
Читать дальше →
Всего голосов 14: ↑11 и ↓3 +8
Просмотры8.8K
Комментарии 19

Криптовалюта Dash: полноценное DAO

Управление разработкойУправление проектамиУправление сообществомВенчурные инвестицииБизнес-модели
Перевод
image

Недавний стремительный взлёт основанного на децентрализованной платформе «Эфириум» проекта «The DAO (ДАО)» (в ходе запуска которого было собрано порядка 150 млн USD инвестиций), вызвал всеобщее воодушевление относительно концепции Децентрализованных Автономных Организаций. При этом для криптовалюты Dash существование в режиме ДАО — это уже “прошлогодний снег”. В этой переводной статье будут рассказаны подробности об этом.
Читать дальше →
Всего голосов 8: ↑3 и ↓5 -2
Просмотры3.8K
Комментарии 0

Криптовалюта Dash: Симбиоз человека и кода

Управление разработкойУправление проектамиВенчурные инвестицииРазвитие стартапаБизнес-модели
Перевод
image

Даже по меркам мира криптовалют проект “The DAO” недавно получил беспрецедентную огласку после релиза. Её рекламировали как истинно децентрализованную автономную организацию, The DAO обещала стать будущим смарт-контрактов. Тем не менее, несколько недель назад кто-то воспользовался уязвимостью в коде The DAO и переписал на себя свыше 3,6 миллионов токенов Эфира (т.е. на сумму более 60.000.000 USD по курсу на момент инцидента).

Многие средства массовой информации называли это «атакой», хотя с этим можно и не согласиться, если учесть, что программный код в “The DAO” является законом, а значит тот, кто пользуется уязвимостями кода, не сделал ничего незаконного и даже неэтичного.
Читать дальше →
Всего голосов 6: ↑3 и ↓3 0
Просмотры4.3K
Комментарии 34

Реформа SQL-ориентированного подхода в DAO

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

Вводная


Мне часто в проектах приходится сталкиваться с фреймворками по работе с БД. Концептуально, эти фреймворки можно разбить на 2 больших класса:

  • ORM-ориентированные
  • SQL-ориентированные

Некоторые из них хороши, какие-то не очень. Но субъективно могу сказать: SQL-ориентированные уступают в развитии ORM-ориентированным. Подчеркну, в развитии, а не в возможностях. Хоть изменить эту чашу весов и не получится, но предложить необычный взгляд на мир SQL-ориентированного подхода — вполне. Кому интересно, добро пожаловать под кат
Читать дальше →
Всего голосов 11: ↑11 и ↓0 +11
Просмотры11.2K
Комментарии 37

Путь Ethereum на передовую мира блокчейн

Блог компании WirexКраудсорсингФинансы в ITКриптовалюты
imageЗа последние 3 года развития Биткойна мы увидели появление многих инфраструктурных приложений, большую часть из которых составляли биржи и кошельки. Но на этом список практически значимых и по-настоящему новых разработок на базе Биткойн заканчивается. Чем же можно объяснить такую ситуацию?

Существует теория, которая заключается в том, что скриптовый язык Биткойн — та сама часть каждой биткойн-операции, которая позволяет вам запускать небольшую программу в ходе этой операции — слишком ограничена в возможностях. В этом контексте соучредитель Coinbase Фред Эсем (Fred Ehrsam) предлагает обратить внимание на Ethereum, появление которого, по его мнению, можно сравнить с изобретением полноценного компьютера, пришедшего на смену рассчитанному на 4 действия калькулятору по имени Биткойн. На первый взгляд нам в Wirex, финтех стартапе, предоставляющем услуги платежей и денежных переводов без банковского посредничества и с использованием blockchain, сравнение Эсема показалось немного грубоватым, но вынуждены согласиться, что такая точка зрения имеет право на жизнь. Кому нужны аргументы, приглашаем под кат.
Читать дальше →
Всего голосов 17: ↑12 и ↓5 +7
Просмотры17.2K
Комментарии 19

Учимся писать Waves смарт-контракты на RIDE и RIDE4DAPPS. Часть 1 (Многопользовательский кошелек)

ScalaХакатоны
Tutorial


Всем привет!


Совсем недавно Waves Labs анонсировал конкурс для разработчиков приуроченный к релизу в тестовую сеть расширения языка смарт-контрактов RIDE для децентрализованных приложений Ride4Dapps!


Мы выбрали кейс DAO, так как Ventuary планирует заниматься разработкой dApp с социальными функциями: голосованием, фандрейзингом, доверительным управлением и пр.


Мы начали работу с простого примера в Q&A-сессии и в RIDE IDE — примере с общим кошельком.

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

Учимся писать Waves смарт-контракты на RIDE и RIDE4DAPPS. Часть 2 (DAO — Decentralized Autonomous Organization)

ScalaХакатоны


Всем привет!


В первой части мы подробно рассмотрели как создавать и работать с dApp (децентрализованным приложением) в Waves RIDE IDE.


Давайте сейчас немного потестируем разобраный пример.


Этап 3. Тестирование dApp аккаунта

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

Помощник по работе с базами данных GreenPig

PHPMySQLOracle
Из песочницы
  1. Вступление
  2. Подключение библиотеки
  3. Класс Where
  4. Класс Join
  5. Класс Query

      ╔═══╗╔═══╗╔═══╗╔═══╗╔╗─╔╗────╔═══╗╔══╗╔═══╗
      ║╔══╝║╔═╗║║╔══╝║╔══╝║╚═╝║────║╔═╗║╚╗╔╝║╔══╝
      ║║╔═╗║╚═╝║║╚══╗║╚══╗║╔╗─║────║╚═╝║─║║─║║╔═╗
      ║║╚╗║║╔╗╔╝║╔══╝║╔══╝║║╚╗║────║╔══╝─║║─║║╚╗║
      ║╚═╝║║║║║─║╚══╗║╚══╗║║─║║────║║───╔╝╚╗║╚═╝║
      ╚═══╝╚╝╚╝─╚═══╝╚═══╝╚╝─╚╝────╚╝───╚══╝╚═══╝

                            5HHHG
                 HH       HHHHHHH
               9HHHA    HHHHHHHH5
              HHHHHHHHHHHHHHHHHH  9HHHHH5
            5HHHHHHHHHHHHHHHHHHHHHHHHHHH
           HHHHHHHHHHHHHHHHHHHHHHHHHHHH
         ;HHHHHHHHHHHHHHHHHHHHHHHHHHA
          H2   HHHHHHHHHHHHHHHHHHHHHH
               HHHHHHHHHHHHHHHHHHHHHHH9
                HHHHHHHHHHHHHHHHHHHHHHH
                AHHHHHHHHHHHHHHHHHHHHHH
                 HHHHHHHHHHHHHHHHHHHHH9  iHS
                  HHHHHHHHHHHHHHHHHHHHHHhh
                   HHHHHHHHHHHHHHHHHH
                  AA HHHHHHHHHHHHHH3
                 &H  Hi         HS Hr
                 &  H&          H&  Hi
Читать дальше →
Всего голосов 10: ↑9 и ↓1 +8
Просмотры2.1K
Комментарии 13

Java простое веб-приложения. Логин и регистрация

Разработка веб-сайтовJava
Из песочницы

Всем доброго времени суток.


Эта статья рассчитана для новичков в мире Web и Java. Мы рассмотрим стандартную архитектуру веб-приложения и сделаем небольшой проект с нуля.


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


Что будет делать приложение


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


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


Исходный код вы сможете найти здесь.

Читать дальше →
Всего голосов 20: ↑13 и ↓7 +6
Просмотры11.8K
Комментарии 20

Как мы в 2020 году изобретали процесс разработки, отладки и доставки в прод изменений базы данных

Блог компании QIWIPostgreSQLKotlinМикросервисыKubernetes
На дворе 2020 год и фоновым шумом вы уже привыкли слышать: «Кубернетес — это ответ!», «Микросервисы!», «Сервис меш!», «Сесурити полиси!». Все вокруг бегут в светлое будущее.

Подходы в том, что касается баз данных, в нашей компании более консервативны, чем в прикладных приложениях. Крутится база данных у нас не в кубернетесе, а на железе или в виртуалке. Для изменений базы данных процессинга платежных сервисов у нас есть устоявшийся процесс, который включает в себя множество автоматических проверок, большое ревью и релиз с участием DBA. Количество проверок и привлекаемых людей в этом случае негативно влияет на time-to-market. С другой стороны, он отлажен и позволяет надежно вносить изменения в продакшен, минимизируя вероятность что-то сломать. А если что-то сломалось, то нужные люди уже включены в процесс починки. Этот подход делает работу основного сервиса компании стабильнее.

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



Если хотите узнать, к каким проблемам это привело и как мы их порешали, — добро пожаловать под кат.
Читать дальше →
Всего голосов 36: ↑36 и ↓0 +36
Просмотры12.4K
Комментарии 34