在我讨论接口方法是否应该返回Custom对象与原始类型的讨论中提出了一个问题。
e.g。
public interface IFoo
{
bool SomeMethod();
}
vs
public interface IFoo
{
MyFooObj SomeMethod();
}
MyFooObj在哪里:
public class MyFooObj
{
bool SomeProp{get;set;}
}
这个论点是你可以在将来轻松地向对象添加属性而无需更改接口契约。
我不确定这方面的标准指南是什么?
答案 0 :(得分:10)
IMHO更改MyFooObj与更改/添加IFoo接口的方法相同 - 所以我不认为添加另一个抽象是个好主意 - 请记住YAGNI
答案 1 :(得分:7)
我的标准回答是 - YAGNI。
如果结果是这样,你总是可以改变一些东西,特别是如果你控制应用程序的完整源代码以及如何使用界面。
为了预测未来而包装布尔值只是在当前不需要时添加复杂性和额外的抽象层。
如果你在你的代码库中使用DDD和特定的建模技术,如果它们在你的域中是有意义的话,将这些别名设置为布尔值是有意义的(但我不能看到这是一个布尔值的情况) )。
答案 2 :(得分:3)
我没有看到在自定义对象中封装基本类型的重点。
如果更改了此自定义对象的定义,则实际更改了合同,因为该函数不会返回相同的内容。
我认为这又是一种过度设计的“模式”。
答案 3 :(得分:3)
没有关于此的一般指导原则。
正如您所指出的,如果您在返回类型周围有语法,那么 强烈认为可能会发生变化,或者可能需要在将来进行更新,这可能会更好返回复杂类型。
但实际情况是,在大多数情况下,最好保持简单并返回原始类型。
答案 4 :(得分:2)
这在某种程度上取决于你喜欢什么。我的意见是,在你的示例中,由于这些原因,我会在接口定义中坚持使用简单的bool:
恕我直言,只有当需要一定程度的复杂性/分组时,对象才有意义。
答案 5 :(得分:2)
如果不需要开头,则不应该包装它,更改对象内部返回的内容与更改破坏规则的第一个接口的接口相同。
它正在设计扩展,YAGNI(你不需要它)。
作为旁注,在我的职业生涯早期,我被告知这样的事情。
答案 6 :(得分:2)
如果你需要返回一个超过布尔值的东西,你很可能也会修改界面的其他部分。不要让事情变得比他们需要的更复杂:简单是可靠性的先决条件。
答案 7 :(得分:1)
我想提一下,如果MyFooObj在一个名为strong的程序集中,你更新它,它的版本会更新 - 旧版客户端会因版本不匹配而立即中断(例如InvalidCastException)(它不会尝试除非他们使用新版本重新编译,否则由于强名称而导致部分绑定。你还是改变了接口合同。所以最好保持简单,返回主要类型并更明确地声明你的合同变更。
答案 8 :(得分:1)
除了其他答案之外,向自定义类添加新字段在技术上仍然是对界面消费者的潜在重大改变。 Link