今天想写些东西,想谈谈我对面向对象小小的认识。
面向对象是入门java时看的第一份资料,那时只认为是java中class类之间的继承设计关系。直到有一天我的领导,在看了我的数据库表设计后,忍不住在下班后单独给我指导了一下 (送上致敬) 。
我发现他的思维是一种观察事物的方式,这是我所不具备的。我还是想着的是为了实现需求的方便,很随意将字段组合到一起。后果则是在面临功能扩展的时候,程序逐渐一塌糊涂。原因很简单,业务需求是客观存在的,是各种组织之间的合作过程体现,如果从事物角度去抽象程序,程序很容易获得前瞻性,最近我才感受到这种设计得好处,而每次需求的变化使我设计的程序更加通用,更加牢固而且极具扩展,而且之前犹豫不决的设计,逐渐变得清晰。我突然理解到,这玩意儿是个哲学问题。
自己思考的一个场景
年纪慢慢变大,工资少的可怜,便想买点理财产品,跑不赢房价,但是和通胀还是可以拼一拼。
作为低风险承受能力客户,我就只能买买理财,一般年化收益为0.3%。将钱存进去后,我得很好奇它明天会怎样。小学数学就教过我们如何计算存款。
本
金
∗
(
1
+
利
率
)
n
本金 * (1+利率)^n
本金∗(1+利率)n
高效简洁没有任何问题。作为解题很完美了。但是作为实实在在影响我以后的收支分析那就远远不够,随着时间变化,其中的变量情况会很复杂,比如我每月往里面存固定金额。那这个算法就要进行改造。想想就很麻烦。因为每年次存的钱肯定和我的当月收入有关 (线性关系) 。
自己思考的实现
我设计了一个简单的类
class NormalPerson{
public MyBank myB = new MyBank();
public NormalPerson(Double initAsset) {
myB.usufruct = initAsset;
}
class MyBank{ //不是我的银行,只是描述银行管理个人资产的动作。
public Double usufruct = 0d; //可以供我使用的金额
public Double takeOverUsufruct = 0d; //被占用的,需要赎回
public double yearToDailyRate = 0.000085d; //年化收益率折算每日收益,这个大概就是0.3%, 一般理财都是这个水平,这个值其实是在随时变化的,虽然幅度小
/**
* 银行接受投资
*/
public void accpetFinancing(Double invest) {
usufruct -= invest; //我可支配的部分减少
takeOverUsufruct += invest; //我投资部分增加
}
/**
* 计算收益
*/
public void calDailyBenefit() {
double benefit = takeOverUsufruct * yearToDailyRate;
takeOverUsufruct += benefit;
}
}
/**
* 发工资了
*/
public void income(Double income) {
myB.usufruct += income;
}
/**
* 我进行投资
*/
public void doFinancial(Double invest) {
myB.accpetFinancing(invest);
}
/**
* 计算资产
*/
public double calAsset() {
return myB.usufruct + myB.takeOverUsufruct;
}
}
在这个类里面模拟简单的现实行为,只定义收入和投资动作,在此类里面有一个内部银行类,负责管理收入,投资和产生收益。
策略: 每月15号发工资,工资10000元,每月存2000进银行。年化率0.3%,在10,20,30,40年后会发生什么
NormalPerson mygf = new NormalPerson(0d); //初始资金0
//我找到了工作,工资10000块钱
Double salary = 10000d;
//工作时间长
int workYear = 10; //20 30 40
//当前时间
Date now = new Date();
//N年后的时间
Calendar cl = Calendar.getInstance();
cl.setTime(now);
cl.add(Calendar.YEAR, workYear);
Date yearLater = cl.getTime();
//一年时间的资产变化逻辑
SimpleDateFormat fmt =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar cl2 = Calendar.getInstance();
for(Long ss = now.getTime(); ss <= yearLater.getTime(); ss += (1000 * 60 * 60 * 24l)) { //每天都进行一次计算。每天都要获取收益
cl2.setTimeInMillis(ss);
if(cl2.get(Calendar.DATE) == 15) { //每月月15号,发工资,拿出2000元进行投资
mygf.income(salary);
// System.out.println(fmt.format(cl2.getTime()));
mygf.doFinancial(5000d);
}
mygf.myB.calDailyBenefit();
}
System.out.println(workYear + "年工资 = " + (salary * workYear * 12));
System.out.println(workYear + "年理财 = " + mygf.calAsset());
年份 | 工资 | 资产总数 |
---|---|---|
10 | 1200000.0 | 1303452 |
20 | 2400000.0 | 2863059 |
30 | 3600000.0 | 4771832 |
40 | 4800000.0 | 7157346 |
在我们可以发现,比起算法,面向对象的程序设计的确是啰嗦不少,写的时间也不短。但是带来的好处是暴露在多变的业务规则中也能顽强生存。
运行的过程可以封装成投资策略。面向对象便在于模拟,你创造了一个局部世界,然后等待惊喜。