繁体   English   中英

工厂类特定泛型函数的适当位置(抽象类?)

[英]Appropriate place for factory class specific generic functions (abstract class?)

我还没有在Stack Overflow上找到针对这个特定问题的答案,所以我将其发布在这里。

我有一个工厂类,该类根据需要的数据库从抽象类生成数据库处理对象(请参见代码)。

我的问题是这个; 我有一些仅适用于数据库处理程序的通用方法...所以我认为将它们放入自己的模块中是不合适的...但是我不确定放置它们的适当位置。

将它们放在抽象类中当然可以,但是我不知道那是它们被接受的地方。

抽象类

class DBHandlerAbstract(object): # ABSTRACT CLASS ---

    __metaclass__ = abc.ABCMeta

    # I HAVE TO BE OVERRIDDEN
    @abc.abstractmethod
    def open(self):
        raise NotImplementedError

    # I HAVE TO BE OVERRIDDEN
    @abc.abstractmethod
    def close(self):
        raise NotImplementedError

    # SHOULD THIS GF GO HERE OR ELSEWHERE???
    def _check_host(self):
        print 'this will be the same for all dbhandler objects'

工厂级

class DBHandler(object): # FACTORY CLASS ---
    """
    This is a factory class that will call and return a subclass.

    It is NOT an abstract class.

    The objects classes that are instantiated by this factory will be 
    subclasses of DBHandler  
    """
    @staticmethod
    def handler(service, *args, **kwargs):
        # Microsoft SQL (mssql)
        if      re.match("^(\s*)ms(\s*)sql.*$", str(service.lower())):
            return DBHandler_MSSQL(*args, **kwargs)

        # MySQL
        elif    re.match("^(\s*)my(\s*)sql.*$", str(service.lower())):
            return DBHandler_MYSQL(*args, **kwargs)

        else:
            log.error(MSG.DBHandlerNotProvided())
            raise TypeError('DBHandler service not provided.')

功能类

class DBHandler_MSSQL(DBHandlerAbstract): # FUNCTIONAL CLASS ---
    def __init__(self, *args, **kwargs):

        self.args       = args
        self.kwargs     = kwargs

        self._check_host()

        ...stuff and things...

gethandler.py

class test(object):

    def __init__(self):
        app_name   = 'dbhandler_test'
        logfile    = 'system'
        log_level  = 10
        screendump = True

        DBO = DBHandler.handler('mssql')

        ...stuff and things...

让我们通过排除替代品来解决该设计问题:

  • 如果您不打算在抽象基类中实现公共保护功能,则必须在具体后代中重复其实现,这将违反DRY原理
  • 如果您要让协变handler()工厂的产品汇总_check_host实现mixin -style,则具体的DBHandler_XXXX不能满足其自己的ctor要求,因此将自身隐式抽象。 因此,将具有有效的具体产品实例,但没有有效的产品类,这不仅不利于维持工厂的生产模式。

显然,您的设计要优于那些柔术。

但是您可以考虑什么

  • 如果对所有DBHandler_XXXX子代都可行(!)-

呼吁_check_host在抽象基类构造函数,并在适当的时候从DBHandler_XXXX显式调用构造函数那个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM