面向对象思考随笔,计算投资收益

今天想写些东西,想谈谈我对面向对象小小的认识。

面向对象是入门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

在我们可以发现,比起算法,面向对象的程序设计的确是啰嗦不少,写的时间也不短。但是带来的好处是暴露在多变的业务规则中也能顽强生存。

运行的过程可以封装成投资策略。面向对象便在于模拟,你创造了一个局部世界,然后等待惊喜。

猜你喜欢

转载自blog.csdn.net/kiramario/article/details/116239394