Skip to content

Границы по файлам не спасают от расхождения интерфейса: две пчелы, разные файлы, сломанная сборка #1111

Description

@gHashTag

Часть #1090.

Что случилось

Две пчелы работали параллельно с непересекающимися границами:

#1110 сделала baseBranch() возвращающим String? — именно то, что требовал критерий: если ветка по умолчанию не определяется, PR не открывать. Место вызова находится в ChatViewModel.swift, то есть в границе другой пчелы. Обе поступили правильно, ни одна границу не нарушила, сборка сломана:

rings/SR-02/ChatViewModel.swift:4142: error: value of optional type 'String?'
must be unwrapped to a value of type 'String'

Что это значит

Правило одного владельца на путь защищает от конфликта записи. От конфликта интерфейса оно не защищает вообще: смена сигнатуры в своём файле ломает чужой, и заметить это может только сборка, которой в цикле пчелы нет.

Это станет обычным делом ровно по мере того, как параллельность начнёт работать.

Возможные направления

  • Собирать объединённое состояние перед приёмкой, а не только каждую ветку отдельно.
  • Считать смену публичной сигнатуры особым случаем: такая задача не идёт параллельно с задачами, чьи границы содержат вызовы.
  • Разрешать пчеле правку чужого файла, если она вынуждена изменением своего, но помечать это явно.

Выбор направления — часть задачи; ни одно не очевидно.

Готово, когда

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

Что уже сделано

Новый файл: чистое правило, решающее, расходятся ли две ветки по интерфейсу.
Сам сторож уже есть — runInterfaceDivergenceWatchdog в ChatViewModel
собирает объединённое дерево перед приёмкой, и первое из трёх направлений
выше тем самым закрыто. Не закрыт второй критерий: drift-guard судит
рассогласование между двумя времянками, которые строит сам, а не между двумя
состояниями ЭТОГО дерева, поэтому возврат прежнего поведения его не двигает.

Правило выносится в SR-00 отдельным файлом, потому что там оно проверяемо
однофайловым набором и не требует трогать ChatViewModel, которым владеют
другие задачи.

Границы

  • rings/SR-00/QueenInterfaceDivergence.swift

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions