Почему класс Money расширяет Expression в TDD Кента Бека на примере? - PullRequest
2 голосов
/ 08 мая 2020

Я изучаю TDD по Примеру и до сих пор считаю, что это отличная книга. Но есть момент, когда он говорит нам написать:

// in class Money:
Expression plus(Money addend) {
    return new Money(amount + addend.amount, currency);
}

Что не будет построено, пока мы не объявим:

class Money implements Expression {...

Это действительно не имеет для меня смысла. Автор создал Expression как интерфейс для Sum, а Money не имеет ничего общего с Sum. Позже он добавляет метод reduce(), общий для обоих классов, но сокращение в Money просто возвращает this.

Создание Money реализации Expression - это лишь путь наименьших усилий для устранения ошибки из метод plus(), но он заполняет код ненужной информацией (из-за этого решения ему придется реализовать reduce ()) и увеличивает энтропию.

Я особо не задумывался об этом, но Разве не было бы чище сделать что-то вроде этого?

class Money {        
    Money plus(Money addend) {
        return new Money(amount + addend.amount, currency).reduce();
    }
}
// edited this, it previously returned Expression

Изменить: В следующей главе автор реализует метод reduce() в другом классе (с именем Bank ), который конвертирует Money между валютами. Я все еще нахожу это странным решением, имена Sum и Expression подразумевают, что вместо этого у нас должен быть класс выражения преобразования для этой задачи. Что автор, вероятно, намеревается сделать, так это использовать рекурсию для добавления денег в разных валютах. В любом случае, мне кажется, что он сделал какое-то дальновидное планирование, которое кажется несовместимым с TDD, представленным в книге.

1 Ответ

2 голосов
/ 08 мая 2020

При планировании наперед

TDD не запрещает планирование наперед. Процесс заключается в получении быстрой обратной связи о ваших планах вместо того, чтобы тратить дни (или недели) на создание тщательно продуманных планов, только для того, чтобы увидеть, как они «не выдерживают контакта с реальностью» (перефразируя Хельмута фон Мольтке). Можно думать наперед.

Тем не менее, Кент Бек показывает в главе 17, что это не его первое родео: Я могу придумать. Я использовал его в качестве примера в печати еще полдюжины раз. Я программировал его вживую [...] на сцене еще пятнадцать раз. Я кодировал еще три или четыре раза, готовясь к написанию [... ] Затем, когда я писал это, я подумал об использовании выражения в качестве метафоры, и дизайн пошел в совершенно другом направлении, чем раньше ».

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

Об API

Это не объясняет, почему код выглядит так, но для этого есть причина. . На самом деле это хороший API.

Почему вы не можете написать что-то вроде return new Expression(amount + addend.amount, currency).reduce()?

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

Помните, что проблема решается с помощью кода. Люди все время ошибаются, и я думаю, что Кент Бек (непреднамеренно) усугубил путаницу, назвав пример Деньги .

Проблема не в моделировании денег , но для моделирования инвестиций портфеля ios в разных валютах. Если у вас есть портфель в 25 000 долларов США и 10 000 швейцарских франков, сокращение его до единой валюты скрывает важные детали. Имея портфель в нескольких валютах, вы диверсифицируете риски. Владельцы портфолио захотят увидеть более одного вида своего портфеля ios. Иногда они хотят видеть портфель, сгруппированный по валютам, а в других случаях они хотят видеть «текущую общую стоимость» портфеля, представленного в одной валюте.

API в книге позволяет использовать оба представления.

Причина, по которой основная «метафора» называется выражением , заключается в том, что API - это просто специализированное дерево выражений. Но получается неплохо, потому что это законно. Ограниченный подтипами, представленными в книге, неформально порождает моноид .

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