使用 class 来存储常量值

Using a class to store constant values

是否有更好的方法来存储以下示例所需的值。我试图在将字符串传递给工厂方法时避免任何可能的错误。

但是,这有什么问题吗?它是否容易测试,是否有更好的方法来实现同样的事情等等

abstract class Types
{
    const Car = 'car';
    const Boat = 'boat';
    const Bike = 'bike';
}

class VehicleFactory {

    public function make($type) 
    {
        if ($type === Types::Car) {
            // create new car
        }
        if ($type === Types::Boat) {
            // create new Boat
        }
        if ($type === Types::Bike) {
            // create new Bike
        }
    }
}

class Client
{
    public function createACar()
    {
        $vehicleFactory = new VehicleFactory();
        $car = $vehicleFactory->create(Types::Car)
    }
}

这看起来像是一个与语言无关的问题,所以我假设像使用 enum 而不是 abstract class 这样的建议是行不通的。

您使用常量表示创建的对象类型的方法是正确的。如果我必须更改任何内容,那将是您的 Client class 使用 VehicleFactory 的方式,以便在对您的代码进行单元测试时提供测试替身:

class Client
{

    private $factory;

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

    public function createACar()
    {
        $car = $factory->create(Types::Car)
    }
}

现在您可以传入 VehicleFactory 的子 class(比如 VehicleMockFactory),它可以创建测试替身而不是创建实际对象:

class VehicleMockFactory extends VehicleFactory {

    public function make($type) 
    {
        if ($type === Types::Car) {
            // create new TestCar
        }
        if ($type === Types::Boat) {
            // create new TestBoat
        }
        if ($type === Types::Bike) {
            // create new TestBike
        }
    }
}

在进行单元测试时,您可以将 VehicleMockFactory 传递给 Client 而不是实际的 VehicleFactory