Наблюдая за дебатами о дизайне на работе, я был поражен отсутствием конкретных отзывов о предлагаемых альтернативах. Данные не исключают из разговора политику и личность, но (и здесь, возможно, я наивен) обратная связь не повредит. Если это я в комнате, я бы хотел услышать что-то более конкретное, чем «Мне не нравятся фабрики адаптеров».

Когда я меняю поведение программы, я могу (ну, я должен быть в состоянии) получить немедленную обратную связь от тестов о том, изменилось ли поведение так, как я ожидал, и только так, как я ожидал. Что означало бы создать аналогичный цикл поминутной обратной связи для структурных изменений?

Хороший дизайн

Хороший дизайн - это тот, который позволяет изменить поведение в будущем. Если бы нам нужно было выбирать между двумя проектами, имея бесконечные ресурсы, мы бы просто реализовали их оба и посмотрели, какие из них позволят внести необходимые изменения в поведение в будущем.

У нас нет бесконечных ресурсов, но иногда мы можем немного поиграть в эту игру. «Вы знаете, что мы только что сделали болезненное изменение в поведении? Если бы дизайн был таким-то и таким-то, это было бы изменение одним файлом ».

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

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

Немедленная обратная связь?

Можно ли незамедлительно дать отзыв о качестве недавно завершенных структурных изменений? Может быть. Вот пример.

Допустим, у нас есть дублированный фрагмент кода. Если мы изменим один фрагмент, чтобы изменить поведение (BΔ), то нам придется изменить и другой.

После изменения структуры (SΔ) извлечения общего вспомогательного метода эквивалентное изменение поведения (BΔ ’) может быть выполнено путем изменения вспомогательного метода.

Вот вопрос: учитывая BΔ и SΔ, при каких условиях мы можем автоматически получить BΔ ’? Мне кажется, что это в целом трудноразрешимо (рад, что я ошибаюсь), но можно ли это сделать для полезного подмножества изменений?

Изменения в структуре подсчета очков

Если мы можем определить, каким было бы изменение поведения, если бы изменение структуры уже было применено, то мы можем сравнить изменение поведения с изменением структуры и без него. Как выглядит эта функция подсчета очков?

  • Чем меньше мест для переодевания, тем лучше (уменьшенная связь в приведенном выше примере).
  • Лучше меньший «промежуток» изменений. Для системы, организованной иерархически, чем ближе общий предок изменений, тем лучше. (Один аромат сплоченности)

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

Изменения в структуре тестирования

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

Скажем, я извлекаю метод. Среда отвечает: «4 исторических изменения поведения улучшили бы оценки на основе этого изменения». Или: «3 изменения будут улучшены, а 6 изменений оценены ниже». Мне этот отзыв кажется полезным.

Некоторые изменения поведения не будут применены. Для некоторых изменений поведения изменение структуры не имеет значения. Хорошо. Я хочу получить обратную связь, а не идеальный ответ.

Предостережения

Описанный здесь подход к изменению структуры тестирования имеет множество ограничений. Он задуман как «лучше, чем ничего / спор», а не как последнее слово (хотя намеки на ML, предлагаемые функцией фитнеса, интригуют). Вот некоторые из ограничений.

  • Post hoc. Мы можем оценивать только те изменения в поведении, которые мы уже внесли, а не те изменения, которые мы собираемся внести. Будущее имеет тенденцию быть похожим на прошлое, за исключением тех случаев, когда это не так.
  • Скалолазание. Я могу представить себе блоки структурных изменений, ранние части которых ухудшают оценки, пока последние изменения не улучшат их значительно. Не уверен, что это действительно произойдет, но есть на что обратить внимание.
  • Гольф. Лучшая конструкция системы не обязательно должна снижать совокупную оценку всех изменений поведения, если такая конструкция ограничивает тех, кто вносит изменения в поведение, теми, кто построил систему. «Умный» имеет свою цену, которая может того стоить, а может и не стоить.
  • Закон Гудхарта. Баллы должны информировать индивидуальное решение. Как только вы сгенерируете число, кто-то, кто не уверен в своих решениях, будет оценивать это число вместо того, чтобы смотреть на территорию.