我有大约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,我想了解两种语言中解决方案的不同之处
答案 0 :(得分:2)
就个人而言,我会做的就是沿着这些方向发展。
#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 :(得分:1)
您应该尝试模式Command。
伪代码如下:
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();
}
等等