zoukankan      html  css  js  c++  java
  • php定义方法属性类比普通传值的优点

    原文作者: xingguang
    原文链接:https://www.tiance.club/post/2520600556.html

    普通传值:是指直接将参数从一个方法传到另一个方法,最简单暴力的方式。
    方法属性类:将需要传递的所有值以方法属性类的方式定义出来,需要用时直接取出即可。

    两者的代码实现方式

    1、普通传值方式

    public function testDetail(){
        $this->returnDetail('小李',10);
    }
    
    private function returnDetail($name,$age){
        print_r([$name,$age]);exit;
    }
    

    2、方法属性类方式

    public function testDetail(){
    
        $data=(new HumanDetail());
        $data->setName('小李');
        $data->setAge(10);
        $this->returnDetail($data);
    }
    
    private function returnDetail(HumanDetail $data){
        print_r([$data->getName(),$data->getAge()]);exit;
    }
    

    HumanDreail类文件

    upload successful
    从上面两者的实现代码可以看出普通传值方式简单简洁,方法属性类传值代码实现相对繁琐,还要多写一个类文件。既然这样的话为什么还要有方法属性类传值的方式呢?

    试想一下,当参数还少的时候没什么问题,但是当参数多的时候,这样传递代码很难看,也有人说可以直接把所有参数放到一个数组里面,然后直接传递那个数组参数即可,但是这里又有一个问题,就是你传递的数组里面有什么值其他人是无法一眼看出的,而且数组也可以传递所需参数外的其他参数,这样很不利于其他人维护。

    原文作者: xingguang
    原文链接:https://www.tiance.club/post/2520600556.html

    方法属性类方式比普通传值的优点

    例如下面的案例:

    1、普通传值

        public function testDetail(){
            $name='小李';
            $age=10;
            $sex='男';
            $type=1;
            $a='a';
            $b='b';
            $c='c';
            $d='d';
            $e='e';
            $f='f';
            $g='g';
            $this->returnDetailA($name,$age,$sex,$type,$a,$b,$c,$d,$e,$f,$g);
            $this->returnDetailB($name,$age,$sex,$type,$a,$b,$c,$d,$e,$f,$g);
        }
    
        private function returnDetailA($name,$age,$sex,$type,$a,$b,$c,$d,$e,$f,$g){
            print_r([$name,$age,$sex,$type,$a,$b,$c,$d,$e,$f,$g]);
        }
    
        private function returnDetailB($name,$age,$sex,$type,$a,$b,$c,$d,$e,$f,$g){
            print_r([$name,$age,$sex,$type,$a,$b,$c,$d,$e,$f,$g]);exit;
        }
    

    2、方法属性类方式

        public function testDetail(){
    
            $data=(new HumanDetail());
            $data->setName('小李');
            $data->setAge(10);
            $data->setSex('男');
            $data->setType(1);
            $data->setA('a');
            $data->setB('b');
            $data->setC('c');
            $data->setD('d');
            $data->setE('e');
            $data->setF('f');
            $this->returnDetailA($data);
            $this->returnDetailB($data);
        }
    
        private function returnDetailA(HumanDetail $data){
            print_r([$data->getName(),$data->getAge(),$data->getSex(),$data->getA(),$data->getB(),$data->getC(),
                $data->getD(),$data->getE(),$data->getF()]);
        }
    
        private function returnDetailB(HumanDetail $data){
            print_r([$data->getName(),$data->getAge(),$data->getSex(),$data->getA(),$data->getB(),$data->getC(),
                $data->getD(),$data->getE(),$data->getF()]);exit;
        }
    

    HumanDreail类文件

    upload successful

    并且上面的方法属性类传值方式还可以进一步优化
    优化如下:
    HumanDreail类文件

    <?php
    namespace appcomponents;
    
    class HumanDetail
    {
    
        private $name='';
        private $age=0;
        private $sex='';
        private $type=0;
        private $a='';
        private $b='';
        private $c='';
        private $d='';
        private $e='';
        private $f='';
    
    
        public function __call($method,$args)
        {
    
            $perfix=strtolower(substr($method,0,3));
            $property=strtolower(substr($method,3));
            if(empty($perfix) || empty($property)) return;
            if($perfix=="get" && isset($this->$property)) return $this->$property;
            if($perfix=="set")$this->$property=$args[0];
    
    //        if($perfix=="set"){
                  //开启强类型判断,对于php这种弱类型语言来说开启后对线上稳定会造成隐患
    //            if(gettype($this->$property) == gettype($args[0]) ){
    //                $this->$property=$args[0];
    //            }else{
    //                throw new BaseComponentsaseException(['-1',$property." is wrong type, {$property} is ".gettype
    //                    ($this->$property)." and args is ".gettype($args[0])]);
    //            }
    //        }
    
        }
    
    
    }
    

    从上面可以看出,当传参参数变多了且当有多个接收方的时候,代码可维护性就变高了,接收方只需要从对应的类文件中需要自己需要的参数即可,不用这样多参数的传递,而且这还只是一层传递方式而已,如果是多层传递的话,那代码看上去就相对冗余难以维护。

    总结:两者的优缺点

    普通传值

    优点:
    1、传值参数少,业务场景简单时,简洁明了。
    缺点:
    1、传值参数多,业务场景复杂时,代码可读性差,拓展性差。
    2、传递层次多时,代码可读性和拓展性差的缺点会更加明显。

    方法属性类

    优点:
    1、传值参数多,业务场景复杂时,代码可读性高,便于团队开发,拓展性强。
    2、传递层次多时,代码可读性和拓展性强的优势会更加明显。
    缺点:
    1、传值参数少,业务场景简单时,代码量相对于普通传值方式更多。

    一般来说一个业务的未来变化情况是可以预测到的,正确的选择对应的传值方式,有利于代码的可维护性和拓展性,更加有利于代码的健壮性。

    原文作者: xingguang
    原文链接:https://www.tiance.club/post/2520600556.html

  • 相关阅读:
    用JS实现气泡效果
    如何判断浏览器JS代码
    你是怎么看完《JavaScript权威指南》《JavaScript高级程序设计》等这类厚书的?
    CSS3技巧:fit-content水平居中
    捋一捋JavaScript对象的理解
    js 判断数据类型的几种方法
    给想转行学习web前端的朋友提些学习建议及学习路线
    sentry 9.1.1docker版onepremise过程记录
    python内置函数all使用的坑
    centos7.2自带的php5.4升级为5.6
  • 原文地址:https://www.cnblogs.com/yizhidaozuihou/p/12830095.html
Copyright © 2011-2022 走看看