【问题标题】:Does ToString() method violates SRP? [closed]ToString() 方法是否违反 SRP? [关闭]
【发布时间】:2013-04-28 01:43:07
【问题描述】:

正如标题所述,为什么任何对象都应该继承 ToString() 方法(例如在 C# 或 Java 中)并以某种方式将其转换为 String?在某些情况下,这不是违反单一责任原则吗?我的意思是,如果您的对象不需要转换为字符串,那么您最终将对您的对象承担更多责任。

【问题讨论】:

  • 我不同意所有类都应该定义toString() 方法。就个人而言,在编写公共 API 时,为了其他开发人员,我在所有类中定义了 toString() 方法,但在开发内部时,我只在必要时定义它,因此遵循 SRP。
  • 对象是否违反了 SRP,在需要时定义了其非常自己的表示为String 的特定方式?恕我直言,这与 SRP 本身无关,而是与对象所需的功能有关。
  • @Vulcan 我并不是说任何对象都必须重新定义 ToString(),但无论如何它们必须具有该方法,即使特定子类型不应该有责任“转换”其值到字符串。

标签: c# java oop solid-principles single-responsibility-principle


【解决方案1】:

从某种意义上说,ToString() 确实违反了单一职责原则。转换为字符串表示不应该必然成为每个对象类型的要求。在 C# 中,GetHashCode() 可以说更糟——而且,在每种类型上都定义了。这可以很容易地通过其他一些机制来完成(即:一个可选接口,以及一个只负责将任何对象转换为字符串的类,等等)。

这是实用性与正确性的问题。在每个对象上都有一个提供字符串表示的方法(可以说)使一些事情总体上更简单,但代价是让每个对象都实现它。话虽如此,如果对象对默认实现感到满意,则无需承担此责任。

【讨论】:

  • 任何类对象X 应该能够确定其任何成员的行为是否与Y 引用的对象的行为不同(任何使用引用相等实现Equals 的类将符合该描述,因为如果 XY 是不同的对象,则在 XY 上调用 .Equals(X) 将产生不同的结果)。 Equals 提供的等价关系的有用性可以通过与之一致的GetHashCode() 方法大大增强。
  • 即使在语义上让想要比较对象的代码在提供比较方法时使用比较方法,并在没有提供比较方法时测试引用相等,无条件调用已知的虚拟方法存在比测试一个对象是否具有它可能具有或不具有的虚拟方法要快]。
  • an optional interface 是什么意思——你的意思是一个标记界面?如果没有,这个接口签名中会有哪些方法?
猜你喜欢
  • 2013-07-22
  • 2017-06-03
  • 1970-01-01
  • 1970-01-01
  • 2011-10-12
  • 2020-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多