【问题标题】:When creating method parameters should I use built in data types or interfaces? C#创建方法参数时,我应该使用内置数据类型还是接口? C#
【发布时间】:2017-07-08 18:13:31
【问题描述】:

下面创建的两种方法之间哪个被认为是更好的做法? MakeCallV1 更简单,代码更少。 MakeCallV2 对扩展开放并遵守 SOLID 原则。

如果认为 V2 更好,那么创建使用内置数据类型(字符串、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; }
}

【问题讨论】:

  • 由于contact 不包含任何行为,两者都将遵循 SOLID 原则。当然,introducig class Contact 将是更“广泛”的解决方案,因为当您为联系添加更多参数时,您不需要更改方法的签名。特别是在这种情况下,您根本不需要界面

标签: c# methods types parameters interface


【解决方案1】:

像往常一样 - 视情况而定。

如果它只是一个简单的例子,并且在逻辑上该方法需要两个参数,那么没有理由将它们放在一个对象中,更不用说创建一个接口了。

如果已经有一个对象包含这两个参数,你可以考虑把这个函数移到对象本身。

但是,在某些情况下,将参数包装在一起确实有意义,那就是函数签名包含太多参数的情况。 然后,将它们提取到一个类中可能是明智之举。

【讨论】:

    【解决方案2】:

    如果 V2 被认为更好 [不传递原语],那么不创建使用内置数据类型(字符串、int 等)的方法是否是一个好的经验法则?

    如果这是一个好的经验法则,那么 .NET 框架和/或许多其他 API 将不会在其中包含此类方法。这显然不是真的,所以你不能简单地断定将原语传递给方法不是一个好主意。

    如何在创建一个接受原语和自定义类型的方法之间做出决定?

    问自己这个问题:客户将如何使用我的课程?客户我的意思是任何将使用您的课程的人。要回答这个问题,您可以先检查一下它现在是如何使用的。

    1. 如果参数相互关联,那么自定义类型会更好。
    2. 如果参数彼此不相关,则基元可能是一个更好的主意。

    查看您的代码,我会选择选项 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 的内容,因此属性将属于同一个对象,因此是相关的

    最后一点要考虑

    如果您的方法接受原语,并且您稍后决定您的方法需要额外的输入,您将需要更改您的方法签名(合同、公共接口),这将产生副作用:您的客户将需要更改。

    【讨论】:

    • 问自己这个问题:客户将如何使用我的课程? - 这种方法有一个名称 - 测试驱动开发 :)
    • 感谢您的评论,但我不同意这种方法称为测试驱动开发。虽然,在 TDD 中这可能会变得很明显。
    • 所以这取决于 MakeCall 的目的。这不是“更好的实践”,一个不是更好,它们是非常不同的方法。 MakeCallV1 需要名称和号码才能工作。它调用一个名称和一个数字。这些信息可能相关也可能不相关,MakeCallV1 不在乎。 MakeCallV2 需要一个联系人才能工作。它调用Contacts,名字和号码是相关的。
    猜你喜欢
    • 2020-02-13
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 2019-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多