一道money计算题引发的思考

 

网友提出一个问题如下

是小学和中学时候学到了增长折线问题,有点像数学问题,不过这个要求用编程来实现,恐怕还是有些逻辑要处理的,话不多说看代码吧

我给出的代码如下

代码清单:

<?php
function get_money($year)
{
    $base=2000;//底薪
    //前三年计算
    for ($i=1; $i <=3 ; $i++)
    {
        $base=$base*(1+0.07);
        if($i==$year)
        {
            return $base;
        }
    }
    //后面几年的计算
    $balance_year=$year-3;
    for ($i=1; $i <=$balance_year ; $i++)
    {
        $increase_percent=max((8+3-$year),2);//保证增长率不小于2%
        $base=$base*(1+$increase_percent/100);//逐年计算
        if($base>4000)
        {
            return $base;//大于4000 立即返回
        }
    }
    return $base;
}

?>

同时 总觉得这类问题应该被抽象化,毕竟规则有可能是频繁变动的,修改代码需要重新阅读和测试逻辑,这里给出面向对象的版本

代码清单如下:

<?php
class calc_money
{
    private $base_money=2000;
    private $max_money=4000;
    private $base_year=3;
    private $base_increase_percent=0.07;
    private $min_increase_percent=0.02;
    public function __construct($year)
    {
        $balance_year=$year-$this->base_year;
        if($balance_year>0)
        {
            $this->get_first_three_year_money($this->base_year);//获取前三年
            $this->get_balance_money($balance_year);//获取后面的几年
        }else
        {
            $this->get_first_three_year_money($year);//直接获取前几年
        }
    }
    private function get_balance_money($balance_year)
    {
        for ($i=1; $i <= $balance_year ; $i++)
        { 
            $increase_percent=$this->get_right_percent($balance_year);
            $this->base_money=$this->base_money*(1+$increase_percent);//逐年计算
            if($this->base_money>$this->max_money){break;}
        }
    }
    private function get_right_percent($balance_year)
    {
        return max((8-$balance_year)/100,$this->min_increase_percent);//保证增长率不小于2%
    }
    private function get_first_three_year_money($balance_year)
    {
        $this->base_money=pow(1+$this->base_increase_percent,$balance_year)*$this->base_money;
    }
    public function get_now_money()
    {
        return $this->base_money;
    }
}

$obj=new calc_money(28);
echo $obj->get_now_money();
?>

将每个规则模块化,放入封装的私有方法来调用,避免逻辑上的混乱,为以后的代码修改和迭代打下基础。

 

posted @ 2017-06-15 14:59  李照耀  阅读(282)  评论(0编辑  收藏  举报