0

想象一下,您有一些具有某些属性的类。这个类有一个私有方法,它根据参数计算一些东西。例如(Java):

public class Foo {
    private Lorem c1;
    private Ipsun c2;
    //...
    private Justo c12;

    private Double selfExplanatoryMethodName(){
        //This method uses c1, c3 and c4
    }
}

将方法的标题设置为更好的做法是:
private Double selfExplanatoryMethodName(Lorem c1, Amet c3, Sit c4) {/*...*/}

想象一下,这个方法是一个散列方法,知道它使用什么参数来生成散列可能很有用。

那么,你认为这是一个好习惯吗?为什么?

4

5 回答 5

1

参数化还是不参数化是个问题...

...当它只是一个接受输入并返回输出而不依赖于对象状态的函数时:因此,您必须有一个接受参数并执行一些魔术并返回值的方法...一个真正的函数 - - 你应该使用参数。你的方法是一个黑匣子。Javastatic为此类方法提供了关键字,对于仅依赖于参数的任务,您应该使用静态方法。这些案例应该有参数化的方法。例子:

 public static String encodeString(String input, String format)

...当它是一个仅处理对象状态并返回值的函数时:就像一个hashcode方法。你永远不应该传递参数......该方法应该是一个实例方法......它应该使用实例字段来发挥作用。这是一个例子:

 public String toString(){
    return this.attr1 +", " + this.attr2; //<-- see I haven't passed attr1, attr2
 }

...当需要一些外部输入和一些状态属性时:就像您有一个基于外部输入对状态对象进行操作以返回结果的方法。传递外部需要的参数。例如:

 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

 }

所以,这取决于你在做什么。


编辑1:(回答评论)

来到Why?

这是关于最小化冗余。这就是为什么上述几点应作为经验法则:do not create unnecessary objects; do not bloat the parameter list

我提到了在哪种情况下有哪些好的做法。你权衡你的情况并决定使用什么。所以,如果你有一个方法说,

int add(int a, int b){returns a+b;} 

传递 a 和 b 并将此方法作为静态方法是一种很好的做法。但是在new Additor(a, b).add();哪里做

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

不是那么好主意。

于 2012-08-09T06:50:26.803 回答
0

我不同意乔的观点。

根据我的经验,依赖字段可以使代码更简洁,并通过减少混乱来提高可读性。
类是一个白盒子,读者可以依靠您直观地选择的字段名称来推断该方法对它们的作用。此外,它依赖于更高(可见)凝聚力的领域。

于 2012-08-09T06:41:44.337 回答
0

我完全以 Java 程序员的身份说话,但是如果您有一个访问该类字段的方法,我从来没有在方法中放入参数并以这种方式将字段传回。相反,我会在方法的顶部(尤其是使用 javadoc)评论该方法对字段的作用。撕掉字段并传递它们有点违背封装的目的。

至少对于面向对象的编程来说,传递类已经作为字段保存的东西对我来说是没有意义的。通过在类中创建一个字段,我们说“嘿,我认为这对你很有用,你以后可能需要的东西”。如果它从来没有真正为自己使用过这些信息,并且总是在飞行中得到信息,它为什么要保留它呢?

底线:如果变量实际上属于一个字段并且还不够清楚你的函数做了什么,那么添加更多参数并将类的字段传回并不是让你的代码清晰的方法。如果有的话,它会使代码本身更加混乱和不必要的冗长。

于 2012-08-09T06:39:02.217 回答
0

可能取决于您使用的语言。但根据我的经验,我会说是的,这是一种很好的做法

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

于 2012-08-08T10:33:47.823 回答
0

这取决于方法的作用。如果方法对对象做了什么,我认为参数是错误的。如果方法对对象做了一些事情并且需要额外的信息(例如另一个对象),那么参数是强制性的。如果该方法对对象没有任何作用,则应检查它是否应该是静态方法。

于 2012-08-09T06:37:59.073 回答