Передача аргумента через несколько объектов - используется только в конечном объекте - PullRequest
0 голосов
/ 15 октября 2018

У меня есть класс обслуживания, который содержит ряд объектов, которые содержат различные виды данных и их соответствующее поведение.Один из этих объектов имеет другие объекты, которые используют некоторые данные первых двух объектов ... попробуйте сказать, что это в 10 раз быстрее!

Так что в приведенном ниже примере object3 принимает аргументы x и y из object1 и параметраz из объекта2.В свою очередь, эти параметры не «используются» object3, но передаются в качестве аргументов в object3_1 и object3_2.

class ServiceClass {
    protected $object1;
    protected $object2;
    protected $object3;

    public function doSomething (){
        $this->object3->calculateSomething($x, $y, $z);
    }
}

class Object1Class {
    protected $data = {"x"=>"y"};

    public function getX (){
        //return x
            }

    public function getY (){
        //return y
    }
}

class Object2Class {
    protected $data = "I'm data!";

    public function getData (){
        //return string
    }
}

class Object3Class {
    protected $object3_1;
    protected $object3_2;

    public function calculateSomething ($x, $y, $z){
        $this->object3_1->getSomething($x, $y);
        $this->object3_2->getSomethingElse($x, $y, $z);
            }
    }

Так что в основном я пытаюсь найти лучший способ получения информации изservice, to object3_1 / 3_2?

4 способа, которые я до сих пор получил:

  1. Передача данных из объектов в метод object3, а затем передача в object3_1 /3_2

    $this->object3->calculateSomething($this->object1->getX(), $this->object1->getY(), $this->object2->getZ());
    
  2. Передать объект1 и объект2 в объект3, а затем либо передать данные в объект3_1 / 3_2, либо передать объекты снова

    $this->object3->calculateSomething($this->object1, $this->object2);
    
  3. Создайте новый класс, содержащий свойства и поведение для требуемых данных, и передайте его.

    class DataClass {
        protected $xy;
        protected $z;
    
        public function __contruct($xy, $z){
            $this->xy = $xy;
            $this->z = $z;
        }
    
        public function getX(){
            // return x
        };
    
        public function getY(){
            // return y
        };
    
        public function getZ(){
            // return z
        };
    }
    
    $this->object3->calculateSomething($DataObject);
    
  4. Создайте массив элементов данных и передайте его.

Все опции работают, просто не получается передать один и тот же аргумент через несколько методов.В надуманном примере, приведенном выше, я сделал только 2 класса глубиной ради краткости, но в некоторых областях моего проекта данные должны быть переданы до 6 уровней глубиной, прежде чем они будут использованы.

СВ варианте 1 список параметров имеет реальную вероятность увеличения числа - не то, что в конечном методе вычислений делается слишком много вещей, а просто требуется все эти биты данных для одного вычисления.Вариант 3 кажется мне привлекательным, но он продублирует код поведения из исходных объектов - так что прохождение самих объектов кажется лучше ... и это круг, в который я вхожу последние несколько дней.

Есть ли лучший способ сделать это, или я просто слишком много думаю?

...