代码之家  ›  专栏  ›  技术社区  ›  Chance

C++中的单一责任——我应该用朋友类或更多的访问器来实现吗?

c++
  •  4
  • Chance  · 技术社区  · 16 年前

    我希望遵循C++中的单一责任原则。但是,当我分解类时,为了让类彼此“看到”,我似乎有以下选择:

    1. 为每个类添加更多的访问器
    2. 使班级成为彼此的朋友
    3. 改进设计(可能我必须做1或2这一事实表明我的设计有缺陷)

    朋友和访问者的问题可能已经在前面讨论过了,但我不知道在实现单一责任方面是否有一个更有利的问题。

    4 回复  |  直到 15 年前
        1
  •  2
  •   Michael Kristofik    16 年前

    既然您有一组需要一起工作的类,那么您应该考虑 怎样 他们应该一起工作。如果它是通过访问函数或朋友来实现的,那么您将紧密耦合这些类。将来很难去上一个做了不同事情的新班级。测试这些类也很困难,因为它们都是相互依赖的。

    考虑创建一个接口类,定义类应该如何通信。除非涉及到一些特殊的特权,否则这个接口还将定义其他人如何与他们通信。这样,就打破了类之间的相互依赖关系。以后的任何更改都将本地化为所涉及的类。没有人需要改变(或者重新编译)。

        2
  •  4
  •   Michael Kristofik    16 年前

    我一直认为这条规则是错误的。大多数班级都有几个责任,而且没有造成任何伤害。考虑一个银行账户类别-它可能有责任:

    • 维护客户详细信息
    • 允许借贷交易
    • 提供当前余额
    • 向安全部门报告可疑交易

    当然,这些职责可能会使用帐户所包含的其他类来实现。

        3
  •  3
  •   Peter Ruderman    15 年前

    如果你 必须 将私有数据从一个类公开给另一个类,而不是使第二个类成为朋友。为您的私有数据创建一个访问器会首先破坏使其私有化的目的。单一责任主体与此无关。

    编辑

    为了回应下面迪玛的评论,也许我说“目的”有点过分了。毕竟,使数据成员私有化的原因不止一个。Dima指出,其中一个原因是保护对象的完整性。访问器可以做到这一点。

    但第二个原因(在我看来更重要)是隐藏类的实现细节。一旦添加了公共访问器,就无法控制有多少其他类引用了类的实现细节。随着时间的推移,由于对其他类的级联影响,这会使修改实现变得非常困难。

    朋友类虽然远不是完美的,但至少可以让您严格控制有多少类会受到您的更改的影响。另一个好处是,当您进行更改时,您确切地知道哪些类可能会受到影响。因此,当您必须共享类的内部构件时,它们是更好的选择。但最好的选择是(当然)根本不公开实现细节。

        4
  •  1
  •   MSN    16 年前

    您还可以选择4:添加更多的类来表示类之间的不同角色/交互。

    这至少更符合德米特定律。