cLean Architecutre

Created by niquola / @niquola
hospital-systems/waveaccess
2013

Teamlead @ hospital-systems

github/niquola / @niquola

Ruby on Rails

это прекрасный инструмент
для быстрого создания веб-приложений!

Взаимодействия с пользователем
через контоллер

Не сложная бизнес логика

укладывается в моделях

и модель не лопнет при этом

Не сложная предметная область

Преждевременное моделирование не укусит

Моделировать сложно и исправлять модели болезненно

All problems in computer science can be solved by another level of indirection... Except for the problem of too many layers of indirection.


David Wheeler

Выносим за скобки контроллеры и вьюхи

Создаем новый слой - Use Cases

Он будет координировать взаимодействие с пользователем


by Uncle Bob

System = Простой Ruby Object

можно посылать сообщения комманды и запросы

Incapsulation

скрыть грязные секреты

Behaviour Driven

Важнее то как система себя ведет,
нежели то как она устроена

Use Case

Последовательность взаимодействий с системой направленная на достижение цели

Взаимодействия с системой = вызов методов

             
              system.identification_use_case.tap do |s|
                confirmation_key = nil

                s.listen :sign_up do |ev|
                  confirmation_key = ev.confirmation_key
                end

                s.sign_up!(email, password)
                s.confirm!(confirmation_key)

                session_key = s.sign_in!(email, password)
                s.session_active?(session_key).should be_true

                s.sign_out!(session_key)
              end
             
           

TDD mantra:

Red, Green and Refactor

             
              system.identification_use_case.tap do |s|
                confirmation_key = nil

                s.listen :sign_up do |ev|
                  confirmation_key = ev.confirmation_key
                end

                s.sign_up!(email, password)
                s.confirm!(confirmation_key)

                session_key = s.sign_in!(email, password)
                s.session_active?(session_key).should be_true

                s.sign_out!(session_key)
              end
             
           

Преждевремменное моделирование сложной предметной области

корень множества проблем


niquola

good architecture maximizes
the number of decisions not made


Robert Martin (Uncle Bob)

Выпрямление

процесса разработки

Top-Down

  • User Story
  • Use Case in code
  • Prototype
  • Implementation
  • Refactoring

Прототипирование

           
            class IdentificationSystem
              def sign_up(email, password)
                emit :sign_up, users[email] = {
                  email: email,
                  password: password,
                  confirmation_key: rand(100)
                  status: :not_confirmed
                }
              end

              def users
                @users ||= {}
              end
            end
           
         

Domain Driven Design?

вооружившись пониманием и тестами

Refactoring to deeper insight

Итого

Мы свели интерфейс нашей системы к ruby объекту

Мы явно видим, что делает система

Мы можем повторно использовать его для разных интерфейсов

Мы можем легко сделать прототип

Мы можем покрыть его специфакацией/контрактом

Мы можем менять реализацию

Эти идеи в активной разработке

Интересуйтесь и подключайтесь!

join on github

Спасибо за внимание

Вопросы?