💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] 在Dart中,可选参数可以是位置参数,也可以是命名参数,但不能同时参考。 ## 避免位置布尔参数。 与其他类型不同,布尔值通常以文字形式使用。像数字这样的东西通常被包装在命名的常量中,但是我们通常直接传递真和假。如果不清楚布尔值表示什么,就会导致callsites无法读取: ~~~ 【bad】 new Task(true); new Task(false); new ListBox(false, true, true); new Button(false); ~~~ 相反,考虑使用命名参数、命名构造函数或命名常量来阐明调用的作用。 ~~~ Task.oneShot(); Task.repeating(); ListBox(scroll: true, showScrollbars: true); Button(ButtonState.enabled); ~~~ 注意,这并不适用于setter,在setter中名称清楚地表示值的含义: ~~~ listBox.canScroll = true; button.isEnabled = false; ~~~ ## 如果用户可能想要省略早期的参数,则避免可选的位置参数。 可选的位置参数应该具有逻辑级别,使得前面的参数比后面的参数更频繁地被传递。 用户几乎不需要显式传递“占位”来省略先前的位置参数以便后边参数的传递。 最好还是使用命名参数。 ~~~ String.fromCharCodes(Iterable<int> charCodes, [int start = 0, int end]); DateTime(int year, [int month = 1, int day = 1, int hour = 0, int minute = 0, int second = 0, int millisecond = 0, int microsecond = 0]); Duration( {int days = 0, int hours = 0, int minutes = 0, int seconds = 0, int milliseconds = 0, int microseconds = 0}); ~~~ ## 避免强制参数接受一个特殊的“无参数”值。 如果用户在逻辑上漏掉了一个参数,那么宁愿让他们通过使参数可选而实际上忽略它,而不是强迫他们传递null、空字符串或其他表示“未传递”的特殊值。 省略参数更简洁,有助于防止错误,当用户认为标记值(如null)提供了真正的值时,意外地传递了该值。 ~~~ var rest = string.substring(start); ~~~ ~~~ 【bad】 var rest = string.substring(start, null); ~~~ ## 请使用包含开始和独占结束参数来接受范围。 如果您正在定义一个方法或函数,该方法或函数允许用户从整数索引序列中选择元素或项的范围,那么可以使用start索引,它指的是第一个项和一个(可能是可选的)比最后一个项的索引大一个的结束索引。 这与做同样事情的核心库是一致的。 ~~~ [0, 1, 2, 3].sublist(1, 3) // [1, 2] 'abcd'.substring(1, 3) // 'bc' ~~~ 在这里保持一致特别重要,因为这些参数通常是未命名的。如果您的API使用的是长度而不是端点,那么在callsite上根本就看不到差异。