相关疑难解决方法(0)

方法链 - 为什么这是一个好的做法?

方法链接是返回对象本身的对象方法的实践,以便为另一个方法调用结果.像这样:

participant.addSchedule(events[1]).addSchedule(events[2]).setStatus('attending').save()
Run Code Online (Sandbox Code Playgroud)

这似乎被认为是一种很好的做法,因为它产生可读代码或"流畅的界面".但是,对我来说,它似乎打破了对象方向本身隐含的对象调用符号 - 结果代码并不表示对前一个方法的结果执行操作,这通常是预期面向对象的代码的工作方式:

participant.getSchedule('monday').saveTo('monnday.file')
Run Code Online (Sandbox Code Playgroud)

这种差异设法为"调用结果对象"的点符号创建两种不同的含义:在链接的上下文中,上面的示例将读作保存参与者对象,即使该示例实际上是为了保存时间表getSchedule收到的对象.

我知道这里的区别在于是否应该调用被调用的方法返回某些东西(在这种情况下,它会返回被调用对象本身以进行链接).但是这两种情况与符号本身无法区分,只能从被调用方法的语义中区分出来.当不使用方法链接时,我总是可以知道方法调用对与前一个调用的结果相关的操作进行操作- 使用链接,这个假设会中断,并且我必须在语义上处理整个链以了解实际的对象是什么真的叫.例如:

participant.attend(event).setNotifications('silent').getSocialStream('twitter').postStatus('Joining '+event.name).follow(event.getSocialId('twitter'))
Run Code Online (Sandbox Code Playgroud)

最后两个方法调用引用getSocialStream的结果,而之前引用的是参与者.也许在上下文发生变化的情况下实际编写链是不好的做法(是吗?),但即使这样,你也必须不断检查看起来相似的点链是否实际上保持在同一个上下文中,或者只对结果起作用.

对我来说似乎虽然表面链接表面确实产生可读代码,但重写点符号的含义只会导致更多的混淆.因为我不认为自己是编程大师,我认为错误是我的.那么:我错过了什么?我是否理解方法链以某种方式错误?在某些情况下,方法链接特别好,还是某些特别糟糕的情况?

旁注:我理解这个问题可以理解为一个被掩盖为问题的意见陈述.然而,它并非如此 - 我真的想要理解为什么链接被认为是良好的实践,以及我认为它打破固有的面向对象的符号在哪里出错.

oop fluent-interface method-chaining

147
推荐指数
10
解决办法
6万
查看次数

类名之间的点符号是什么意思?

这个.notation(AlertDialog.Builder)在类构造函数中的含义是什么?

public Dialog onCreateDialog(Bundle savedInstanceState) {

    return new AlertDialog.Builder(getActivity())
        .setTitle(R.string.date_picker_title)
        .setPositiveButton(android.R.string.ok, null)
        .create();

}
Run Code Online (Sandbox Code Playgroud)

这是否意味着Builder类是在AlertDialog类中定义的?或者Builder是一种方法,但它的第一个字母大写,所以我很困惑.

java syntax android

9
推荐指数
1
解决办法
8201
查看次数

返回列表或通过引用修改

在java中,我有一个修改列表内容的方法.使用起来更好:

public List modifyList(List originalList) { // note - my real method uses generics
     // iterate over originalList and modify elements
     return originalList;
}
Run Code Online (Sandbox Code Playgroud)

或者更好的做法如下:

public void modifyList(List originalList) {
      // iterate over originalList and modify elements
      // since java objects are handled by reference, the originalList will be modified
      // even though the originalList is not explicitly returned by the method
}
Run Code Online (Sandbox Code Playgroud)

注 - 两种方法之间的唯一区别是返回类型(一个函数返回void而另一个函数返回List).

java

9
推荐指数
1
解决办法
1460
查看次数

在Java中实践返回自己而无效

我的队友向我介绍了新的练习写作方法,它不会返回无效.

public class Test {
   public Test doCalculations() {
      //code
      return this;
   }
   public Test appendTitle(String test) {
      //code
      return this;
   }
}
Run Code Online (Sandbox Code Playgroud)

他们建议返回对象本身而不是返回void.他们说这种方法的优势之一就是你可以连锁方法.

而不是写:

 while(1) {
    test.appendTitle("aaa");
    test.doCalculations();
    map.add(test);
 }
Run Code Online (Sandbox Code Playgroud)

你可以编写更优雅的代码:

 while(1) {
     map.add(test.appendTitle("aaa").doCalculations());
 }
Run Code Online (Sandbox Code Playgroud)

这种方法可能有什么缺点?你建议把它包括在日常使用中吗?

java coding-style

8
推荐指数
1
解决办法
598
查看次数

Setters返回实例引用.图案还是反图案?

我正在考虑代码结构,并思考setter.这些曾经是void方法,那么为什么不使用一些可能的返回值,来启用一些新的代码结构呢?

我的想法是将所有属性setter从void更改为实例引用,因此我们可以按顺序执行setter或其他操作.这是一个例子:

public class MyClass {
    private int foo;
    private String bar;

    public MyClass setFoo(int foo) {
        this.foo = foo;
        return this;
    }

    public MyClass setBar(String bar) {
        this.bar = bar;
        return this;
    }

}
Run Code Online (Sandbox Code Playgroud)

然后在我们可以做的代码中的其他地方:

...
MyClass myInstance = new MyClass();
myInstance.setFoo(auxFoo).setBar(auxBar);
...
Run Code Online (Sandbox Code Playgroud)

这允许在一行中设置所有类属性,这在转换方法中很有用.

甚至:

...
return myInstance.setFoo(auxFoo);
Run Code Online (Sandbox Code Playgroud)

这个是我的目标,例如在返回时可以设置错误属性.例如,这可以简化捕获块.

编辑: 经过一些答案我需要补充:

  • 问题只是关于setter(不是关于在所有方法中执行此操作),并且不限于链接,而是限于其他用法,return例如示例.
  • 从void到其他东西的变化是否会产生任何问题?例如,JavaBeans内省.
  • 你能看到这样做的优势或劣势吗?

我希望看到一些讨论.

java design-patterns coding-style

6
推荐指数
2
解决办法
3474
查看次数

java - 调用void方法然后在一行上传递对象

这是我很久以来一直想知道的事情.

是否可以传递一个对象,但首先在同一行中调用该对象上的void方法?这很难解释,但我会举一个例子:

我正在使用Vector来自第三方API 的对象,它只保存3个坐标,我将它传递给一个组合setLocation(Vector)方法; 但首先我要将3添加到该Vector的Y值,这是由Vector#addY(3f);可以在同一行上执行此操作吗?

setLocation(new Vector(0f,4f,0f).addY(3));
Run Code Online (Sandbox Code Playgroud)

我认为这应该解释我的意思.

java methods void

0
推荐指数
1
解决办法
421
查看次数

如何在PHP中链接方法?

我有一个问题,关于如何实现它的最佳方法.

class name {
  public function method($a){ 
    $this->a = $a; 
  }
  public function two($b){
    $this->b = $b;
  }
}
Run Code Online (Sandbox Code Playgroud)

我怎么称呼$class->method('a')->two('b');

return __CLASS__; // self?
Run Code Online (Sandbox Code Playgroud)

在每种方法?或者是什么?idk什么是最好的方式或所有框架如何实现它.

如果有人能指导我,我会非常感激的...谢谢!

php oop

0
推荐指数
1
解决办法
124
查看次数