Составные сущности как скалярные величины (на примере денег)

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

Допустим, у нас есть класс Money со свойствами Amount (количество) и Currency (валюта), в которое реализовано неявное преобразование к decimal и int. Также перегружен оператор + для сложения Money с Money:

Это позволяет безо всяких приведений типов и выковыривания Amount складывать Money не только с Money, но и с decimal и int. Результатом таких операций будет число decimal или int соответственно.

Кроме арифметических операций можно передавать Money в качестве параметра везде, где требуется decimal или int.

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

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

Лучше вообще не складывать более двух сущностей сразу, чтобы не получить непредсказуемых результатов. Ну или используйте скобки, чтобы задать явный порядок выполнения операций.

Полный код примера (Github):

Результатом выполнения этой программы будет следующий текст: