这是我想听听您的想法的编程/语言问题。
我们已经制定了约定(大多数程序员应该遵循),这些约定不是语言语法的一部分,但是可以使代码更具可读性。当然,这些总是一个辩论的问题,但是至少有一些核心概念是大多数程序员认为可以接受的。适当地命名变量,一般来说命名,使行的长度不会过长,避免使用长函数,封装等那些东西。
但是,有一个问题我尚未找到任何人对此发表评论,而这可能是其中最大的问题。这是调用函数时参数匿名的问题。
函数源于数学,其中f(x)具有明确的含义,因为函数具有比编程中通常更为严格的定义。数学中的纯函数比编程中的函数执行的功能要少得多,并且它们是一种更精致的工具,它们通常只接受一个参数(通常是一个数字),并且总是返回一个值(通常是一个数字)。如果一个函数接受多个参数,则它们几乎总是只是该函数域的额外维度。换句话说,一个论据并不比其他论据更重要。当然,它们是明确排序的,但是除此之外,它们没有语义排序。
但是,在编程中,我们拥有更多的自由定义函数,在这种情况下,我认为这不是一件好事。常见的情况是,您定义了这样的函数
func DrawRectangleClipped (rectToDraw, fillColor, clippingRect) {}
查看定义,如果函数编写正确,则完全清楚是什么。在调用该函数时,您甚至可能在您的IDE /编辑器中出现了一些智能/代码完成魔术,这些魔术将告诉您下一个参数应该是什么。可是等等。如果我在实际编写呼叫时需要此功能,这里是否不缺少某些内容?读代码的人没有IDE的好处,除非他们跳转到定义,否则他们不知道作为参数传递的两个矩形中的哪个用于什么。
问题不仅仅如此。如果我们的参数来自某个局部变量,那么在某些情况下,我们甚至不知道第二个参数是什么,因为我们只能看到变量名称。以这行代码为例
DrawRectangleClipped(deserializedArray[0], deserializedArray[1], deserializedArray[2])
使用不同的语言可以在不同程度上缓解这种情况,但是即使使用严格类型的语言,即使您明智地命名变量,在将变量传递给函数时,您甚至都不会提到变量的类型。
与编程通常一样,此问题有很多潜在的解决方案。许多已经以流行语言实现。例如,C#中的命名参数。但是,我所知道的全部都有明显的缺点。命名每个函数调用中的每个参数都不可能导致可读代码。几乎感觉像是我们正在超越纯文本编程为我们提供的可能性。我们几乎在每个领域都从仅文本迁移而来,但是我们仍然编写相同的代码。需要在代码中显示更多信息吗?添加更多文本。无论如何,这有点切线,所以我在这里停止。
我对第二个代码段的回答是,您可能首先将数组解压缩为一些命名变量,然后使用它们,但是变量的名称可能意味着很多事情,并且其调用方式并不一定会告诉您应该使用的方式在调用函数的上下文中进行解释。在本地范围内,您可能有两个名为leftRectangle和rightRectangle的矩形,因为这是它们在语义上表示的,但是在扩展给函数时并不需要扩展到它们表示的内容。
实际上,如果变量是在被调用函数的上下文中命名的,则所引入的信息要少于该函数调用可能带来的信息,并且在某种程度上会导致代码变差。如果您有一个过程产生一个矩形,该过程存储在rectForClipping中,然后另一个过程提供了rectForDrawing,则对DrawRectangleClipped的实际调用只是一种仪式。这行没有什么新意,只是在那里,因此即使您已经用命名解释了它,计算机也知道您到底想要什么。这不是一件好事。
我真的很想听听对此的新见解。我确定我不是第一个将其视为问题的人,那么如何解决呢?