OOP - 填充对象的最佳方法

时间:2017-05-15 23:31:37

标签: oop solid-principles

我尝试跟随OOP和S.O.L.I.D获取我的代码并遇到了一个主题,我不确定将其与OOP对齐的最佳方式。

如果我有一个具有不同属性的对象,那么填充这些属性的理想方式是什么?

  1. 如果可能,对象是否填充它们?
  2. 应该单独的代码将值分配给属性吗?
  3. 我有以下示例(Python),我根据我认为最好的方式创建了它。

    Object具有填充属性的方法,因此如果您实例化Object,在这种情况下是Account with和Id,它应该自动填充属性,因为可以使用DB和API使用ID检索它们。

    class Account:
        def __init__(self, account_id):
            self.id = account_id
            self.name = None
            self.page = Page(self.id)
    
        def populate(self):
            self.get_name()
    
        def get_name(self):
            ''' Code to retrieve Account name from DB with account_id '''
            self.name = <NAME>
    
    class Page:
        def __init__(self, account_id):
            self.id = 0
            self.name = None
            self.user_count = 0
    
            self.populate()
    
        def populate():
            self.get_id()
            self.get_name()
            self.get_user_count()
    
        def get_id(self):
            ''' Code to retrieve Page Id from DB with account_id '''
            self.id = <Page_ID>
    
        def get_name(self):
            ''' Code to retrieve Account name from DB with account_id '''
            self.name = <NAME>
    
        def get_user_count(self):
            ''' Code to retrieve user_count from API with page_id '''
            self.user_count = <user_count>
    

    所以不要做类似的事情:

    account = Account()
    account.id = 1
    account.name = function.to.get.account.name()
    account.page = Page()
    account.page.id = 1
    

    我会让它由班级本身管理。

    我能看到的问题是依赖于DB和API类/方法,这与我理解的S.O.L.I.D(D - 依赖性倒置原则)相反。

    对我来说,让类处理这个是有意义的,今天我有一些类似的代码可以描述Object,然后在一个单独的Setup类中填充Object属性,但我觉得这是不必要的。

    我为OOP / S.O.L.I.D找到的文章没有涵盖这一点,我也没有找到任何有关如何使用OOP处理此事的解释。

    感谢您的帮助! 迈克尔

2 个答案:

答案 0 :(得分:0)

你的设计似乎还算不错。试试看@ Builder Pattern和Composite模式。对于你违反D原则的问题。

  

我能看到的问题是依赖于DB和API类/方法,这与我理解的S.O.L.I.D(D - 依赖性倒置原则)相反。

我想,依赖关系已被抽象为单独的组件。该组件负责提供合同所需的数据。您的实现应独立于该组件内部的功能。用于访问数据库和数据API的DAO层可以帮助您实现这一目标。

您的系统将拥有的依赖项是DAO组件。这可以用不同的方式注入。有一些框架可以帮助您,或者您可以在需要时使用工厂,构建器和单例模式的某些组合来控制对象和注入的创建。如果它是单个数据库实例或LogFile,您也可以考虑使用Singleton来获取组件。

希望它有所帮助!

答案 1 :(得分:0)

在查看SOLID和OOP时,关键是分析它的作用并分离各种元素,以确保它们不会混合在一起。如果他们这样做,代码往往变得脆弱,难以改变。

在考虑SOLID原则时,查看Account类需要回答几个问题。第一个是Account类的责任是什么?单一责任原则会说只有一个理由可以改变。那么Account类是否存在以从DB中检索相关信息,或者它是否存在用于其他目的?如果出于某种其他目的,它有多重责任,代码应该重构,以便该类承担单一责任。

通常在从数据库检索数据时使用OOP,使用存储库类从数据库中检索对象的信息。因此,在这种情况下,用于从数据库中检索信息的代码将从Account类中提取出来并放入此存储库类:AccountRepository。

依赖性反转意味着Account类不应该显式依赖于AccountRepository类,而Account类应该依赖于抽象。抽象将是一个没有实现的接口或抽象类。在这种情况下,我们可以使用名为IAccountRepository的接口。现在,Account类可以使用IoC容器或工厂类来获取存储库实例,同时只知道IAccountRepository