假设它们都是强制性的:
function search (haystack, needle)
function search (needle, haystack)
function placeObject (object, column, row)
function placeObject (column, row, object)
function newObject (parent, width, height, isVisible)
function newObject (isVisible, width, height, parent)
function newObject (width, height, isVisible, parent)
我认为这通常是个人选择的问题,应该在整个项目中保持一致。但我想知道是否有一个更深层的逻辑来决定每个案件的顺序。
答案 0 :(得分:1)
尝试发出预期的调用。
function search (needle, haystack)
在大海捞针中搜寻针。
function placeObject (object, column, row)
将对象放在(列,行)。
newObject
很难:尽量让它与你的框架保持一致,如果有的话,先把公共参数放在一边。我将isVisible
放在最后只是因为它是布尔值,并且很难从布尔文字中推断出它的作用。对于多个布尔值,我更喜欢将它们组合成整数类型的标志对象,使用位掩码(或键值字典或字符串,取决于语言)构建,以获得可读性:
openFile(path, READ | LOCKED | COMPRESSED | ...)
答案 1 :(得分:0)
我可以想到一些事情,虽然没有一个是“规则”。他们只是我觉得方便的东西。
一致性。例如,如果您具有复制对象的函数,则与指定源和目标的顺序一致。您可以利用人们可能拥有的现有偏见(例如,汇编程序MOV
指令中的操作数顺序或C标准库strcmp
函数的顺序参数)。
分组。将逻辑上“分组”在一起的东西放在一起是有用的。例如如果您的函数正在打开与数据库的连接,则用户名和密码应该在一起(并且可能也按此顺序)。
可读性。进行操作的“大”参数应该在较小的参数之前。例如draw_line(canvas, x0, y0, x1, y1)
而不是draw_line(x0, y0, x1, y1, canvas)
。
将函数视为其参数的前缀运算符,然后尝试将其转换为中缀以查看其自然情况,这也很有用。
如果你的语言支持关键字参数,那么使用它们通常是一个好主意(除非它明显地显示了参数和顺序应该是什么)。
答案 2 :(得分:0)
我感觉通常的逻辑是时间的函数。你看,如果你有一个功能:
public Pizza makePizza(cheese, sauce){}
然后你创建一个变量来确定数组中的顶部数字:
int toppingNo = 3;
您可能也希望将其发送到您的功能,对吗?
public Pizza makePizza(cheese, sauce, topping){}
而且,我的儿子,参数诞生了!
除了讽刺之外,我总是这样做,除非你有明显需要分组的参数,因为它们有相似之处,比如坐标系。