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, eg:
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?
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;
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.