使用 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
。
是否有更好的方法来存储以下示例所需的值。我试图在将字符串传递给工厂方法时避免任何可能的错误。
但是,这有什么问题吗?它是否容易测试,是否有更好的方法来实现同样的事情等等
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
。