2012-10-29 4 views
5

Oracle 또는 MySQL과 인터페이스 할 수있는 클래스가 있습니다. 클래스는 "Oracle"또는 "MySQL"이라는 키워드와 두 데이터베이스 유형 (인쇄 대상, 예외시 중지 여부 등)에 대한 표준 매개 변수로 초기화됩니다.클래스를 여러 클래스로 분할하는 가장 Python적인 방법

시작했을 때 필요에 따라 if Oracle do A, elif MySQL do B을 추가하는 것이 쉬웠지만, 하나의 데이터베이스 유형에만 적용되는보다 특수화 된 코드를 추가하면 추악 해집니다. 클래스를 두 개로 분리했습니다. 하나는 Oracle 용이고 다른 하나는 MySQL 용입니다. 중복 코드를 피하기 위해 일부 공유 함수가 있습니다.

이러한 새로운 클래스를 호출하는 가장 복잡한 방법은 무엇입니까? 이 동일한 키워드를 사용하는 래퍼 함수/클래스를 만들고 올바른 클래스를 반환합니까? 이전 제네릭 클래스를 호출하는 모든 코드를 올바른 DB 관련 클래스를 호출하도록 변경합니까?

필요하다면 기꺼이 예제 코드를 모의 하겠지만, 필자는 그것이 필요하다고 생각하지 않았습니다. 어떤 도움을 주셔서 미리 감사드립니다!

답변

4

동일한 키워드를 사용하는 래퍼 함수/클래스를 만들고 올바른 클래스를 반환합니까?

그건 생각합니다. 이러한 함수를 팩토리 함수라고합니다.

def connect_to(db, *args): 
    if db == "MySQL": 
     return MySQL(*args) 
    elif db == "Oracle": 
     return Oracle(*args) 
    else: 
     raise ValueError("unknown database type: %r" % db) 

두 데이터베이스 클래스가 동일한 API를 갖고 있는지 확인하십시오. 오리 타이핑이나 추상 기본 클래스 (ABC)로이 작업을 수행 할 수 있습니다. 후자는 기능이 클래스간에 공유되거나 객체가 데이터베이스 연결을 나타내는 지 알아보기 위해 isinstance 검사를 수행하려는 경우에 유용합니다.

공유 기능의 경우 template method pattern이 자주 사용됩니다.

3

매개 변수를 기반으로 구현을 반환하는 팩토리 클래스를 만듭니다. 그런 다음 DB 유형 모두에 대해 공통 기본 클래스를 가질 수 있으며, 각각에 대해 하나의 구현이 가능하며 팩토리가 매개 변수를 기반으로 사용자에게 올바른 구현을 작성, 구성 및 리턴 할 수 있습니다.

두 클래스가 매우 유사하게 작동하면 잘 작동합니다. 그러나 DB 특정 기능을 사용하기 시작하면 isFeatureXSupported() (좋은 접근) 또는 isOracle() (더 간단하지만 좋지 않지만 DB가 어떤 기능을 가지고 있는지 지식을 응용 프로그램 코드로 옮기기 때문에 메소드가 불량 해집니다.).

또는 둘 모두에 대해 모든 기능을 구현하고 지원되지 않는 경우 예외를 throw 할 수 있습니다. 코드에서 예외를 찾아서 확인할 수 있습니다. 이렇게하면 코드를 더 깨끗하게 만들 수 있지만 실제로는 실제로 사용하지 않고도 기능을 사용할 수 있는지 여부를 실제로 확인할 수 있습니다. 이로 인해 앱 코드에 문제가 발생할 수 있습니다 (예 : 메뉴를 사용 중지하려는 경우 또는 앱이 다른 방식으로 수행 할 수있는 경우).

+2

좋은 조언이지만, 팩토리 클래스도 기본 클래스가 아니면 팩토리 함수를 사용할 수도 있습니다. – Marcin

+0

팩토리 클래스를 사용하면 구성해야 할 때 유용합니다. 그렇지 않으면 너무 많은 매개 변수가있는 함수를 얻게됩니다. –

관련 문제