2013-12-23 66 views
1

這是一個問題和要求的例子。如何從核心功能抽象第三方實施細節?

情景:我們有一個Web應用程序,控制器有一個功能可以執行HTML到PDF的轉換。根據技術的要求和進步,我們必須切換到各種發動機。這意味着我們需要不斷更改核心文件。它甚至可以是一個完成我的工作並且不在本地實施的Web服務。

總體僞Python中當前的架構是:

控制器

def requestEntry(): 
    """Entry point""" 
    html = REQUEST['html'] , css = REQUEST['css'] 
    createPDF(html,css) 

def createPDF(html,css): 
    """Sigh""" 
    #Hardcoding Begines 
    configured_engine = getXMLOption('configured_engine') 
    if configured_engine == "SuperPDFGen": 
     #Returns SuperGen's PDF Blob 
     supergen = SuperGen(html,css) 
     return supergen.pdfout() 
    if configured_engine = "PISA": 
     pisa = PISA(html,css) 
     return pisa.pdf_out() 

這裏的問題是每一個新的引擎需求是在控制器中的代碼更改。而假設我們找到了新的技術,我們必須升級核心軟件版本。

解決它:我能想到的

的一種方法是定義一個簡單的類是這樣的:

def createPdf(data,engine): 
    pdf_render = PDFRender(html,css,engine) 
    return pdf_render.pdf_out() 

所以現在我們保持了PDFRender astracted - 核心版本無需改變任何更多的實現更改,但我們需要在PDFRender類中使用If梯形圖對引擎進行編碼。

爲了擴展這個想法,我可以讓一個約定引擎也是模塊名稱。但是,如果它以Engine的形式給出,它就不適應URL。

def createPdf(data,engine): 
    #Convert the string called engine to a Module ! Sigh 
    import engine Engine!! 
    pdf_render = engine.Engine(data) 
    return pdf_render() 

是否有任何建議的範例或插件適配器機制呢?它應該以URL或Python模塊作爲輸入並完成工作。新的實現應該是獨立的,並且可以插入到現有代碼中,而核心功能沒有版本變化。我怎樣才能做到這一點 ?我認爲核心應該根據服務(python模塊,子進程或url)進行討論,這是我試圖實現的目標。

+1

插件設計可能會有所幫助。 – UmNyobe

+0

http://stackoverflow.com/questions/323202/designing-extensible-software-plugin-architecture是插件架構的鏈接。 – Nishant

+0

stackoverflow.com/questions/383947/what-does-it-mean-to-program-to-an-interface is amazing。 – Nishant

回答

2

添加一個軟件包,您可以粘住渲染器,每個模塊都有一個Python模塊,模塊以「引擎」命名,渲染器類命名爲「PDFRenderer」。然後在包的__init__中掃描目錄中的模塊,從每個模塊中導入PDFRenderer類,然後構建一個enginename:PDFRenderer映射,並使用它獲取引擎的PDFRenderer類。

+0

那意味着方法?然而,__init__掃描是一個新概念,謝謝。現在我唯一的警告是,如果引擎是一個URL - 完全是一個基於Web服務的解決方案。 – Nishant

+1

然後,您將web服務客戶端包裝在'PDFRenderer'中,並傳遞引擎名稱而不是服務url。你將會擁有引擎依賴的選項來設置,不是嗎? –

+0

正確引擎的相關設置可能會在這裏和那裏出現,但這不在PDFRender中,它將位於產品模塊中。基本上,好的是它的HTML5 + CSS輸入和PDF輸出,所以我們已經有了一些規範,這就是爲什麼我們可以抽象它。 – Nishant

1

它看起來像你現在每次更改pdf渲染器都必須更改幾行代碼。代碼簡單易懂。

當然,你可以全部抽象出來,並使用配置文件,並添加一個插件架構。但是你會得到什麼?您不必更改幾行代碼,而是更改插件或配置文件,並且需要維護機器:例如,如果您決定需要將某些標誌傳遞給其中一個渲染器,那麼您必須將該功能添加到您的配置文件或您選擇的任何抽象。

你認爲你會改變pdf渲染器多少次?我的猜測一年最多一次。保持你的代碼簡單,在你真正需要它們之前不要構建複雜的解決方案。

+0

有趣的觀點,我也考慮過。所以你在解決方案中推薦方法1。第一個是因爲我們一直在改變核心版本而被拋棄。 – Nishant