Questions tagged «parameters»

参数对于任何非平凡的程序都很重要,有助于使其成为通用且由数据驱动。参数通常是函数参数,但也可以是配置的一部分。

10
传递参数的(反)模式是否有名称,将仅在调用链的多个级别使用?
我试图在某些旧代码中找到使用全局变量的替代方法。但是这个问题与技术选择无关,我主要关注的是术语。 显而易见的解决方案是将参数传递给函数,而不是使用全局变量。在此传统代码库中,这意味着我必须更改长调用链中最终将使用该值的点与首先接收该参数的函数之间的所有函数。 higherlevel(newParam)->level1(newParam)->level2(newParam)->level3(newParam) newParam在我的示例中,where 以前是全局变量,但可能是以前的硬编码值。关键是,现在newParam的值是从获得的,higherlevel()并且必须一直“移动”到level3()。 我在想,如果有一个姓名(或名称)的这种情况下,你需要一个参数添加到许多功能只是“传”未经修改的值/模式。 希望使用正确的术语将使我能够找到有关重新设计解决方案的更多资源,并向同事描述这种情况。

5
设计命令行参数的良好习惯是什么?
在开发应用程序时,我开始怀疑-我应该如何设计命令行参数? 很多程序都使用公式是这样-argument value或/argument value。我想到的解决方案是argument:value。我认为这是很好的,因为没有空格就无法将值和参数弄乱。同样,很容易将字符串从左:字符的第一个字符拆分为两个。 我的问题是: 流行的-argument value公式是否比argument:value(更易读,更容易编写,没有错误,更易于专家开发人员理解)更好? 在设计命令行参数时,是否应该遵循一些众所周知的规则(如果可行,可以的话)? 要求提供更多详细信息,我将提供它。但是,我认为它们不应影响答案。问题在于总体上的良好习惯。我认为它们对于各种应用程序都是相同的。 我们正在开发一个将在公共场所(触摸图腾,桌子)使用的应用程序。应用程序是使用Qt Quick 5(C ++,QML,JS)编写的。设备将安装Windows 8.1 / 10。我们将提供前端界面来管理设备。但是,某些高级管理员可能希望自己配置应用程序。从业务的角度来看这不是很重要,但是正如我同意Kilian Foth所说的那样,我不希望我的应用程序给用户带来麻烦。在互联网上找不到我想要的内容。 对于更高级的Stack Exchange用户:我希望这个问题笼统。也许它符合社区Wiki的资格(我不知道是否可以将现有问题转换为答案)。因为我希望这个问题与操作系统和编程语言无关,所以这里出现的答案对于其他开发人员来说可能是一个宝贵的教训。
190 design  parameters  cli 

11
是否有关于函数应接受多少个参数的准则?
我注意到我使用的一些函数有6个或更多参数,而在大多数我使用的库中,很少会找到一个需要3个以上参数的函数。 通常,这些额外的参数中有很多是二进制选项,可以更改功能行为。我认为其中一些参数设置的函数可能应该重构。有多少个数字的准则吗?


10
我们应该避免将自定义对象作为参数吗?
假设我有一个自定义对象Student: public class Student{ public int _id; public String name; public int age; public float score; } 还有一个窗口Window,用于显示学生的信息: public class Window{ public void showInfo(Student student); } 它看起来很正常,但是我发现Window很难单独测试,因为它需要一个真正的Student对象来调用该函数。因此,我尝试修改showInfo,使其不直接接受Student对象: public void showInfo(int _id, String name, int age, float score); 以便更轻松地单独测试Window: showInfo(123, "abc", 45, 6.7); 但是我发现修改后的版本还有另一个问题: 修改学生(例如:添加新属性)需要修改showInfo的方法签名 如果Student具有许多属性,则Student的方法签名将非常长。 因此,使用自定义对象作为参数或接受对象中的每个属性作为参数,哪个更可维护?

