方法链接是返回对象本身的对象方法的实践,以便为另一个方法调用结果.像这样:
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的结果,而之前引用的是参与者.也许在上下文发生变化的情况下实际编写链是不好的做法(是吗?),但即使这样,你也必须不断检查看起来相似的点链是否实际上保持在同一个上下文中,或者只对结果起作用.
对我来说似乎虽然表面链接表面确实产生可读代码,但重写点符号的含义只会导致更多的混淆.因为我不认为自己是编程大师,我认为错误是我的.那么:我错过了什么?我是否理解方法链以某种方式错误?在某些情况下,方法链接特别好,还是某些特别糟糕的情况?
旁注:我理解这个问题可以理解为一个被掩盖为问题的意见陈述.然而,它并非如此 - 我真的想要理解为什么链接被认为是良好的实践,以及我认为它打破固有的面向对象的符号在哪里出错.
在Ubuntu(Gnome)面板中添加和更改图标的最简单方法是什么?我正在寻找像shell脚本这样简单的东西,但我不仅限于此。如果是更好或更简单的方法,将为此编写程序。
这个想法是创建一个脚本/程序来监视某些情况(例如,安装点的可用性,互联网连接的可用性),并更改图标的状态以反映当前状态。
在PHP中,我知道单语句条件不需要大括号.但这个问题是关于良好的编码风格.(当然在谈论风格时,通常最好只使用项目中的一致风格,但是让我们忽略这个问题.)
所以:用大括号括起任何条件语句是更好的形式,还是在简单条件下不使用括号更好(例如更干净):
例如:
if (!file_exists($templatefile)) {
throw new Exception('Template file does not exist');
}
Run Code Online (Sandbox Code Playgroud)
或这个:
if (!file_exists($templatefile))
throw new Exception('Template file does not exist');
Run Code Online (Sandbox Code Playgroud)
对此有任何共同的一致良好做法,还是仅仅取决于个人喜好?
我在Linux上使用命令行PHP打开蓝牙拨号连接,我需要一个快速的方法来检查互联网连接是否有效.好吧,不一定要脏,但很快就会受到赞赏.:) exec用于运行外部命令不是问题.
我正在考虑ping一些稳定的服务器(例如谷歌),但我想知道是否有更好的方法.也许检查输出ifconfig?一个响应清晰响应的命令("无法连接到服务器","连接")自然是最好的.想法?
在Doctrine中,使用QueryBuilder构建查询时,是否where必须使用$qb->where()或$qb->andWhere()直接使用第一个子句定义.例如,这是否有效:
$qb->select('Mystuff\Entity\User','u');
$qb->andWhere('usertype = :usertype');
$qb->andWhere('usercategory = :usercategory');
Run Code Online (Sandbox Code Playgroud)
或者,作为一个更相关的例子:
$filter = array('usertype'=>'basic','usercategory'=>'business');
$qb->select('Mystuff\Entity\User','u');
foreach ($filter as $fkey => $fval) {
$qb->andWhere($fkey.' = :'.$fval);
}
Run Code Online (Sandbox Code Playgroud)