Какие шаблоны проектирования использовать для реализации этой бизнес-логики? - PullRequest
2 голосов
/ 23 октября 2009

Я пытаюсь определить лучший шаблон проектирования, который будет использоваться для веб-службы проверки бизнес-ключей. Основная логическая схема написана ниже. Программа примет параметр и будет использовать поле, помогающее определить путь для поиска в нескольких системах, где можно найти этот бизнес-ключ. Сначала выполняется поиск System1, если не найден, выполняется поиск System2 и System3. Логика поиска System1 зависит от поля в параметре, переданного в исходный метод проверки.

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

С моими реализациями ниже я вижу следующие проблемы:

  1. Каждый метод SearchSystemX должен знать , чтобы вернуть ноль, если бизнес-ключ не найден, так что метод "control" продолжит поиск в других системах.

  2. Каждый SearchSystemX должен знать , как заполнять бизнес-объект, в настоящее время просто реализованный простой примитивной строкой, но это только для примера.

Пожалуйста, дайте мне знать ваши мысли.

public string Validate (string parms) {
 string returnValue = null;

 returnValue = SearchSystem1(parms);

 if (returnValue == null) {
  returnValue = SearchSystem2(parms);

  if (returnValue != null) {
   returnValue = SearchSystem3(parms);
  }
  else if (returnValue == null) {
   if (parms == "Criteria1") {
    returnValue = SearchSystem4(parms);

    if (returnValue == null) {
     throw new ApplicationException("ID Invalid");
    }
   }
   else if (parms == "Criteria2") {
    throw new ApplicationException("ID Invalid");
   }
  }
 }
 return returnValue;

private string SearchSystem1 (string parms) {
 string returnValue = null;

 if (parms == "Criteria1") {
  returnValue = SearchSystem1UsingColumn1(parms);
 }
 else if (parms == "Criteria2") {
  returnValue = SearchSystem1UsingColumn2(parms);

  if (returnValue == null) {
   returnValue = SearchSystem1UsingColumn4(parms);
  }
 }

 if (returnValue != null) {
  returnValue = FetchXYCoordinate(parms);
 }

 return returnValue;
}

Спасибо!

Ответы [ 4 ]

3 голосов
/ 23 октября 2009

Цепочка ответственности

Каждый объект обработки содержит набор логики, которая описывает типы объектов команд, которые он может обработать, и способы передачи тех, которые он не может, следующему объекту обработки в цепочке

Таким образом, вы определяете и абстрагируете SearchSystem (или SystemSearch) и добавляете подклассы следующим образом:

class SearchSystem
{
    //link to the next in the chain 
    SearchSystem next;

    // Basic search, If cannot handle forward to the next.
    public Result search( Criteria c ) 
    {
        Result r = doSearch( c );

        if( r != null ) 
        {
            return r;
        }

        return next.search( c );
    }
    // subclass specific system search
    abstract Result doSearch( Criteria c );
}

class SearchSystemOne: SearchSystem 
{
    Result doSearch( Criteria c )
    {
        // do some system 1 speficif stuff 
        // and return either and instance or null
    }
}
class SearchSystemTwo: SearchSystem 
{
    Result doSearch( Criteria c )
    {
        // do some system 2 speficif stuff 
        // and return either and instance or null
    }
}
.... etc etc. 
// End of the chain
class SearchSystemOver: SearchSystem 
{
    public Result search( Criteria c ) 
    {
        throw new ApplicationException("Criteria not foud", c );
    }
    Result doSearch( Criteria c )
    {
       // didn't we throw exception already?
    }
}

Создание экземпляра

SearchSystem one = new SearchSystemOne();
SearchSystem two = new SearchSystemTwo();
SearchSystem three = new SearchSystemThree();
SearchSystem four = new SearchSystemFour();
SearchSystem over = new SearchSystemOver();

И построить цепочку

one.next = two;
two.next = three;
three.next = four;
four.next = over;

И, наконец, поискать его.

SearchSystem searcher = one;

searcher.search( Criteria.addName("Oscar").addLastName("Reyes"));
1 голос
/ 23 октября 2009

Не зная больше о вашем домене, я могу предложить только незначительные изменения.Во-первых, следует использовать охранные предложения .

Также вы упоминаете, как SearchSystems должны знать, как построить бизнес-объект.Я хотел бы убедиться, что SearchSystems могут быть обработаны полиморфно (таким образом, у вас есть путь к рефакторингу стратегии или некоторому внедрению зависимости).Также я бы предпочел SystemSearcher по сравнению с семейством методов SearchSystem.Затем я вставил бы в SearchSystems фабрику бизнес-объектов.Я бы также разработал поведение с семантикой TryXXX.

public interface ISearchSystem
{
  bool TryGet(string parms, out string businessObject);
}

public class System1Searcher : ISearchSystem
{
  public System1Searcher(BusinessObjectFactory factory) { _factory = factory; }
  private field BusinessObjectFactory _factory;
  public bool TryGet(string parms, out string businessObject)
  {
    // do internal logic
    return _factory.Create(string stuff);
  }
}

public class Service
{
  // is "Validate" the correct metaphor for this logic?
  public string Validate(string parms) 
  {
    string returnValue = null;
    if (new System1Searcher().TryGet(parms, out returnValue)
      return returnValue;

    if (new System2Searcher().TryGet(parms, out returnValue)
      return returnValue;

    if (new System3Searcher().TryGet(parms, out returnValue)
      return returnValue;

    if (new System4Searcher().TryGet(parms, out returnValue)
      return returnValue;

    // this message should be written in terms of the logic of this method
    // such as "Parameters invalid"
    throw new ApplicationException("ID Invalid"); 
  }
}
1 голос
/ 23 октября 2009

Я бы, вероятно, использовал здесь шаблон стратегии, определив интерфейс для поисковых систем:

public interface ISearchStrategy
{
    string Search(string criteria);
}

и затем передает их методу validate (хотя класс валидации может получить их откуда-то еще).

public string Validate(string parms, IEnumerable<ISearchStrategy> searchStrategies)
{
    string returnValue = null;

    foreach(var strategy in searchStrategies)
    {
        if(returnValue == null)
        {
            returnValue = strategy.Search(parms);
        }
    }

    if(returnValue == null) throw new ApplicationException("ID invalid");
    return returnValue;
}
1 голос
/ 23 октября 2009

Возможно, шаблон стратегии .

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

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