标签: method-chaining

PHP方法链接?

我正在使用PHP 5,我听说过面向对象方法中的一个新特性,称为"方法链".究竟是什么?我该如何实现它?

php oop method-chaining

156
推荐指数
6
解决办法
7万
查看次数

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

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

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万
查看次数

如何在新创建的对象上链接方法?

我想知道是否有办法在PHP中新创建的对象上链接方法?

就像是:

class Foo {
    public function xyz() { ... return $this; }
}

$my_foo = new Foo()->xyz();
Run Code Online (Sandbox Code Playgroud)

有人知道实现这个目标的方法吗?

php constructor new-operator method-chaining

55
推荐指数
4
解决办法
2万
查看次数

条件生成器方法链接流畅的接口

我想知道在对象中使用方法链接流畅的界面中实现.When条件的最佳方法是什么?Builder

例如,我将如何实现以下示例中的.WithSkill().When()方法:

var level = 5;

var ninja = NinjaBuilder
    .CreateNinja()
    .Named("Ninja Boy")
    .AtLevel(level)
    .WithShurikens(10)
    .WithSkill(Skill.HideInShadows)
        .When(level > 3)
    .Build()
Run Code Online (Sandbox Code Playgroud)

更新 - 可以在此处找到示例解决方案.

c# design-patterns fluent-interface builder method-chaining

55
推荐指数
4
解决办法
2万
查看次数

在PHP中链接静态方法?

是否可以使用静态类将静态方法链接在一起?说我想做这样的事情:

$value = TestClass::toValue(5)::add(3)::subtract(2)::add(8)::result();
Run Code Online (Sandbox Code Playgroud)

...显然我希望$ value被分配数字14.这可能吗?

更新:它不起作用(你不能返回"自我" - 它不是一个实例!),但这是我的想法带我的地方:

class TestClass {
    public static $currentValue;

    public static function toValue($value) {
        self::$currentValue = $value;
    }

    public static function add($value) {
        self::$currentValue = self::$currentValue + $value;
        return self;
    }

    public static function subtract($value) {
        self::$currentValue = self::$currentValue - $value;
        return self;
    }

    public static function result() {
        return self::$value;
    }
}
Run Code Online (Sandbox Code Playgroud)

在完成这项工作之后,我认为简单地使用类实例而不是尝试链接静态函数调用(这看起来不可能,除非上面的示例可以某种方式进行调整)更有意义.

php oop method-chaining

49
推荐指数
7
解决办法
2万
查看次数

用Java链接的方法

虽然我早些时候在这里回答了一些问题,但最近我一直在做的一些工作中,我一直在想为什么Java不支持对其内置类进行方法链接.

Car例如,如果我要创建一个类,我可以通过reutrning 而不是void来使它可链接,this如下所示:

public class Car {
    private String make;        

    public Car setMake(String make) {
        this.make = make;
        return this;
    }   
}
Run Code Online (Sandbox Code Playgroud)

内置库不倾向于以这种方式做事有什么特别的原因吗?方法链是否存在缺点?

我可能忽略了一些可以解释缺少方法链接的东西,但是默认情况下返回void的任何setter方法应该返回对此的引用(至少在我看来应该如此).这将使以下情况变得更加清洁.

container.add((new JLabel("label text")).setMaximumSize(new Dimension(100,200)));
Run Code Online (Sandbox Code Playgroud)

而不是更长时间的啰嗦:注意:如果你愿意,它不会阻止你以这种方式编码.

JLabel label = new JLabel("label text");
label.setMaximumSize(new Dimension(100,200));
container.add(label);
Run Code Online (Sandbox Code Playgroud)

我非常有兴趣听到这个决定背后的原因,如果我不得不猜测会有与此相关的开销,所以只应在需要时使用.

java methods method-chaining chaining

39
推荐指数
3
解决办法
1万
查看次数

方法链接+继承不能很好地结合在一起?

这个问题已在C++上下文中提出,但我对Java很好奇.关于虚拟方法的担忧不适用(我认为),但如果您遇到这种情况:

abstract class Pet
{
    private String name;
    public Pet setName(String name) { this.name = name; return this; }        
}

class Cat extends Pet
{
    public Cat catchMice() { 
        System.out.println("I caught a mouse!"); 
        return this; 
    }
}

class Dog extends Pet
{
    public Dog catchFrisbee() { 
        System.out.println("I caught a frisbee!"); 
        return this; 
    }
}

class Bird extends Pet
{
    public Bird layEgg() {
        ...
        return this;
    }
}


{
    Cat c = new Cat();
    c.setName("Morris").catchMice(); // error! setName returns …
Run Code Online (Sandbox Code Playgroud)

java inheritance method-chaining

38
推荐指数
4
解决办法
6626
查看次数

如何在Java中进行方法链接?o.m1().平方米().立方米().M4()

我在许多Java代码表示法中看到,在我们调用另一个方法之后,这是一个例子.

Toast.makeText(text).setGravity(Gravity.TOP, 0, 0).setView(layout).show();
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那样,makeText我们打电话回来setGravity,到目前为止

我怎么能用我自己的课程做到这一点?我必须做一些特别的事吗?

java method-chaining

36
推荐指数
4
解决办法
3万
查看次数

在jQuery中链接选择器

我是一个习惯于mootools链接选择器的方式的人,我似乎无法找到如何在jQuery中做同样的事情.假设我在变量中有一个select元素selectObj.我需要的是获得该选择中的最后一个选项.在mootools我会做的事情如下:

var option = $(selectObj).getElement('nth-child(last)')
Run Code Online (Sandbox Code Playgroud)

我可以做类似的事情,或者option在jQuery 中获得最后的方法是什么?

PS.我知道父>子选择器,但我不能真正使用它,因为我不知道使用了什么选择器来获取select.我只有结果元素.

javascript jquery css-selectors method-chaining

27
推荐指数
2
解决办法
4万
查看次数

基本对象/函数链如何在javascript中工作?

我正试图让jQuery风格的函数链接在我的脑海中.我的意思是:

var e = f1('test').f2().f3();
Run Code Online (Sandbox Code Playgroud)

我有一个例子可以工作,而另一个没有.我会发布以下内容.我总是想学习第一个原理的基本原理,以便我可以在它之上构建.到目前为止,我对链接的工作方式只有一个粗略而宽松的理解,而且我遇到了一些我无法智能排除故障的错误.

我知道的:

  1. 函数必须返回自己,又称"返回此";
  2. 可链接函数必须驻留在父函数中,也就是在jQuery中.css()是jQuery()的子方法,因此jQuery().css();
  3. 父函数应该返回自身或自身的新实例.

这个例子有效:

var one = function(num){
    this.oldnum = num;

    this.add = function(){
        this.oldnum++;
        return this;
    }

    if(this instanceof one){
        return this.one;    
    }else{
        return new one(num);    
    }
}
var test = one(1).add().add();
Run Code Online (Sandbox Code Playgroud)

但是这个没有:

var gmap = function(){

    this.add = function(){
        alert('add');

        return this;    
    }   

    if(this instanceof gmap) {
        return this.gmap;   
    } else{
        return new gmap();  
    }

}
var test = gmap.add();
Run Code Online (Sandbox Code Playgroud)

javascript methods method-chaining chaining

26
推荐指数
1
解决办法
3万
查看次数