Skip to content

Latest commit

 

History

History
108 lines (87 loc) · 2.73 KB

TUTORIAL2.ru.md

File metadata and controls

108 lines (87 loc) · 2.73 KB

На примере денег

Часть вторая

  • $5 + 10CHF = $10 if CHF:USD is 2:1
  • $5 * 2 = $10
  • Money это data class
  • Преобразование Money в текст для отчета

Теперь мы можем приступать к пункту 2 И для начала напишем тест. Кент Бек использует метод times для того, чтобы приумножать J деньги. Этот путь кажется тупиковым с точки зрения чистого ООП. Мы можем производить множество различных операций с деньгами. Но мы не должны каждый раз модифицировать наш класс Money, нарушаем OCP. Это поведение мы реализуем через объектную композицию. (Эту фразу стоит пересмотреть)

make_shared<EqualTest>(
	make_shared<MoneyText>(
		make_shared<TimesMoney>(
			make_shared<Money>(5, "USD"),
			2
		)
	),
	"10 USD"
)

Для того, чтобы тест прошел, реализуем TimesMoney

int TimesMoney::amount() const
{
	return money->amount() * multiplier;
}

string TimesMoney::currency() const
{
	return money->currency();
}

А для того, чтобы TimesMoney можно было использовать совместно с MoneyText - нам нужно выделить Money в виде интерфейса.

class Money {
public:
	virtual ~Money() = default;
	virtual int amount() const = 0;
	virtual std::string currency() const = 0;
};

class RealMoney final : public Money {
	...
};

class TimesMoney final : public Money {
	...
};

Тесты проходят

[==========] Running 2 tests
[ RUN      ]
'5 USD' is equal '5 USD'
[       OK ]  (0 ms)
[ RUN      ]
'10 USD' is equal '10 USD'
[       OK ]  (0 ms)
[==========] 2 tests ran.
[  PASSED  ] 2 test.

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

make_shared<NamedTest>(
	"$5 * 2 = $10",
	make_shared<EqualTest>(
		make_shared<MoneyText>(
			make_shared<TimesMoney>(
				make_shared<RealMoney>(5, "USD"),
				2
			)
		),
		"10 USD"
	)
)

В результате получаем вот что:

[ RUN      ] $5 * 2 = $10
'10 USD' is equal '10 USD'
[       OK ] $5 * 2 = $10 (0 ms)

Хм... Не уверен, что это точно то, что я хотел получить, но в целом довольно понятно что к чему.

  • $5 * 2 = $10

Продолжить