7
使用仅使用大小写与类型名称不同的参数名称是否被认为是C#中的不良做法?
对于与类的属性匹配的参数名称,我看到与此类似的问题,但是除了使用C#中的大小写外,对于使用与参数类型名称相同的参数名称,我找不到任何东西。我发现这似乎不是违规行为,但是否认为这是不正确的做法?例如,我有以下方法 public Range PadRange(Range range) {} 此方法采用一个范围,并返回已应用填充的新范围。因此,鉴于通用上下文,我无法想到该参数的更具描述性的名称。但是,我想起了我在阅读《代码完整》中有关“心理距离”的一些提示。它说 心理距离可以定义为区分两个项目的难易程度...调试时,请准备好应对类似变量名之间以及相似例程名之间的心理距离不足所引起的问题。在构造代码时,请选择差异较大的名称,以便可以避免此问题。 我的方法签名有很多“范围”,因此,就心理距离而言,这可能是一个问题。现在,我看到许多开发人员都在执行以下操作 public Range PadRange(Range myRange) {} 我个人对此公约非常反对。向变量名添加“ my”前缀不会提供任何其他上下文。 我也看到以下 public Range PadRange(Range rangeToPad) {} 我喜欢此前缀,而不是“ my”前缀,但总体上还是不在乎。它对我来说太冗长,将其作为变量名尴尬地读取。在我看来,由于方法名称,将填充范围。 因此,考虑到所有这些因素,我的直觉是带着第一个签名。对我来说,这很干净。不需要时不需要强制使用上下文。但是,我是否对自己或将来的开发人员不利于此约定?我违反最佳做法了吗?

