Как оптимизировать этот класс диаграмм UML для генерации документов

Согласно этой диаграмме классов, целью которой является моделирование генерации нескольких типов документов:

введите описание изображения здесь

больший размер доступен здесь: https://www.dropbox.com/s/heub3dmh7sznkih/document_generation.png?dl=0

В клиентском коде будет использоваться класс DocumentGenerator, который является фабрикой документов, описывающий тип необходимого документа и службу (проверка необязательна, требуется только для документов отправки).

Я борюсь с классами, окрашенными в красный. Если бы все страховые компании использовали одинаковые модели документов для выставления счетов, оценки и т. Д., Это не было бы большой проблемой. Но есть одна компания, которая нуждается в другой модели документа отправки, и это очень вероятно случится с большим количеством компаний, не только с отправкой, но и с остальными документами.

Угадайте, что произойдет, если я специализирую каждый подкласс документа для каждой компании? Это был бы кошмар дублирования кода.

Два шаблона дизайна (стратегия или же декоратор) может удовлетворить мое требование, чтобы отдать предпочтение композиции, а не наследованию, но я не могу понять, как передать идею.

Любое предложение приветствуется.

Это ссылка на файл XMI этой схемы, если вы хотите использовать его:
https://www.dropbox.com/s/n1l5ohdnojvvkze/documents_generation.xmi?dl=0

РЕДАКТИРОВАТЬ:

Я понимаю, как это сделать. Возможно, новый класс не понадобится. Реализация (PHP):

// DocumentGenerator Class
class DocumentGenerator {

const INVOICE_TYPE  = 1;
const ESTIMATE_TYPE = 2;
const DISPATCH_TYPE = 3;

private __construct() {}

public function getInstance($type, Service $service)
{
switch($type) {
case self::ESTIMATE_TYPE:
$document = new Estimate($service);
break;
case self::DISPATCH_TYPE:
$document = new Dispatch($service);
break;
default:
case self::INVOICE_TYPE:
$document = new Invoice($service);
}
return $document;
}
}// Document Class
abstract class Document {

protected $service;

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

abstract protected function show();
// ....
}// Invoice Class
class Invoice extends Document {

const PATH_SEGMENT = 'invoice';

public function show()
{
// the key point
$this->view->setPath(self::PATH_SEGMENT . '/' . $service->getCompanyName());
$this->view->create();
}

// ...
}

// creating an invoice, no matter the company
$document = DocumentGenerator::getInstance(DocumentGenerator::INVOICE_TYPE, $service);
$document->show();

Название компании и тип документа приведут к правильному шаблону для использования представлением. Я все еще не уверен, является ли это хорошим решением, так как у меня есть жестко заданные соглашения об именах для достижения определенного файла шаблона.

Любые другие предложения?

0

Решение

Если у вас разные требования, вам, вероятно, потребуются разные реализации. Если у вас есть какой-то общий формат документа, вы можете создать некоторый суперкласс, охватывающий этот документ. И если у вас есть разные реализации для разных компаний, то вам нужно либо реализовать совершенно разные классы Dispatch / Estimate / Invoice, но вы найдете некоторое обобщение (которое позволит повторное использование кода). В любом случае: разные требования приводят к другому коду. Я бы не увидел, как это приведет к кошмару. Альтернативой всегда является (хотя в большинстве случаев это невозможно из-за болванов) убедить или руководить каким-то распространенным форматом документа.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]