如何重构与业务对象紧密结合的“函数库”类?

时间:2015-07-16 23:42:34

标签: php oop refactoring decoupling

我有一个Calc类,我认为它不正确地放在我正在使用的代码库中。对于类结构,请参阅下面的代码。

目前

  • Spec类充当数据存储,类似于C struct
  • Calc class是一个计算函数类库,只要这些类需要进行一些计算,它就会被实例化为其他类的一部分。 Calc类还包含Spec类,因此可以使用Spec的变量进行计算。
  • Plot class是表示图形的业务对象的示例。
  • Controller class是一个业务对象,表示我的应用程序中的各种控制器,其中进行了一些计算并以用户页面“View”的文本显示,并且还创建了一个图表,该图表也显示为用户在“查看”页面上。
class Spec
{
    public $a;
    public $b;
    public $c;
}

class Calc
{
    public $spec;

    function __construct()
    {
        $this->spec = new Spec();
    }

    function calcParameter()
    {
        $this->spec->c = $this->spec->a + $this->spec->b;
    }
}

class Plot
{
    public $calc;

    function __construct()
    {
        $this->calc = new Calc();
    }

    function calcPlot()
    {
        $this->calc->spec->c = $this->calc->spec->a * $this->calc->spec->b;
    }
}


class Controller
{
    public $calc;
    public $plot;

    function __construct()
    {
        $this->calc = new Calc();
        $this->plot = new Plot();
    }

    function doBusinessLogic()
    {

        //calc for local
        $this->calc->spec->a = 5;
        $this->calc->spec->b = 5;
        $this->calc->calcParameter();
        print "total is {$this->calc->spec->c}<br>\n";

        //later this format is used by JS to display computational results
        $plotJSON = json_encode($this->calc); 


        //calc for plot
        $this->plot->calc->spec->a = 7;
        $this->plot->calc->spec->b = 143;
        $this->plot->calcPlot();
        print "total is {$this->plot->calc->spec->c}<br>\n";

        //later this format is used by JS to display a plot
        $plotJSON = json_encode($this->plot); 
        print "
        <div id='plot' style='display:none'>$plotJSON</div>
        <script>
            var plot = JSON.parse(document.getElementById('plot').innerHTML);
            document.write('JS says - there are ' + plot.calc.spec.c + ' plot points<br>');
        </script>
        ";
    }  
}

//runs the above
(new Controller())->doBusinessLogic();

JS就像这样使用:

var plot = JSON.parse(document.getElementById('plot').innerHTML);
document.write('JS says - there are ' + plot.calc.spec.c + ' plot points<br>');

问题

我的印象是Calc类没有正确放置(设计不正确),因此,它被注入各个地方只是为了进行计算。我认为Calc应该是没有参数的类,并且Spec不应该是Calc的一部分。并且Calc必须只包含进行计算的函数,Calc的调用者将提供自己的数据并接收结果。因此Calc将成为其他人使用的静态函数库。但那么这是最好的方法吗?

如何重构这一点以减少耦合?请记住,要么保留JSON格式,要么注意代码中的任何更改都可能需要更改JS代码。

在我进行膝盖深度重构之前,我现在的设计正常工作。是否需要重构?只是检查。

1 个答案:

答案 0 :(得分:0)

好的,根据我到目前为止所看到的,Calc类根本不存在。 calcParameter方法应该是Spec类的成员。

calcPlot的{​​{1}}方法也应该是Spec类的成员(它完全处理当前编写的Spec字段。)您仍然可能希望保留Plot如果它对其Plot对象做了其他有趣的事情。

像这样:

Spec