2010-03-22 2 views
1

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

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

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

+0

С денежными суммами, возможно, стоит ознакомиться с http://joda-money.sourceforge.net/. Проект еще не имеет действительно стабильного выпуска, но api чист и полезен. – gpampara

ответ

1

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

+0

У меня получилось. Благодаря! – sarahTheButterFly

0

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

+0

Да, это была моя первоначальная мысль. Но после прочтения комментариев Кевина и BalusC я подойду к подходу 2. – sarahTheButterFly

+0

@sarah: Ты не единственный :) –

0

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

1

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

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

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

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

+0

Спасибо. Я запомню, что не «загрязняю» API. – sarahTheButterFly

3

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

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

+0

Я не думаю, что вы поняли, что спрашивал плакат. Когда она сказала: «У меня есть ценный объект», я думаю, она говорила, что у нее есть класс Money и интересуется, как получить информацию из нее. Должна ли она иметь 'getAmountInDollars()' и 'getAmountInEuros()'? Или она должна просто иметь 'getAmount()' и позволить потребителю вызывать 'convertToDollars()' или 'convertToEuros()'? – Gabe

+0

Это, безусловно, возможно. Я предполагал, что это просто контейнерный класс для множества данных, включая сумму (возможно, цену). – tvanfosson

+0

Да, габб, ты прав. Это именно то, что я просил. – sarahTheButterFly

4

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

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

+0

Спасибо! Не ожидал, что так много узнает, просто задав такой маленький вопрос. :) – sarahTheButterFly

+0

это подход, который я предпочитаю, и мне нравится идея написать его как getAmount (Locale). Самое приятное в этом - это то, что вы можете изменить метод getAmount, чтобы возвращать другие вещи, не слишком раздувая API. – David

Смежные вопросы