【问题标题】:Functions without arguments - what is their role in software design? [closed]没有参数的函数——它们在软件设计中的作用是什么? [关闭]
【发布时间】:2016-04-20 19:28:57
【问题描述】:

Robert Martin 在他的“清洁代码”一书中指出,函数参数的理想数量为零。大多数人都会同意,太多的函数参数会导致很多问题。但据我所知,零参数的函数至少属于以下类别之一:

  1. 函数很简单,总是返回相同的值。
  2. 该函数缺乏引用透明性,其返回值取决于外部可变状态。
  3. 函数的目的是它的副作用。

现在类型 (1) 的函数并不是真正有用,而 (2) 和 (3) 应该避免使用,原因众所周知。

我知道我提到的书是关于 OOP 的,所以函数通常属于一个对象,并获取作为隐式参数传递的对象引用。但是,访问对象属性仍然意味着 (2) 或 (3)。

那么我错过了什么?

如果您回答这个问题,请不要仅仅表达您的意见,而是提供合理的论据或具体示例。否则它可能会被关闭。

【问题讨论】:

  • 调用该方法的对象成为唯一的参数。
  • @IgnacioVazquez-Abrams:所以您会认为对象引用等同于参数,这意味着如果访问或修改(2)和(3)不适用?
  • 甚至在某些情况下(例如,增量解析文档)(1)。
  • @IgnacioVazquez-Abrams 没有输入参数的静态方法怎么样?
  • @DStanley:IMO,静态方法是一种将程序主义强加到面向对象语言上的方法。

标签: oop functional-programming language-agnostic


【解决方案1】:

那么我错过了什么?

马丁声明中的关键词是“理想”。如果您继续阅读,他会深入介绍具有一个、两个和三个参数的函数,但仅在一个上下文中提到 niladic 函数 - 测试。他声称它们是微不足道的测试,大概是因为只有一种可能的结果,它要么是对的,要么是错的。

所以这是一个理想,并且从中得到的原则是参数越少越好。在现实中,显然,这个理想很少能实现。函数的目的通常是通过对象或系统状态直接或间接地获取输入(请注意,我也将这些“参数”称为与 Martin 的分析一致),并且提供输出。当你有多个参数时,测试用例的数量呈指数增长,维护更加困难等等。

所以你没有“错过”任何东西,只要你认识到这是一个理想的目标,而不是你应该把它当作一个绝对的东西。 p>

C# 中“纯”niladic 函数的一些示例:

DateTime.MinValue
String.Empty

C# 中返回对象或系统状态的 Niladic 函数:

DateTime.Now()
object.GetHashCode()
String.Length

【讨论】:

  • 你对“理想”这个词的解释可能解释了马丁的意思:它应该是针对包子的东西,不一定需要完全达到。但是你会说访问对象状态的函数仍然满足引用完整性吗?
  • 不确定您所说的“参照完整性”是什么意思,不知道如何回答。
  • 我混淆了术语,实际上我的意思是“引用透明性”,这意味着当使用相同的参数调用时,函数总是返回相同的值。
  • 啊 - 那么不 - 当然引用可变对象状态的函数可以根据该状态返回不同的结果。
  • 除非您认为对象等同于参数。但它不再是一个 niladic 函数。
【解决方案2】:

对象的属性本质上将作为函数的参数。通过这种方式,您可以直接操作正在使用的对象,而不是在执行函数中包含的某些行为后传递和返回值,然后将这些值赋予对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多