0

I'm just thinking of API versioning data objects. Let's say you have an object car, which looks like this in version 1 (directory v1):

class Car {
  protected $color;
  protected $brand;
  protected $price;
  protected $custom;

  // getters and setters
}

In version 2, the data object changes (directory v2, $custom removed, added new property $exhaust):

class Car {
  protected $color;
  protected $brand;
  protected $price;
  protected $exhaust;

  // getters and setters
}

We thought of making a "mapper" class, so that we are able to work with different versions in the business logic, e.g.:

Class CarMapper extends Mapper
{
  // needs to have all member variables from all versions
  protected $color;
  protected $brand;
  protected $price;
  protected $custom;
  protected $exhaust;

  public function out($object) 
  {
    $mapperObj = new self();

    // you need to do this for each version of a data object and
    // prepare the mapperObj according the members of the object for
    // this version
    if ($object instanceof CarV1) {
      $mapperObj->color   = $object->color;
      ...
    }
    return mapperObj;
  }
}

I think this approach will lead a "bloated" Mapper class and I thought there might be a better solution using a design pattern. Could we use a factory pattern here?

G-Wak
  • 53
  • 3
  • 12
  • As long as you have parallel active versions of the API, you're going to bloat some part of your code. One piece of advice I'd give you is not to make a new version of the model class for each change. Make all the properties that are version-depedent optional. Then you can have a single mapper/factory/builder that will only conditionally set that property based on the version requested. – El_Vanja Feb 03 '21 at 11:36

1 Answers1

0

I'm don't know what is your situation is but have wrote two object versions is not a best solution. So if you have no ideas to avoid it then you of course you can use the design pattern named factory method https://refactoring.guru/design-patterns/factory-method

In your case it will be something like this

const VERSION = 1;
$app = new App(VERSION)
$car = $app->getCar();

class App 
{
    private $version;

    public function __construct($version)
    {

        if ($version === 1) {
            $this->car = new CarV1()

        } elseif ($version === 2) {
            $this->car = new CarV2()

        } else {
            //Something else

        }

        $this->version = $version;

    }

    public function getCar()
    {
        return $this->car;
    }

}