Size: a a a

2020 May 04

F

FOX in PHP
Dmitry Naumenko
Есть ещё один популярный способ в угоду красивого интерфейса – пре-конфигурированные синглтоны.
sumWith(Money $other) { return Converter::convert($this, $other); }

Самый популярный пример, наверное https://github.com/doctrine/dbal/blob/2.10.x/lib/Doctrine/DBAL/Types/Type.php
А в чём тут (в Type) "пре-конфигурируемость" заключается? На вид вполне типичный абстрактный класс.
источник

DT

Dmitriy Tkachenko in PHP
Так же можно и синглтон БД юзать в VO
источник

АС

Альберт Степанцев... in PHP
То, что вы тут пишете - это операции.
Поскольку в PHP нет ни перегрузки, ни создания операторов, есть два относительно нормальных выхода

1. Функции в неймспейсе
Money\sum(MoneyValue $a, MoneyValue $b): MoneyValue

2. Статический класс. Абстрактный класс, все методы статические, каждый реализует одну операцию
Сигнатура будет почти такая же
Money::sum(MoneyValue $a, MoneyValue $b): MoneyValue
источник

DT

Dmitriy Tkachenko in PHP
И получится active record)
источник

DN

Dmitry Naumenko in PHP
FOX
А в чём тут (в Type) "пре-конфигурируемость" заключается? На вид вполне типичный абстрактный класс.
Потому что его конфигурят во время бутстрапа вызовами Type::addType('money', 'My\Project\Types\MoneyType');
источник

F

FOX in PHP
а, в этом смысле
источник

DT

Dmitriy Tkachenko in PHP
Dmitry Naumenko
Потому что его конфигурят во время бутстрапа вызовами Type::addType('money', 'My\Project\Types\MoneyType');
Технически это то же самое, что инжектить service locator в VO
источник

DN

Dmitry Naumenko in PHP
Альберт Степанцев
То, что вы тут пишете - это операции.
Поскольку в PHP нет ни перегрузки, ни создания операторов, есть два относительно нормальных выхода

1. Функции в неймспейсе
Money\sum(MoneyValue $a, MoneyValue $b): MoneyValue

2. Статический класс. Абстрактный класс, все методы статические, каждый реализует одну операцию
Сигнатура будет почти такая же
Money::sum(MoneyValue $a, MoneyValue $b): MoneyValue
Допустим, для конвертации нам нужны только курсы.

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

DT

Dmitriy Tkachenko in PHP
Правда так звучит совсем говнянно)
источник

MM

Maksim Masiukevich in PHP
Альберт Степанцев
То, что вы тут пишете - это операции.
Поскольку в PHP нет ни перегрузки, ни создания операторов, есть два относительно нормальных выхода

1. Функции в неймспейсе
Money\sum(MoneyValue $a, MoneyValue $b): MoneyValue

2. Статический класс. Абстрактный класс, все методы статические, каждый реализует одну операцию
Сигнатура будет почти такая же
Money::sum(MoneyValue $a, MoneyValue $b): MoneyValue
по какому курсу сложение для этой пары? (на какой день, с какого источника?)
через какую валюту для этой пары осуществляется конвертация? (как указать множественную цепочку?)
с какими поправками?

зачем пытаться впихнуть невпихуемое)
источник

АС

Альберт Степанцев... in PHP
конвертация - это операция с двумя операндами
источник

АС

Альберт Степанцев... in PHP
значение и кросс-курс
источник

DT

Dmitriy Tkachenko in PHP
Можно ещё и через double dispatch
источник

АС

Альберт Степанцев... in PHP
а вы считаете, что с одним
источник

АС

Альберт Степанцев... in PHP
и тут ваша ошибка
источник

DT

Dmitriy Tkachenko in PHP
Почему этот способ опущен?
источник

DT

Dmitriy Tkachenko in PHP
function sum(Money $other, callable $adder) { return $adder($this, $other); }
источник

DN

Dmitry Naumenko in PHP
А где adder взять?
источник

DT

Dmitriy Tkachenko in PHP
из той же глобальной области
источник

DT

Dmitriy Tkachenko in PHP
только теперь VO не будет лазить куда попало, а получать все что нужно очевидным способом
источник