Марсоход, Введение

Автор оригинала: Loïc Faugeron
  • Перевод
  • Tutorial


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

  • 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
    Марсоход, на php… я уже достал попкорн )
      0
      ага, и марсоход про плис уже был http://marsohod.org
        +1
        А вы отчаянный.
        0
        Положение состоит из координат (X и Y, являющихся целыми числами) и ориентации (строковое значение north, east, west или south).

        И тут внезапно становится ясно, что это всего лишь симулятор марсохода, а не


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

        как написано в спецификации.

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

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

                0
                Для GPS надо созвездие спутников и привязка по эталону на Земле. Тоже не сработает.
            +1
            конечные точки/задачи только для чтения или только для записи

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

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


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

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

              Самое читаемое