Получатель объекта значения - PullRequest
1 голос
/ 22 марта 2010

У меня есть объект-значение, в котором хранится информация, например, количество.Метод getAmount () возвращает сумму в центах.Однако в разных местах нам нужно получить сумму в долларах.Я могу придумать два подхода:

  1. написать метод convert и поместить его в служебный класс.
  2. добавить метод getAmountInDollar () в объект значения.

Я предпочитаю второй подход.Как вы думаете?Каковы плюсы и минусы обоих подходов?

Ответы [ 6 ]

4 голосов
/ 22 марта 2010

Я думаю, что было бы лучше обобщить ваш геттер с перегрузкой, которая указывает, какие единицы измерения, поэтому я мог бы вызвать getAmount(), чтобы получить значение по умолчанию, но getAmount(Units.Dollar) или getAmount(Units.Euro) также будут доступны без созданияновый получатель для каждой возможной конвертации валюты.

Конечно, это обобщает еще больше, чтобы вы могли хранить внутреннее значение температуры в Кельвинах, но могли бы getAmount(Units.Celsius) или getAmount(Units.Rankine) получать температуру в других масштабах.

3 голосов
/ 22 марта 2010

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

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

1 голос
/ 22 марта 2010

Я предпочитаю держать публичный API класса достаточно сфокусированным. Как только вы начинаете добавлять к нему методы, которые не являются частью «ядра», вы рискуете получить очень сложного зверя. В случае с классом, который в основном содержит данные, я бы старался сохранить его таким образом.

В конце концов, нет четкого «лучшего» ответа ... он просто основан на вашем личном опыте. Мой говорит, что, как только вы начнете «загрязнять» API, это будет трудно остановить, и в конце концов вам все равно придется разбить класс.

Класс утилит также дает вам место для размещения других связанных, но не совсем, методов, которые вы, вероятно, найдете со временем.

Если ваша цель - сократить количество классов, я бы сказал, что нет. Если вы чувствуете, что наличие метода в классе делает код «чище», то делайте так.

1 голос
/ 22 марта 2010

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

0 голосов
/ 22 марта 2010

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

0 голосов
/ 22 марта 2010

Поскольку инкапсуляция связана с данными и поведением в сценарии «черного ящика», я предпочитаю и второе, для объектно-ориентированного убеждения.

...