這是一個問題和要求的例子。如何從核心功能抽象第三方實施細節?
情景:我們有一個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)進行討論,這是我試圖實現的目標。
插件設計可能會有所幫助。 – UmNyobe
http://stackoverflow.com/questions/323202/designing-extensible-software-plugin-architecture是插件架構的鏈接。 – Nishant
stackoverflow.com/questions/383947/what-does-it-mean-to-program-to-an-interface is amazing。 – Nishant