шаблоны дизайна для конвертации валюты? - PullRequest
1 голос
/ 16 февраля 2011

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

Я думал об использовании «шаблона состояний», где каждое состояние представляет определенную валюту и имеет формулы, инкапсулированные в соответствующие методы для преобразования, например, toDollars (), toPounds () и т. д.

Другая возможность (не уверен, что это шаблон проектирования) - использовать функциональные объекты, которые конвертируют из определенной валюты в другую, и сохранять их как значения в 2-уровневой Hashtable, где ключом первого уровня является «from» валюта и ключ второго уровня - к валюте.

Существуют ли другие шаблоны проектирования, применимые к этой проблеме? Проблема на самом абстрактном уровне состоит в том, что у нас есть «m» сущности, и все они взаимно конвертируемы на основе определенных правил. Примерами являются преобразование значений часовых поясов друг в друга; календарные даты из разных типов календаря (григорианский / китайский) и т. д. друг в друга.

Спасибо и всего наилучшего!

Ответы [ 3 ]

4 голосов
/ 16 февраля 2011

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

Но так как вы спросили: Тонны шаблонов проектирования могут иметь смысл в зависимости от требований:

  • Цепочка ответственности: составьте список конвертеров, с которыми вы будете консультироваться один за другим, пока один из них не сможет конвертировать валюты вhand
  • Заводской метод: создать конвертер на основе исходной и целевой валюты
  • Фасад / декоратор: создать сумму в одной валюте из другой валюты и конвертер, скрывающий API от клиента.
  • Singleton: Если вы хотите убедиться, что у вас есть только один конвертер для каждого преобразования
  • Объект значения ...

Я рекомендую это видео: http://www.infoq.com/presentations/Value-Objects-Dan-Bergh-Johnsson Для вопроса это излишне, но в качестве примера для объекта значения используется конвертация валюты.с ...

2 голосов
/ 16 февраля 2011

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

Шаблоны проектирования не требуются, если, возможно, вы не хотите по-настоящему придумать и создать класс для каждого конкретного преобразования (из-в пары), и в этом случае вы можете посмотреть на фабрику, чтобы создать экземпляры этих классов в зависимости от кодов валют Вы передаете фабрику. Поместите декоратор или фасад поверх фабрики, так что все, что вам нужно сделать, это вызвать единственный метод, который затем вызывает фабрику и использует результат. И кто знает, возможно, вы захотите сделать этот фасад единым, чтобы вам не пришлось создавать несколько экземпляров.

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

1 голос
/ 16 февраля 2011

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

Не нужно получатьпричудливее, особенно если у вас статический коэффициент конверсии.Жесткое программирование всего с функциями наподобие toPounds () не кажется разумным, если у вас мало валют.API-интерфейс типа convert (int amountInFixedPoint, строка fromCurrency, строка toCurrency) гораздо более гибок.

...