这被认为是下面创建的两种方法之间更好的做法? MakeCallV1更简单,代码更少。 MakeCallV2对扩展开放并遵守SOLID原则。
如果认为V2更好,不创建使用内置数据类型(string,int等)的方法是否是一个好的经验法则?
public class Caller
{
public void MakeCallV1(string phoneNumber, string name)
{
//Using built-in data type string
}
public void MakeCallV2(IContact contact) {
//Using IContact
var name = contact.Name;
var number = contact.PhoneNumber;
//Make call code
}
}
public interface IContact
{
string PhoneNumber { get; set; }
string Name { get; set; }
}
答案 0 :(得分:0)
总是如此 - 这取决于。
如果只是一个简单的案例,并且逻辑上该方法需要两个参数,那么就没有理由将它们放在一个对象中,更不用说创建一个接口了。
如果已经存在包含这两个参数的对象,您可以考虑将此函数移动到对象本身。
但是,有些情况下将参数包装在一起确实有意义,而且当函数签名包含太多参数时也是如此。 然后,将它们提取到一个类可能是一个聪明的举动。
答案 1 :(得分:0)
如果V2被认为更好[不传递原语],那么不创建使用内置数据类型(string,int等)的方法是否是一个好的经验法则?
如果这是一个很好的经验法则,那么.NET框架和/或许多其他API将不会有这样的方法。这显然不是真的所以你不能简单地断定将原语传递给方法不是一个好主意。
如何决定创建接受基元与自定义类型的方法?
问自己这个问题:客户如何使用我的班级? 客户我指的是任何会消耗你班级的人。要回答这个问题,您可以先了解一下如何使用它。
查看您的代码,我会选择选项1.为什么?因为看起来你在管理联系人;因此,您的客户端类将具有实现接口IContact
的类型,并且参数彼此相关。
你的意思是什么参数彼此相关?
考虑这种方法签名:
public void MakeCallV1(string phoneNumber, string name)
我基本上可以做这个客户:
// company is some object of Company class
var phoneNumber = company.PhoneNumber;
var name = contact.Name;
MakeCallV1(phoneNumber, name);
我传递的参数不属于同一个对象,因此没有关系且它们不相关。
现在考虑这个方法签名:
public void MakeCallV2(IContact contact)
在此方法中,客户端将传递实现IContact
的内容,以便属性属于同一对象,因此相关。
要考虑的最后一点
如果您的方法接受原语,并且您稍后决定您的方法需要额外的输入,则需要更改方法签名(合同,公共接口),这将产生副作用:您的客户需要更改。