Language agnostic 什么是函数的常见且合理的参数顺序?

Language agnostic 什么是函数的常见且合理的参数顺序?,language-agnostic,function,coding-style,parameter-passing,Language Agnostic,Function,Coding Style,Parameter Passing,假设它们都是强制性的: 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 (isVisi

假设它们都是强制性的:

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)

我认为这通常是个人选择的问题,应该在整个项目中保持一致。但我想知道是否有更深层的逻辑来决定每种情况的顺序。

我能想到一些事情,尽管没有一件是“规则”。它们只是我觉得方便的东西

  • 一致性。例如,如果您有复制对象的函数,则必须与指定源和目标的顺序一致。您可以利用人们可能存在的现有偏差(例如,汇编程序
    MOV
    指令中的操作数顺序或C标准库
    strcmp
    函数的顺序参数)

  • 分组。将逻辑上“分组”的事物放在一起是很有用的。e、 g.如果您的函数正在打开与数据库的连接,则用户名和密码应该在一起(并且可能按顺序排列)

  • 可读性。进行操作的“大”参数应在较小参数之前。e、 g.
    绘制线(画布,x0,y0,x1,y1)
    而不是
    绘制线(x0,y0,x1,y1,画布)

  • 将函数视为其参数上的前缀运算符,然后尝试将其转换为中缀,以查看什么是自然的,这也很有用


  • 如果您的语言支持关键字参数,通常最好使用它们(除非参数和顺序非常明显)。

    我感觉通常的逻辑是时间的函数。你看,如果你有一个函数:

    public Pizza makePizza(cheese, sauce){}
    
    然后创建一个变量,用于确定数组中的顶部编号:

    int toppingNo = 3;
    
    你可能也想把它发送到你的函数中,对吗

    public Pizza makePizza(cheese, sauce, topping){}
    
    我的儿子,这就是参数的诞生


    撇开讽刺不谈,我总是这么做的,除非你有一些参数因为它们的相似性而需要分组,比如坐标系。

    试着说出预期的调用

    function search (needle, haystack)
    
    大海捞针

    function placeObject (object, column, row)
    
    将对象放置在(列、行)

    newObject
    很难:尽量使它与您的框架保持一致,如果有的话,将公共参数放在第一位。我之所以把
    isVisible
    放在最后,是因为它是布尔型的,而且很难从布尔型文字推断它的作用。对于多个布尔值,我更喜欢将它们组合成整数类型的flags对象,使用位掩码(或键值字典或字符串,取决于语言)构建,以获得可读性:

    openFile(path, READ | LOCKED | COMPRESSED | ...)
    

    你说得对,一致性是问题的关键+1。这必须提供见解。