Чистое кодирование: следует ли передавать строку или объект в свою функцию? - PullRequest
0 голосов
/ 07 мая 2020

Я пишу приложение PHP, которое имеет дело с денежными величинами. Для этой цели я использую объект BigDecimal из библиотеки Brick \ Math . Этот объект позволяет точные представления денежных значений и точные операции с ними. Чтобы создать объект BigDecimal из string, int или float, мне нужно вызвать метод BigDecimal::of, например:

BigDecimal::of('1.25');

Теперь скажем, что У меня есть следующий метод:

function withdraw_currency(string $currency, BigDecimal $amount);

Если я захочу его вызвать, мне часто придется создавать объект BigDecimal, например:

withdraw_currency('USD', BigDecimal::of('1.25'));

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

Я думал об этом:

$amount = BigDecimal::of('1.25');
withdraw_currency('USD', $amount);

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

Я также подумал об изменении метода withdraw_currency, чтобы параметр $amount был a string вместо BigDecimal. Тогда $amount будет преобразовано в объект BigDecimal внутри метода; или, другими словами, это "скрыло бы" уродство от программиста.

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

withdraw_currency('USD', '1.25');

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

Кажется, что нет идеального ответа, но мне нужен был вклад других программистов. Каким будет наиболее "чистый" способ работы с объектом BigDecimal в этой ситуации?

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

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

0 голосов
/ 07 мая 2020

Почему бы вам не использовать поплавок? Чтобы вы могли просто набрать:

withdraw_currency('USD', 1.25);

Они огромны в php, 1.7976931348623E + 308. Взгляните сюда: с плавающей точкой

...