Шаблоны проектирования относительно утверждений if ... else - PullRequest
0 голосов
/ 03 апреля 2019

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

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

В псевдокоде это будет выглядеть так:

class Printer 
{
  AttributeA a;
  AttributeB b;
  AttributeC c;
  ...
  checkAttributeA(Department departement, Documenttype doctype);
  checkAttributeB(Department departement, Documenttype doctype);
  checkAttributeC(Department departement, Documenttype doctype);
  ...
 };

Printer::checkAttributeA(Department departement, Documenttype doctype)
{
  if (department == DepartmentA) 
  {
     if (doctype == DocumenttypeA) 
     {
        // do somthing
     } 
     else if (doctype == DocumenttypeB) {
        // do somthing else
     } 
     ...
  }
 else if (department == DepartmentB) 
  {
     if (doctype == DocumenttypeA) 
     {
        // do somthing
     } 
     else if (doctype == DocumenttypeB) {
        // do somthing else
     } 
     ...
  }
...
}

В случае паттерна стратегии, мне нужно создать класс для каждого условия, если я понял это правильно. Но он не уверен, что это будет правильным путем, поскольку число условий / классов будет расти экспоненциально с каждым параметром. Есть ли правильный способ справиться с такими сценариями?

1 Ответ

1 голос
/ 04 апреля 2019

Предположим, что есть M отделы и N типы документов, и для каждой возможной комбинации этих двух значений необходимо предпринять отдельное действие.

В такой проблеме есть внутренняя сложностьзаявление, в котором вы не можете покончить с определением того, какими будут все эти действия (M x N), и если каждый атрибут вашего принтера приводит к разным действиям для каждой возможной комбинации отдела и типа документа, то вы должны также определить их отдельно.

Рассмотрим четырехмерную матрицу.Первое измерение - это атрибут, второе измерение - отдел, третье измерение - тип документа, а четвертое измерение - соответствующее действие, которое необходимо выполнить для комбинации этих трех значений.

по крайней мере, нужно определить эти действия:

var matrix = {
  AttributeA: {
    DepartmentX: {
      DocumentP: SomeActionA,
      DocumentQ: AnotherActionA
    },
    DepartmentY: {
      DocumentP: SomeActionB,
      DocumentQ: AnotherActionB
    }
  },
  AttributeB: {
    // similar structure
  },
  // and so on...
};

Теперь у вас может быть одна функция, которая принимает ваш атрибут, отдел и тип документа и выполняет действие:

function takeAction(attribute, department, documentType) {
  // maybe do a sanity check of your inputs
  matrix[attribute][department][documentType](); // calling the action!
}

Таким образомвы отделяете настраиваемые данные от общей логики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...