【发布时间】:2018-10-30 20:24:56
【问题描述】:
我一直在阅读 Robert C. Martin 的 Clean Code。他在其中指出,函数应根据需要使用最少数量的参数,并且函数名称应遵循项目范围的命名约定,同时避免无缘无故的上下文。
例如,如果我为这个问题写了一个简单的类,Car:
public class Car
{
internal string make { get; set; }
internal string model { get; set; }
public Car(string make, string model)
{
this.make = make;
this.model = model;
}
}
还有一个班级Cars:
public class Cars
{
internal List<Car> cars { get; set; }
public Cars(List<Car> cars)
{
this.cars = cars;
}
public Car GetCar(string make)
{
foreach (Car car in cars)
{
if (car.make == make) return car;
}
return null;
}
public Car GetCar(string model)
{
foreach (Car car in cars)
{
if (car.model == model) return car;
}
return null;
}
}
显然这不会编译,因为名为 GetCar 的函数具有相同的函数签名。
通常我可以通过重命名函数GetCarByMake 和GetCarByModel 或类似的名称来解决这个问题,但文本似乎表明这不是最佳实践。其他时候,我可能会添加一个额外的未使用参数来区分它们。
我的下一个想法是为Car 中的每个属性创建一个类;有一个包含字符串属性的Make 和Model 类。但是,这似乎引入了不必要的开销。
那我很好奇,我怎样才能实现/命名多个函数,它们通常做类似的事情,具有相同的参数数据类型,并输出相同的数据类型,而没有不同的函数名称?另外,我对这个问题或类似主题的额外函数重载或多态性不感兴趣;我想知道关于课程的答案,因为它们目前没有重大变化。我目前能看到的唯一答案是为每个属性创建类。
如果需要任何澄清或更改,请告诉我。
编辑: 正如一些附加信息一样,这纯粹是一项学术练习。从专业上讲,我会简单地创建具有不同名称的方法并完成它。如 cmets 中所述,它简单、可维护且有效。
【问题讨论】:
-
对于它的价值,如果您不愿意添加接口等 - 我会给方法不同的名称。它很好,简单,易于阅读和理解,并且可以编译。
-
@mjwills 好点。我已经改写了我的问题以删除基于意见的方面并使其成为一个简单的编程问题。感谢您的提醒!在旁注中,我认为使用不同的方法名称是最好的方法。但是,我想看看是否有其他方法。
-
可以有不同的方法,所有方法都有效且干净。有些会使用方法重载,有些可以使用不同的方法,有些可以使用带有动态内联 Linq 查询的默认值参数。如果可以使用适当的文档和命名约定来维护代码,那么所有这些都可以是干净的。这是不可衡量的,除非有人从全球收集源代码来分析模式和设计原则。
-
@RyanSchlueter 我知道我可以重命名这些方法并且没问题(正如我的问题所证明的那样)。我的问题是是否可以在不使用虚拟参数的情况下保持相同的方法名称,并避免为我的属性使用类。
标签: c# architecture software-design