9
我应该在遍历它们的方法中接受空集合吗?
我有一个方法,其中所有逻辑都在foreach循环内执行,该循环遍历该方法的参数: public IEnumerable<TransformedNode> TransformNodes(IEnumerable<Node> nodes) { foreach(var node in nodes) { // yadda yadda yadda yield return transformedNode; } } 在这种情况下,发送一个空集合会导致一个空集合,但是我想知道这是否不明智。 我的逻辑是,如果有人正在调用此方法,那么他们打算传入数据,并且只会在错误的情况下将空集合传递给我的方法。 我应该捕获此行为并抛出异常,还是返回空集合的最佳实践?

13
使用布尔参数确定值是否错误?
根据使用布尔参数确定行为是否错误?,我知道避免使用布尔参数来确定行为的重要性,例如: 原始版本 public void setState(boolean flag){ if(flag){ a(); }else{ b(); } c(); } 新版本: public void setStateTrue(){ a(); c(); } public void setStateFalse(){ b(); c(); } 但是,使用boolean参数来确定值而不是行为的情况如何呢?例如: public void setHint(boolean isHintOn){ this.layer1.visible=isHintOn; this.layer2.visible=!isHintOn; this.layer3.visible=isHintOn; } 我试图消除isHintOn标志并创建2个单独的函数: public void setHintOn(){ this.layer1.visible=true; this.layer2.visible=false; this.layer3.visible=true; } public void setHintOff(){ this.layer1.visible=false; this.layer2.visible=true; this.layer3.visible=false; } …

2
为什么采用数量不受限制的参数的方法通常会定义带有较少参数的重载?
例如,System.IO.Path.Combine.NET中的方法具有以下重载: Combine(params String[]) Combine(String, String) Combine(String, String, String) Combine(String, String, String, String) 最后三点是什么? 第一个将覆盖所有内容,就好像您仔细观察一样,它使用的是params关键字。向后兼容的论点仅涵盖该Combine(String, String)变体,因为它是.NET 4之前的唯一版本。

9
如何命名既执行任务又返回布尔值作为状态的方法?
如果有办法 bool DoStuff() { try { // doing stuff... return true; } catch (SomeSpecificException ex) { return false; } } 它应该被称为IsStuffDone()吗? 用户可能会误解这两个名称:如果名称是DoStuff()为什么它返回布尔值?如果名称IsStuffDone()不明确,则该方法是执行任务还是仅检查其结果。 这种情况有约定吗?还是一种替代方法,因为这被认为是有缺陷的?例如,在具有输出参数的语言(如C#)中,可以将布尔状态变量作为1传递给方法,而方法的返回类型为void。 编辑:在我的特定问题中,异常处理不能直接委托给调用者,因为该方法是接口实现的一部分。因此,调用者不必负责处理不同实现的所有异常。它不熟悉那些例外。但是,调用者可以处理自定义异常,如npinti的answer和comment中StuffHasNotBeenDoneForSomeReasonException建议的那样。

3
可选参数或重载的构造函数
我正在实现DelegateCommand,当我要实现构造函数时,我想到了以下两种设计选择: 1:具有多个重载的构造函数 public DelegateCommand(Action<T> execute) : this(execute, null) { } public DelegateCommand(Action<T> execute, Func<T, bool> canExecute) { this.execute = execute; this.canExecute = canExecute; } 2:只有一个带有可选参数的构造函数 public DelegateCommand(Action<T> execute, Func<T, bool> canExecute = null) { this.execute = execute; this.canExecute = canExecute; } 我不知道使用哪个,因为我不知道这两种建议的方式都有哪些优点/缺点。两者都可以这样称呼: var command = new DelegateCommand(this.myExecute); var command2 = …

3
为什么不注释功能参数?
为了使这个问题更容易回答,让我们假设程序员头脑中模棱两可的代价要比几次额外的击键要昂贵得多。 鉴于此,我为什么不让我的队友不注释其功能参数就逃脱呢?以下面的代码为例,这可能是更复杂的代码: let foo x y = x + y 现在,对工具提示的快速检查将向您显示F#已确定将x和y表示为整数。如果这就是您的意图,那么一切都很好。但是我不知道那不是你的意图。如果您已创建此代码以将两个字符串连接在一起怎么办?或者,如果我认为您可能打算添加双打呢?或者,如果我只是不想将鼠标悬停在每个函数参数上来确定其类型,该怎么办? 现在以这个为例: let foo x y = "result: " + x + y F#现在假设您可能打算连接字符串,因此x和y被定义为字符串。但是,作为维护您的代码的可怜的schmuck,我可能会看这件事,并想知道您是否打算将x和y(整数)加在一起,然后将结果附加到用于UI的字符串中。 当然,对于这样简单的示例,可以放手,但是为什么不执行显式类型注释的策略呢? let foo (x:string) (y:string) = "result: " + x + y 模棱两可有什么危害?当然,程序员可能会为尝试做的事情选择错误的类型,但至少我知道他们的意图是,这不仅仅是疏忽。 这是一个严重的问题...我对F#还是很陌生,正在为我的公司开拓创新。我采用的标准可能会成为将来所有F#编码的基础,并且嵌入无止尽的复制粘贴中,我相信它将在未来的几年中渗透到整个文化中。 那么...关于F#的类型推断是否有什么特别之处,使其成为一项有价值的功能,仅在必要时进行注释?还是专家F#-er习惯于为非平凡的应用程序注释其参数?
28 f#  parameters 

7
指定可选参数名称,即使不是必需的?
请考虑以下方法: public List<Guid> ReturnEmployeeIds(bool includeManagement = false) { } 和以下调用: var ids = ReturnEmployeeIds(true); 对于刚接触该系统的开发人员来说,很难猜得出是什么true。您要做的第一件事是将鼠标悬停在方法名称上或转到定义(都不是丝毫大的任务)。但是,出于可读性考虑,编写以下代码是否有意义: var ids = ReturnEmployeeIds(includeManagement: true); 在编译器不需要您时,是否有任何地方正式讨论是否明确指定可选参数? 以下文章讨论了某些编码约定:https : //msdn.microsoft.com/zh-cn/library/ff926074.aspx 与上面的文章类似的东西会很棒。

5
函数调用中的多个参数与单个数组
我有一个函数,它接受一组参数,然后将它们作为条件应用于SQL查询。但是,尽管我赞成包含条件本身的单个参数数组: function searchQuery($params = array()) { foreach($params as $param => $value) { switch ($param) { case 'name': $query->where('name', $value); break; case 'phone': $query->join('phone'); $query->where('phone', $value); break; } } } 我的同事更喜欢显式列出所有参数: function searchQuery($name = '', $phone = '') { if ($name) { $query->where('name', $value); } if ($phone) { $query->join('phone'); $query->where('phone', $value); …

6
方法是否应该原谅传入的参数?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 假设我们有一个foo(String bar)仅对满足特定条件的字符串进行操作的方法;例如,它必须为小写字母,不能为空或只有空格,并且必须与pattern匹配[a-z0-9-_./@]+。该方法的文档说明了这些条件。 该方法应该拒绝任何和所有与该标准的偏差,还是该方法对某些标准更为宽容?例如,如果初始方法是 public void foo(String bar) { if (bar == null) { throw new IllegalArgumentException("bar must not be null"); } if (!bar.matches(BAR_PATTERN_STRING)) { throw new IllegalArgumentException("bar must match pattern: " + BAR_PATTERN_STRING); } this.bar = bar; } 第二种宽容方法是 public void foo(String bar) { if (bar == …
21 java  parameters 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.