Черта или объект, введенный в отдельный объект, который изменяет состояние введенных объектов - PullRequest
0 голосов
/ 29 августа 2018

Что правильнее использовать для множественного наследования в следующем случае? Второй метод соответствует принципу SOLID правильно? Или вместо этого можно использовать любой общий шаблон дизайна?

Это упрощенный концептуальный код. Многие классы должны расширять класс Image, как BicycleImage, BusImage. Некоторые из них должны добавить addNoise (), но не каждый. Кроме того, необходимы дополнительные классы с изменением состояния, такие как sharpenEdges, IncreaseIntesity и т. Д., Которые не каждый дочерний класс использует.

Базовый класс:

<?php

abstract class Image
{
    private $pixels;

    public function setPixel(int $x, int $y, int $intensity): void
    {
        $this->pixels[$x][$y] = $intensity;
    }

    public function saveImage(): void {}
}

Метод черты:

trait RandomNoiseTrait
{
    public function addNoise(): void
    {
        $this->setPixel(mt_rand(1, 100), mt_rand(1, 100), mt_rand(1, 100));
    }
}

class CarImage extends Image
{
    use RandomNoiseTrait;

    public function drawCar(): void {}
}

$carImage = new CarImage();
$carImage->drawCar();
$carImage->addNoise();
$carImage->saveImage();

Объект, внедренный в отдельный объект, который изменяет состояние внедренных объектов:

class CarImage extends Image
{
    public function drawCar(): void {}
}

class RandomNoise
{
    private $image;

    public function __construct(Image $image)
    {
        $this->image = $image;
    }

    public function addNoise(): void
    {
        $this->image->setPixel(mt_rand(1, 100), mt_rand(1, 100), mt_rand(1, 100));
    }
}

$carImage = new CarImage();
$carImage->drawCar();

$noise = new RandomNoise($carImage);
$noise->addNoise();

$carImage->saveImage();

1 Ответ

0 голосов
/ 31 августа 2018

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

В этом случае, исходя из предоставленной вами информации, я, скорее всего, выберу что-то вроде шаблона проектирования Strategy . На самом деле это не слишком отличается от того, что вы предлагаете в своем вопросе.

Примером этого шаблона проектирования в контексте вашего вопроса может быть:

namespace Image;

use Image\Manipulation\Manipulation;

abstract class Image
{
    protected $pixels = [];


    public function setPixel(int $x, int $y, int $intensity): self
    {
        $this->pixels[$x][$y] = $intensity;

        return $this;
    }

    public function manipulate(Manipulation $manipulation): self
    {
        $manipulation->setImage($this)->manipulate();

        return $this;
    }

    abstract public function draw(): string;

    public function save(): bool
    {
        return true;
    }
}


namespace Image\Manipulation;

use Image\Image;

abstract class Manipulation
{
    protected $image;


    public function setImage(Image &$image): self
    {
        $this->image = $image;

        return $this;
    }

    abstract public function manipulate();
}


namespace Image\Manipulation;

class Noise extends Manipulation
{
    public function manipulate()
    {
        $this->image->setPixel(mt_rand(1, 100), mt_rand(1, 100), mt_rand(1, 100));
    }
}

С его использованием:

$image = new Image\CarImage;
$noise = new Image\Manipulation\Noise;

$image->draw();
$image->manipulate($noise)->draw();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...