Я подумываю о создании метода интерфейса с аргументом, который может иметь смешанный тип и действовать как метаданные. Я не знаю заранее тип метаданных, но знаю, что какой-то его тип (или что-то вроде контекста) может потребоваться для реализации внешнего системного адаптера.
Пример на PHP:< /p>
interface AdapterInterface
{
public function someMethod(SomeEntity $entity, mixed $metadata = null): void;
}
class ExternalSystemAdapter implements AdapterInterface
{
public function someMethod(SomeEntity $entity, mixed $metadata = null): void
{
if (! $metadata instanceof MetadataThatAdapterIsAwareOf) {
throw new Exception('Invalid metadata');
}
// do stuff
}
}
class Service
{
public function __construct(private readonly AdapterInterface $adapter)
{
}
public function doSomethingWithEntity(SomeEntity $entity, mixed $metadata)
{
return $this->adapter->someMethod($entity, $metadata);
}
}
$service = new Service(new ExternalSystemAdapter());
$service->doSomethingWithEntity(new SomeEntity(), new SomeMeta());
Я подумываю о создании метода интерфейса с аргументом, который может иметь смешанный тип и действовать как метаданные. Я не знаю заранее тип метаданных, но знаю, что какой-то его тип (или что-то вроде контекста) может потребоваться для реализации внешнего системного адаптера. Пример на PHP:< /p> [code]interface AdapterInterface { public function someMethod(SomeEntity $entity, mixed $metadata = null): void; }
class ExternalSystemAdapter implements AdapterInterface { public function someMethod(SomeEntity $entity, mixed $metadata = null): void { if (! $metadata instanceof MetadataThatAdapterIsAwareOf) { throw new Exception('Invalid metadata'); }
// do stuff } }
class Service { public function __construct(private readonly AdapterInterface $adapter) { }
public function doSomethingWithEntity(SomeEntity $entity, mixed $metadata) { return $this->adapter->someMethod($entity, $metadata); } }
$service = new Service(new ExternalSystemAdapter()); $service->doSomethingWithEntity(new SomeEntity(), new SomeMeta()); [/code] Это запах кода? Можно ли как-то этого избежать?