Добро пожаловать в серию статьей «Марсоход», где мы будем использовать следующие практики:

  • Monolithic Repositories — MonoRepo (Монолитные репозитории)
  • Command/Query Responsibility Segregation — CQRS (Сегрегация ответственности на чтение и запись)
  • Event Sourcing — ES (События как источник)
  • Test Driven Development — TDD (Разработка через тестирование)

В этой вводной статье мы просто обозначим спецификации нашего марсохода.

Примечание. Этот пример является адаптированной для нужд серии статей версией упражнения, представленного на Dallas Hack Club, который сейчас, к сожалению, лежит.

Оглавление

Но сначала, давайте кратко пройдемся по упомянутым выше терминам.

Monolithic Repositories — MonoRepo (Монолитные репозитории)


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

Этот подход дает нам следующие преимущества:

  • навигация
  • управление зависимостями
  • удобство настройки
  • выполнение тестов

Однако, он также приносит и следующие недостатки:

  • нет жесткого разделения между пакетами
  • ограничения по масштабированию (размер на диске, пропускная способность)
  • отсутствует возможность точечной настройки доступов (пользователь получает все или ничего)

Такие репозитории имеет смысл делать для проектов, которые будут упакованы / выпущены вместе (хотя и самостоятельные репозитории не исключают подобной возможности)

Примечание. Вот несколько ссылок для дополнительного знакомства с монолитными репозиториями:


Command/Query Responsibility Segregation — CQRS (Сегрегация ответственности на чтение и запись)


CQRS — это о разделении логики «записи» и «чтения», и ее можно применять на многих уровнях, например:

  • read-only микросервисы и микросервисы на запись
  • конечные точки/задачи только для чтения или только для записи
  • разделение ваших моделей на две (опять же, только для чтения и только для записи)

Важно отметить, что CQRS также может быть частично применен в рамках проекта: используйте его только когда это действительно имеет смысл.

Примечание. Вот несколько ссылок о CQRS:


Event Sourcing — ES (События как источник)


С ES каждое значимое действие записывается как «событие». Отслеживание таких событий обеспечивает следующие преимущества:

  • воспроизведение событий для воссоздания состояния приложения на конкретный момент (откат, повтор, синхронизация)
  • анализ последнего пришедшего состояния (сравнение двух вариантов или поиск кто, что и когда сделал)

Как и с CQRS, важно отметить, что ES также может быть применен _частично_ в проекте: используйте его только когда есть необходимость.

ES часто ассоциируется с CQRS, но они могут использоваться и по отдельности.

Примечание. вот несколько ссылок об ES:


Test Driven Development — TDD (Разработка через тестирование)


TDD можно свести к трем шагам:

  1. создать тест
  2. написать достаточно кода, чтобы пройти тест (быстрого и грязного, или просто «заставить работать»)
  3. рефакторинг кода (создание чистого, «правильно работающего»)

Написание тестов до кода заставляет нас задуматься о том, как будущий код использовался бы. Это как писать спецификации, но сразу с тремя целями: проектирование, разработка документации и автоматизированная регрессионная проверка.

Такой подход легко позволяет иметь высокое покрытие кода (хотя, строго говоря, все равно нужно проверять все возможные пути кода, не только успешные).

Примечание. вот несколько ссылок о TDD:


Спецификации


Цель этой серии заключается в создании программного обеспечения марсохода, согласно следующим спецификациям:

Марсоход должен будет сначала приземлиться в заданном положении. Положение состоит из координат (X и Y, являющихся целыми числами) и ориентации (строковое значение north, east, west или south).

После всего этого он сможет ездить с помощью инструкций, таких как move_forward (сохраняя ориентацию, но двигаясь по оси x или y) или turn_left/turn_right (сохраняя те же координаты, но изменяя ориентацию).

Время от времени, он будет сообщать текущее местоположение (опять же x и y координаты и ориентацию).

Например, ровер может приземлился на 23, 42, north и затем получить инструкции двигаться вперед дважды, затем налево, а затем снова вперед. Когда будут запрошены координаты, он сообщит 22, 44, west.

Декомпозируем задачу


Из приведенных выше спецификаций, можно выявить как минимум три варианта использования:

  1. Посадка ровера на Марс
  2. Вождение
  3. Запрос местоположения

Что дальше


В следующей статье мы создадим проект и его первый пакет: navigation.

Примечание. Мы будем использовать:



Следующая часть: Марсоход, Инициализация
Поделиться с друзьями
-->

Комментарии (11)


  1. greabock
    08.11.2016 15:09
    +1

    Марсоход, на php… я уже достал попкорн )


    1. nckma
      08.11.2016 16:26

      ага, и марсоход про плис уже был http://marsohod.org


    1. zodchiy
      08.11.2016 16:35
      +1

      А вы отчаянный.


  1. BelBES
    16.02.2017 17:30

    Имхо, их вариант еще удобней, чем qwerty… т.к. у такой кейборды есть перспективы, что будет удобно пользоваться hotkey-ориентированными редакторами типа Emacs, а вот с йцукен-особо не понажимаешь хоткеи)


    1. AlexLysenko
      17.02.2017 10:34
      +1

      Поищи на на алиэкспресс по QWERTY mobile keyboard — море вариантов.
      Из интегрированных с телефоном — конёк блэкберри.
      Задняя крышка — для Jolla вроде профандилась успешно.
      Конечно, странно, что для мото Z не предлагают сделать слайдер-клавиатуру. Я бы даже сказал подозрительно. Но я уже написал, что меня мини-QWERTY мало интересует.


    1. a-tk
      09.11.2016 10:05

      Мне вот интересно, как будет определена ориентация его на местности? По Солнцу? По звёздам? По спутникам (естественным(? С магнитным полем на Марсе как-то туговато, а то, что есть, не даёт однозначной ориентации в пространстве.


      1. Akon32
        09.11.2016 10:32

        Например, GPS или аналогичная по сути локальная система на поверхности. Правда, земная GPS только позицию даёт.


        1. a-tk
          09.11.2016 10:47

          Для GPS надо созвездие спутников и привязка по эталону на Земле. Тоже не сработает.


  1. catanfa
    08.11.2016 22:56
    +1

    конечные точки/задачи только для чтения или только для записи

    По-моему, endpoints не стоит переводить как "конечные точки". Эндпоинты, или урлы апи… исконно русского варианта наверное нет.


    1. JhaoDa
      09.11.2016 02:28
      +2

      Точка входа?


  1. aso
    09.11.2016 10:05
    -1

    Положение состоит из координат (X и Y, являющихся целыми числами) и ориентации (строковое значение north, east, west или south).


    А почему не enum — или что там в php аналогичного существует?
    Ну или не int6 — ежели уж на то пошло (сверху можно прикрутить любое преобразование, хоть от строк в соотв. значения).