Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 传不传理_Java_Parameters - Fatal编程技术网

Java 传不传理

Java 传不传理,java,parameters,Java,Parameters,想象一下,你有一个有着特定心房肌的班级。这个类有一个私有方法,它根据参数计算一些东西。 例如(Java): 将方法的标题设置为: private-Double-selfExplanatoryMethodName(Lorem c1、Amet c3、Sit c4){/*…*/} 假设这个方法是一个散列方法,了解它用于生成散列的参数可能是有用的 那么,你认为这是一种好的做法还是不好?为什么?可能取决于你使用的语言。但是根据我的经验,我会说是的,这是一个很好的实践 如果包含这些参数,阅读和理解起来会更容

想象一下,你有一个有着特定心房肌的班级。这个类有一个私有方法,它根据参数计算一些东西。 例如(Java):

将方法的标题设置为:
private-Double-selfExplanatoryMethodName(Lorem c1、Amet c3、Sit c4){/*…*/}

假设这个方法是一个散列方法,了解它用于生成散列的参数可能是有用的


那么,你认为这是一种好的做法还是不好?为什么?

可能取决于你使用的语言。但是根据我的经验,我会说是的,这是一个很好的实践


如果包含这些参数,阅读和理解起来会更容易/更快。如果您希望它更糟,您也可以跳过返回值,或者更糟的是只使用全局变量。

这取决于方法的功能。如果这个方法对对象做了一些事情,我认为参数是错误的。如果方法对对象执行某些操作,并且需要其他信息(例如,另一个对象),则参数是必需的。如果该方法对对象没有任何作用,那么您应该检查它是否应该是一个静态方法。

我完全是以Java程序员的身份说的,但是如果您有一个方法可以访问该类的字段,我从来没有在该方法中放入参数并以那种方式将字段传递回来。相反,我会在方法的顶部(特别是使用javadoc)注释这个方法对字段的具体作用。撕开字段并将其传递给其他人有点违背了封装的目的

至少对于面向对象编程来说,传入类已经保留为字段的内容对我来说毫无意义。通过将某个内容设置为类中的字段,我们可以说“嘿,我认为这是对您有用的信息,您以后可能需要的东西”。如果它从来没有真正为自己使用过这些信息,而且总是在飞行中获得这些信息,那么它为什么要保留这些信息呢

一句话:如果变量实际上属于一个字段,而您的函数所做的事情还不够清楚,那么添加更多的参数并将类的字段传递回并不能让代码变得清晰。如果有的话,它会使代码本身更加混乱,不必要地冗长。

我不同意乔的观点

根据我的经验,依赖字段可以使代码更加清晰,并通过减少混乱来提高可读性。
类是一个白盒,读者可以依靠直觉选择的字段名来推断方法对它们的作用。
而且,它依赖于更高的字段(可见)。

参数化还是不参数化是一个问题…

。。。当它只是一个接受输入并返回输出而不依赖于对象状态的函数时:所以,您必须有一个接受参数并执行一些魔术并返回值的方法。。。真正的函数——应该使用参数。你的方法是一个黑盒子。Java为这些方法提供了
static
关键字,对于完全依赖于参数的任务,应该使用静态方法。这些案例应该有参数化的方法。例如:

 public static String encodeString(String input, String format)
。。。当它是一个单独处理对象状态并返回值的函数时:类似于
hashcode
方法。你永远不应该传递这些论点。。。该方法应该是一个实例方法。。。它应该使用实例字段来完成这项工作。这是一个例子:

 public String toString(){
    return this.attr1 +", " + this.attr2; //<-- see I haven't passed attr1, attr2
 }
通过a和b并将此方法作为静态方法是一个很好的实践。但是做
新的加法器(a,b).add()哪里

public int add(){return this.a + this.b;} 

这不是个好主意。

幸运的是,@eversor有一个
selfExplanatoryMethodName
,不需要注释。除非该方法类似于getter或setter,否则我高度怀疑该方法实际上不需要注释。无论如何,我坚持我所说的;您不应该创建参数并删除要传入的字段。函数的参数只能是类本身不保留的东西。re:Comments——即使是对于公共API,我也坚信(并且已经看到证据)清晰的命名可以让您占据一席之地。在这里,我们谈论的是私人方法,所以我怀疑他是否需要。我同意清楚的命名是必须的,但好的评论也是绝对必须的。除非它是一段非常小的代码(比如getter或setter),否则如果没有好的注释来指导您,您最终会忘记该函数在程序上下文中的作用。+1为切中要害。Nishant,您完全忽略了问题的“为什么”部分。你能通过推理说明来扩大你的答案吗?(并不是说我不同意他们。)嗯<代码>为什么?
:)你问的很有趣。。。我提到了哪种情况下的良好实践。你权衡你的处境,决定使用什么。因此,如果你有一个方法,比如说,
intadd(inta,intb){返回a+b;}
——传递
a
b
是一个很好的做法。但是做
新的加法器(a,b).add()
where
add(){返回this.a+this.b}
--不是个好主意。OP可以将答案作为经验法则,在任何情况下都可以解决与通过论证或不通过论证相关的任何难题。这是一条规则的大拇指——“不要创建不必要的对象;不要膨胀参数列表。”明白了吗?我认为Nishant的回答是正确的:虽然你所说的不是完全不正确,但这确实取决于你。对我来说,Nishant的回答读起来像“只要可用,就使用字段”,但有太多的词。由于我的意图似乎不明确,我已对我的进行了修改。但是,我的答案的哪一部分“取决于”?“无论何时可用”包含隐含的设计决策“我是否将此作为一个字段?”。如果数据是状态信息,则决定将其设置为字段。如果信息是某些计算(或操作)的参数,则决定将其设置为参数而不是字段。那
 public String toFormat(String format){
    if("json".equals(format)  //<-- this is external agent.
      return new JSONObject(this).toString();
    else
      return this.attr1 +", " + this.attr2; //<-- see I haven't passed attr1, attr2

 }
int add(int a, int b){returns a+b;} 
public int add(){return this.a + this.b;}