2017-01-16 63 views
0

我開發的類管理與外部資源的連接。其職責是閱讀從給定的來源憑證,並返回身份驗證的連接,如:如何重構類似的方法?

def get_svn_connection(self): 
    username, pwd=self.get_credentials("SVN") 
    client=self.get_svn_client(username, pwd) 
    return client 

def get_db_connection(self): 
    username, pwd, url, schema=self.get_credentials("DB") 
    client=self.get_db_client(username, pwd, url, schema) 
    return client 

今天我遇到了新的使用案例:有時用戶需要只得到憑據沒有連接。所以,按照目前的解決方案,我必須創建方法get_svn_credentials,get_db_credentials等等。它看起來很冗餘,所以我想重構這個結構。 我的想法是:

  1. 爲每個連接類型創建子類,併爲他們每個人的定義方法get_connectionget_credentials。問題是:1)我想要一個班級來統治所有的連接; 2)我將不得不使用多繼承(可能在Python,但不會在工作,例如,Java的 - 如果我將滿足未來這個問題)

  2. 創建方法get_connection(type)get_credentials(type)和每一個已知字符串指定的連接類型返回相應的實例。問題是我必須創建一個在OOP中認爲不好的開關。

  3. 使用元編程爲每種連接類型生成方法。不明顯,特定於Python。

    您會如何設計?

+0

您已經有了'get_credentials(類型)',你爲什麼認爲'get_connection(type)'會讓事情變得更糟? – Goyo

+0

@Goyo,它是簡化的代碼。實際上,它被稱爲'get_credentials(「SVN」,[「USERNAME」,「PASSWORD」])'',因此它搜索SVN_USER和SVN_PASSWORD。這是私人功能,沒有計劃用於外部使用。 – fresheed

+0

然後你寫的問題就是誤導。無論如何,我認爲你應該選擇最適合用戶需求的API,然後實施它。 – Goyo

回答

0

你可以有一個證書類,它可以用來驗證另一個函數調用:

class SvnCredentials: 
    def __init__(username, password): 
     self._username = username 
     self._password = password 

    def authenticate(function): 
     return function(self._username, self._password) 

用法:

>>> credentials = SvnCredentials('AzureDiamond ', 'hunter2') 
>>> client = credentials.authenticate(get_svn_client) 
0

只是對讓 - 弗朗索瓦·法布爾答案補充,你可以用下面的方法做一個功能

def get_svn_connection(self, decision_str): 
    if decision_str = "DB": 
    return self.get_connection("DB",self.get_db_client) 
    if decision_str = "SVN": 
    return self.get_connection(decision_str, self.get_svn_client) 

我不認爲你可以做到這一點比這更簡潔,而且我不相信它比吉恩的方式更好...

0
def get_svn_connection(self, credentials=False): 
    username, pwd=self.get_credentials("SVN") 
    if credentials: 
     return (username, pwd)   
    client=self.get_svn_client(username, pwd) 
    return client 

def get_db_connection(self, credentials=False): 
    username, pwd, url, schema=self.get_credentials("DB") 
    if credentials: 
     return (username, pwd, url, schema) 
    client=self.get_db_client(username, pwd, url, schema) 
    return client