From FunctionObject...
This is an extremely valuable object we found working on LifeTech. It is so simple, but it makes solving so many problems trivial.
A Function is a function of value over time. The instance signature is:
+ , - aFunction => aFunction / , * aNumber => aFunction valueOn: aDate => aNumber integrate => aFunction discountBy: , compoundBy: aNumber => aFunction (returns the integral of the NPV (or FV) of the receiver)The constructors are:
on: aDate pay: aNumber in: aPeriod pay: aNumber in: aPeriod pay: aNumber every: aPeriodicityWith this and nothing more you can build models of interesting financial instruments like life insurance. In particular, where models like AccountsAndTransactions? are good at modeling a fairly certain past, Functions are good at modeling an uncertain future.
You could substitute a MoneyObject for numbers in the above and gain the ability to model multi-currency instruments.
Implementation Hints
Don't go crazy trying to duplicate Mathematica. Only implement the operations you need to model your situation. We found that we could get away with a much-less-than-complete-or-orthogonal implementation and still model everything we needed to model.
The classes in our system are:
Siggggghhhhhh. I hate to sound mainstream like this, but would someone be willing to give me a c++-esque version of this one?
MichaelFeathers went crazy trying to implement MoneyObject in C++. The structure of the two is very similar in some ways.
Discussion of ValueObjects (like MoneyObject) being AlgorithmsThatDemandGarbageCollection moved to ValueObjectsRequireGarbageCollection.
Sounds like you're creating class(es) that combine dates with monetary amounts. I'd probably have common interfaces, and multiple implementation classes, as the number and types of valid attributes vary with usage, and yet are fixed at construction time. Use a ClassFactory object (...which is what a SmalltalkLanguage class object is) if you like the simple creation syntax.
So, looking at the different uses (which I would make classes):