Я думаю, что вопрос скорее о кодировании yachtRental priceFor: myCruise days: 4
, чем о более тонкой проблеме #assert:
против #assert:equal:
(что, кстати, Йог объяснил так четко.)
Достаточно интересно, что код #priceFor:days:
, кажущийся простым, вызывает некоторые сомнения относительно теста и спецификации скидки.
Следует ли применять скидку к каждому дню периода проката, если этот период длится 4 или более дней? Или это должно быть применено к дням 4, 5 и т. Д.? 1009 *
В первом случае логика будет
priceFor: aYacht days: anInteger
| price |
price := aYacht dailyRate * anInteger.
anInteger >= 4 ifTrue: [price := price * 0.9].
^price
а во втором
priceFor: aYacht days: anInteger
| rate |
rate := aYacht dailyRate.
^anInteger < 4
ifTrue: [rate * anInteger.]
ifFalse: [rate * 3 + (rate * 0.9 * (anInteger - 3))]
Математически, первая политика скидок будет составлять цену
rate * 4 * 0.9
, который должен равняться (каламбур) 890
. Это означает, что rate
должно удовлетворять
rate = 890 / (4 * 0.9) = 247.222222222222
что довольно смешно, не правда ли?
А как насчет второй политики. В этом случае у нас будет
rate * 3 + (rate * 0.9 * (4 - 3)) = 890
или
rate * (3 + 0.9) = 890
1033 * поэтому *
rate = 890 / 3.9 = 228.205128205128
, что опять-таки не похоже на суточную арендную ставку.
Итак, я пришел к выводу, что тест должен быть неверным или политика скидок не указана.