Я разрабатываю класс, который управляет подключениями к внешним ресурсам. Его ответственность читает полномочия от данного источника и возвращения авторизованных соединений, как:Как реорганизовать подобные методы?
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
и так далее. Он выглядит очень избыточным, поэтому я хочу реорганизовать эту структуру. Мои идеи:
Создание подклассов для каждого типа соединения и для каждого из них определяют методы
get_connection
иget_credentials
. Проблемы: 1) Я хочу, чтобы один класс правил всеми соединениями; 2) Я бы использовать мульти-наследование (возможно в Python, но не будет работать, например, Java - если я встречусь с этой проблемой в будущем)Создать методы
get_connection(type)
иget_credentials(type)
и для всех известных тип соединения, указанный строкой, возвращает соответствующий экземпляр. Проблема в том, что я должен создать переключатель, который считается неудачным в ООП.Использование метапрограммирования для генерации методов для каждого типа подключения. Не очевидна и специфична для Python.
Как бы вы это разработали?
У вас уже есть 'get_credentials (тип)', почему ты подумайте, что использование 'get_connection (type)' ухудшит ситуацию? – Goyo
@Goyo, это упрощенный код. Фактически, это 'get_credentials (префикс, list_of_variables)', вызываемый как 'get_credentials (« SVN », [« USERNAME »,« PASSWORD »]), поэтому он ищет SVN_USER и SVN_PASSWORD. Это частная функция, не предназначенная для внешнего использования. – fresheed
Тогда ваш вопрос, как написано, вводит в заблуждение. В любом случае, я думаю, вы должны просто выбрать API, который наилучшим образом соответствует потребностям ваших пользователей, а затем реализовать его. – Goyo