Статьи

Мое судно на воздушной подушке полно угрей

История из моего класса чистого кода. Класс упражнений вращается вокруг разных аспектов игры в крестики-нолики.

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

Люди знают игру и предполагают, что они точно знают, как им нужно ее кодировать. Большинство из них пропускают этап проектирования. Каждый раз это иллюстрирует, как разработчики просто бросаются «делать работу», а не думать, проектировать и затем кодировать.

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

В конце упражнения мы просматриваем код одного из студентов. Это выглядело примерно так:

1
2
3
4
5
6
7
8
public class Game{
public Game() {
Board board = new board();
Player playerX = new Player();
Player playerO = new Player();
}
...
}

Выглядит достаточно невинно, верно? Я выполнил упражнение больше, чем помню, и много раз урок Game начинался именно так.

Вот в чем дело: обратите внимание, что игра создает доску ? Это означает, что есть новая доска для каждой игры.

Знаете, в реальной жизни на одной доске будет несколько игр. Если бы мы на самом деле думали о моделировании отношений между экземплярами Game и экземплярами Board, было бы много-мало-мало (или даже много-к-одному, если мы повторно используем плату).

Затем Игра создает экземпляры Player . Поскольку в требованиях, которые управляют игроками, нет указаний, игра является жизнеспособным выбором дизайна. Я не собираюсь обсуждать, где это хорошо или плохо, но это жизнеспособно.

Тем не менее, как мы можем прочитать код, мы видим, что класс Game не только содержит сущности Player и Board , но и фактически создает их.

Теперь, не могли бы вы описать такую ​​игру другу, который не знает, во что все играют?

Нет. Вы бы описали это так:

В игру играют два игрока на доске.

Хотя код выглядит так:

Игра создает доску. Затем он создает игроков.

Словесные слова

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

Поскольку мы имеем дело с кодом, вы уже видите диссонанс. Мы видим, что отношения между объектами в модели не такие, как мы описываем это в реальном мире.

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

1
2
3
4
public class Game {
  boolean [][] multi = new int[3][3];
  ...
}

Я не знаю о вас, но никогда не слышал, чтобы игра описывалась с использованием слова «массив». Даже разработчиками. Давай, спроси их.

Выбирайте выражения

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

Однако что происходит, когда у нас возникают ошибки при переводе? Иногда мы понимаем, что никакого вреда не было. Иногда мы получаем странный словарь с венгерского на английский .

В программном обеспечении мы в конечном итоге с ошибками. Некоторые из них несущественны. Некоторые из них основаны на неправильных предположениях и подкреплены неправильным переводом.

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

Во-вторых, не пропустите дизайн. Используйте термины из домена в коде.

Но также, расскажите историю использования. Если мы опишем игру так:

В игру играют два игрока на доске.

Тогда, возможно, код должен выглядеть так:

1
2
3
4
5
6
7
public class Player {
  public void play(Game game) {...}
}
 
public class Game
  public void setBoard(Board board) {...}
}

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

Вы поблагодарите себя позже.

Опубликовано на Java Code Geeks с разрешения Гила Зильберфельда, партнера нашей программы JCG. Смотрите оригинальную статью здесь: Мой корабль на воздушной подушке полон угрей

Мнения, высказанные участниками Java Code Geeks, являются их собственными.