За последние несколько лет я занимался проектами, в которых мы столкнулись с подобной проблемой в нашей иерархии объектов, которая всегда вызывает проблемы. Мне было любопытно, знал ли кто-нибудь о классическом шаблоне дизайна OOP (Java, C#, PHP5 и т. Д.), Который мог бы изящно справиться с этой ситуацией.Дизайн-шаблон для группировки похожих объектов вместе
Скажем, у нас есть существующая система. Эта система имеет, помимо прочего, два типа объектов, каждый из которых имеет индивидуальный класс. Скажем
Заказчик
SalesRepresentative
По историческим причинам, ни один из этих классов наследуют от базового класса или имеют общий интерфейс.
Проблема, которую я видела, неизбежно, что новая функция выясняется, что требует от нас рассмотрения Клиента и SalesRepresentative как одного и того же типа Объекта. То, как я видел это обработано в прошлом, чтобы создать новый класс, который включает в себя переменную-член для обоих, а затем каждый метод будет работать на объекты по-разному в зависимости от того, который установлен
//pseudo PHPish code
class Participator
{
public $customer;
public $salesRepresentative;
public function __construct($object)
{
if(object is instance of Customer)
{
$this->customer = $object;
}
if(object is instance of SalesRepresentative)
{
$this->salesRepresentative = $object;
}
}
public function doesSomething()
{
if($customer)
{
//We're a customer, do customer specific stuff
}
else if($salesRepresentative)
{
//We're a salesRepresentative, do sales
//representative specific stuff
}
}
}
Есть более грациозный способ справиться с такой ситуацией?
+1: Хороший пример шаблона адаптера. – Adamski
+1 Аналогичная логика для предложения OP, но гораздо легче читать и поддерживать, чем if/else block в каждом методе. Возможно, пара со статическим заводским методом, если вы не знаете тип до выполнения. –
+1 - но вам нужно будет либо добавить фабрику для создания соответствующего участника-участника, либо изменить новую строку «Заказчик» (новый клиент()), чтобы вместо этого создать ClientWrapper. –