Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Methods 选择特定方法与一般方法_Methods - Fatal编程技术网

Methods 选择特定方法与一般方法

Methods 选择特定方法与一般方法,methods,Methods,对于公共界面来说,哪种设计更好: WriteValue(DeviceValueType.MachineName,"micks machine"); 或 如果您使用类型1,那么您只需要一个这样的通用接口,您可以通过向枚举中添加项来写入任意数量的DeviceValueType 第二种类型更为具体,因为它将只向由其方法名表示的特定类型写入一个值。但是这些方法在类型安全方面有很大的优势 EG:让我们考虑另一种类型< /P> WriteValue(DeviceValueType.SleepDelay,"

对于公共界面来说,哪种设计更好:

WriteValue(DeviceValueType.MachineName,"micks machine");

如果您使用类型1,那么您只需要一个这样的通用接口,您可以通过向枚举中添加项来写入任意数量的DeviceValueType

第二种类型更为具体,因为它将只向由其方法名表示的特定类型写入一个值。但是这些方法在类型安全方面有很大的优势

EG:让我们考虑另一种类型< /P>
WriteValue(DeviceValueType.SleepDelay,"25");

注意,这里,类型2有一个优势,因为我可以指定预期的类型。如果要使用类型1,则必须将该值强制转换为int,如果该值不在预期范围内,则引发异常。如果我必须通过复杂类型,这将变得更加困难

总而言之:

类型1:泛型。接口只需要公开一个方法。参数没有类型安全性。 类型2:特定。接口将需要与类型一样多的方法。类型安全

解决这个问题的一般建议方法是什么


我使用的是C语言,但我认为这个问题不是特定于语言的。

我来自Python背景,但实际上我会选择这两个选项。使用WriteValue函数,让它完成所有繁重的工作。然后,将WriteMachineName和WriteSleepDelay函数作为简单的WriteValue包装器编写。通过这种方式,您将能够对所有经常使用的函数使用速记函数,对所有不经常调用的函数使用长版本

不过,您可能希望在文档中明确这一工作方式,以便在您知道如何以及为什么这样做之后,必须使用它的人员

另外:我不知道C#中函数调用的代价有多高。如果它们非常昂贵(CPU时间),您可能希望始终使用类型1。

视情况而定:)

另外,第三种可能是同时执行这两种操作:拥有一个通用的
WriteValue()
和一个特定的'WriteSleepDelay()
,它依次调用带有正确参数的
WriteValue()。如果这些方法的实现相当复杂,也就是说,除非将其集中到泛型方法中,否则会有大量冗余代码,那么这是有意义的

对于像
WriteValue
这样的(大概)简单的东西,为了简单起见,我会使用单独的方法

更新:对于继承层次结构,在基接口中使用泛型方法是有意义的。然后,派生类可以添加仅对它们有意义的其他类型安全方法(例如
WriteSleepDelay()


或者,您可能希望在基类中有一个
WriteValue(对象值)
,该基类在子类中被一个适当的类型安全变量覆盖(例如,在子类
SleepTimer
中有一个
WriteValue(整数)
)。在您的具体情况下,这很可能没有意义,但在其他情况下,这可能是理想的。

您应该避免使用所谓的类型1接口。从经验上讲,这种接口很快就会变得杂乱无章。以睡眠延迟为例。您将如何键入检查该字符串是否为正整数?您将得到一个巨大的switch语句。所以至少要把它封装起来


尽管类型2更好,但应该注意的是,它将写操作与写操作所需的数据紧密耦合。我不知道您正在处理的需求(一次写入多次读取?),但您的DeviceValueType enum建议您可以简单地声明一个DeviceConfig类,该类的属性为
机器名
睡眠延迟
,并将其传递给将执行实际工作的设备或DeviceWriter类。但是,如果<代码>机器名是配置,而睡眠延迟实际上是一种方法,您应该考虑将这两个问题分开(即,设备.SalePoE)和设备.WordPosiFig(DeviceConfig)。

< P>首先:我不知道一般规则,或者这种情况下的设计模式,所以我写下我要做的。

如果您不关心参数的类型,请执行以下操作
WriteValue(“micks机器”)。但是,不要做任何技巧,比如格式化整数与字符串不同,等等,只需简单地编写您得到的字符串,并让调用者进行翻译。(第0类)

我决不会做你喜欢的那种事。为什么?您提到了一些原因(类型安全)。但也为了可读性:你最终会做swtiches或者else。而且,如果您关心干净的代码,那么您最终也会编写带有签名的私有助手方法,如
WriteMachineName(“Micks机器”)(与类型2相同)

我更喜欢类型2,对于简单类型,可能与类型0混合使用,例如
WritePlain(“Micks机器”);写入数(3.4)


注意:在类型1和2中,您将一些业务代码移动到这些方法中。这既不好也不坏,但你必须选择它是否适用于你的情况(连贯性)。相反,类型0在该类中保留从类型到字符串的转换逻辑。

方法1的最大优点是可扩展性。例如,向枚举添加新值只需要编辑一个方法,而在案例2中需要添加和编辑多个方法。忽略实际的方法名称和枚举;我不担心CPU时间,而是担心可用性和可读性。如果我选择类型2,并且我有20种类型,那么接口会很快变得非常拥挤。函数调用并不太昂贵,但我认为类型转换可能需要更长的时间(可能需要相当长的时间,取决于程序的其他功能以及需要转换的类型的大小)。我明白两种方法的利弊;我在我的帖子里提到过他们。我的问题是:在这样一个场景中,您有不同参数的类似操作,那么
WriteValue(DeviceValueType.SleepDelay,"25");
WriteSleepDelay(25);