Лучший способ / шаблон для создания запроса на основе другого сервиса - PullRequest
3 голосов
/ 04 ноября 2011

У меня есть около 20 различных служб, которым я должен отправлять запросы, для которых требуется немного другой набор заголовков.

Неверный устаревший код выглядит примерно так:

row = db.query_for_service()

if row.type == 'foo1'
   // add common headers to request
   // add foo1 specific headers 1
   // add foo1 specific header 2
   // add foo1 specific header 3
else if row.type == 'foo2'
   // add common headers to request
   // add foo2 specific header 1
...
...
...
else if row.type == foo20
   // add common headers to request
   // add foo20 specific header 1
   // add foo20 specific header 2 
   // ...

send_request()

Каков наилучший способ его рефакторинга?Я рассмотрел некоторые шаблоны, которые могут работать здесь (стратегия, конструктор), но я не слишком уверен.

В настоящее время я изучаю и Java, и Python, и я хотел бы подумать о том, как решения будут различаться в двухязыки

Ответы [ 2 ]

2 голосов
/ 04 ноября 2011

Лично я бы сделал что-то в этом роде.

#Put this in the initialisation 
Map foos<row.type,String> = new Map<row.type, String>()
#Populate the map 
map.set('a') = 'headerA specific params x=1'
map.set('b') = 'headerB specific params x=2'
map.set('c') = 'headerC specific params y=3'
map.set ...

Map bars<String,String> = new Map<String,String()
bars.set('fooA') = 'a,b'
bars.set('fooB') = 'a,c'
String commonheader = "HTTP/1.1"


#This would be in a method    
row = db.query_for_service()
String output_header += commonheader
for i in bars.get(fooN).split(','):
    output_header += foos.get(i)
send_request()

В виде псевдо-Java / Python. Карта будет заполнена всем, что вам нужно, затем просто выберите то, что вы хотите, и прикрепите.

1 голос
/ 05 ноября 2011

Вы должны попробовать шаблон Команда .

псевдокод примерно так:

interface Command(){
  void execute();
}

class ConcreteCommandA() implements Command {
  @Override
  void execute(){
    // action 1
  }
}


class ConcreteCommandB() implements Command {
  @Override
  void execute(){
    // action 2
  }
}

и используйте эту структуру в вашем клиенте:

Map<String, Command> commands = new HashMap<String, Command>;
  commands.put("action1", new ConcreteCommandA());
  commands.put("action2", new ConcreteCommandB());

runCommand(String str){
  Command command = commands.get(str);
  command.execute();
}

и т. Д.

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