2011-11-04 44 views
3

我有大約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

可誰downvoted解釋人爲什麼我downvoted?我正在嘗試使用這個問題來改進我的代碼,並弄清楚如何將這個舊代碼重構爲更易於管理。如果這不是問這類問題的適當位置,那麼我應該在哪裏問這個問題? – sasker

+0

你可以給一些示例輸入數據,我不確定我真的明白從db中檢索什麼/正在構建什麼請求/請求什麼。 – EricR

+0

確定使用僞代碼編輯 – sasker

回答

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中。地圖將預先填充您需要的所有內容,然後挑選出您想要和附加的內容。

+0

但我有一套不同的標題,我必須附上每個不同的foos。我附上一根巨大的弦?那麼我們會爲每個富有的重複嗎? – sasker

+0

問題:每個fooN的標題與每個其他fooN都有區別嗎?是否有一個壓倒一切的原因(即你插入的東西)不要將它附加在單個字符串中?聽起來目前所做的是,每個fooN都有一組不同的頭文件。此解決方案只是將每個if語句的頭文件重構爲map,然後將它們附加在fooN上,從而爲沒有IF的更清晰的解決方案做準備。 – EricR

+0

雖然所有請求都有標頭,但FooN可以包含可用標頭列表中標頭的任意組合。所以Foo1可以有A,B,C頭文件,Foo2可以有A,C和Foo3可以有D. – sasker

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(); 
} 

+0

對於我的情況,「命令」會是什麼? buildFoo1Request,buildFoo2Request,buildFoo3Request ...等? – sasker

+0

命令是一個接口。並且每種類型的請求都封裝了實現命令的不同對象。它簡化了其他任務,如操作的保存歷史記錄,撤消/重做操作等。 – mishadoff

+0

抱歉,我不是指命令,我的意思是ConcreteCommand。它與我的例子相對應? – sasker

相關問題