我需要帮助建模以下情况:
金融工具总是有价格。然而,一些金融工具(某些类型,而不是)也具有所谓的“清洁”价格,这是一种取决于(除其他事项外)价格的属性,在这种情况下,价格也被称为“脏”价格。有一个计算器服务,可以计算价格(或脏价)和清洁价格。如何最好地概念化这种情况?
我考虑过两种选择:
FinancialInstrument有价格
FinancialInstrument
+ price: Price
其中Price是一个带有两个派生类的超类型:DirtyPrice和CleanPrice。 CleanPrice依赖于DirtyPrice
CleanPrice
+ dirty: DirtyPrice
然后,计算器服务将计算FinancialInstrument的价格:
CalculatorService
+ compute_price(FinancialInstrument, ...): Price
FinancialInstrument是一个超类型,有两个派生:PlainFinancialInstrument(只有on price属性)和CleanPriceFinancialInstrument,它既有干净又脏的价格。
FinancialInstrument
+ price: double
PlainFinancialInstrument CleanPriceFinancialInstrument
+ clean_price: double
计算器服务将有两种方法来计算PlainSecurity的价格或CleanPriceSecurities的清洁和脏价:
CalculatorService
+ compute_price(PlainFinancialInstrument, ...): double
+ compute_price(CleanPriceFinancialInstrument, ...): pair<double, double>
两种替代方案的权衡取舍是什么?还有其他选择吗?
感谢。
答案 0 :(得分:2)
我不清楚你是否在询问如何模拟通过你的例子指定的抽象问题,或者你是否试图在现实世界的背景下对金融工具定价的商业概念进行建模。我认为这是后者,因为你非常具体,所以我会对此发表评论。在这种情况下,我怀疑你的两种方法中的任何一种方法都足够复杂,可以满足你的任务需求。我在那个地区工作了好几年。
我不确定您在哪个业务领域工作。在我以前工作的地区(银行业),清洁和脏价之间的区别是一个简单的商业概念。例如,对于按摊余成本评估的债券,清洁价格是不考虑应计和延期的贴现现金流量的价值,脏价格是清洁价格和应计/延期的总和。在我所知的所有情况下,清洁价格是脏价格与金融工具的一些关键数字(简称FI)的一些大部分时间的简单功能之间的差异,清洁和脏价格只是相关的关键数字对于某些(但不是全部)金融工具。
另一方面,根据美国通用会计准则和业务范围,您是否需要提供清洁或脏价或两者的问题可能还取决于金融工具所分配的账簿,例如银行账户/交易账户。对于交易账户,您通常只想检索脏价,清洁价格与银行账户相关。
为了使事情变得更糟,FI可能会被重新分配,从而导致一组不同的关键字变得相关。如果这与您的上下文相关,您应确保您的设计考虑到此类更改的后果。
就个人而言,我开始采用如下概述的方法:
为金融工具
对于每种类型的FI,定义一个子类
创建一个所有关键数据的列表,这些关键数字可能与您在您的范围内的任何可能的FI相关 - 在您的示例中:清洁价格和脏价格,并且可能是表示差异的关键数字的一个。另外创建一个虚拟价格关键指标条目。
对于每个关键指标,使用与KF相关的方法创建关键指标界面。例如。计算,更新 - 这取决于您的整体模型。再举个例子:干净的价格界面,脏价格界面,增量界面和价格界面。可能有必要定义必须更新它们的顺序。价格界面的方法集必须是清洁和脏价格界面的子集
对于每种类型的FI,为与该FI类型相关的所有关键数字接口创建特定实现(类),当然考虑重用。严格地避免if / else或switch语句取决于这些实现中的关键指标或FI类型,如果这有必要,则需要额外的类定义。现在,当您实例化表示FI的类时,请使用工厂模式来创建关键值接口的实例。也就是说,您决定FI实例creaton使用哪种方法进行计算,然后FI实例知道如何计算FI的关键值。工厂模式的一个很好的特点是,您可以另外考虑您正在计算的书以及其他参数,即使在运行时也是如此。工厂将让价格关键数字界面简单地指向与上下文相关的实例。
你所谓的计算器服务然后,计算价格,调用价格关键字的接口方法,但接口指向的实例是由FI实例提供的,因为工厂已经简单地映射清洁价格界面或脏价格界面的价格界面取决于该特定上下文中特定FI的正确性。
如果您按照建议使用FI实例中的相关关键值和关键值计算接口实现的列表,如果重新分配FI,您甚至可以在运行时更新/交换它,而无需删除/重新创建FI实例
希望我没有让你的问题比实际更复杂。
此致
托马斯
答案 1 :(得分:0)
您需要单独的计算器服务吗?如果不是这样:
class FinancialInstrument {
private price: Double;
public getPrice {
// calculate the price
// presumably sets the private price? Dunno
this.price= // etc. .....
return this.price;
}
class CleanFinancialInstrument extends FinancialInstrument {
private cleanPrice: Double;
public getPrice {
//override FinancialInstrument.getPrice() as required
}
public getDirtyPrice {
//do you need this? Dunno
return this.getPrice();
}
public getCleanPrice {
this.cleanPrice = //... etc.
return this.dirtyPrice;
}
}
如果您没有缓存价格,您可能甚至不需要本地私有变量。
调用者只需在任何实例(FinancialInstrument或CleanFinancialInstrument)上调用getPrice(),而无需担心它是哪种类型。
第h