我已经按层次结构组织了我的代码,并发现自己使用以下代码爬上树.
File clientFolder = task.getActionPlan().getClientFile().getClient().getDocumentsFolder();
Run Code Online (Sandbox Code Playgroud)
我没有钻进这个task物体; 我正在向它的父母钻研,所以我认为我在封装方面没有失去任何东西; 但是我脑子里的一面旗帜正在告诉我这样做有什么不好的事情.
这是错的吗?
编写单独调用jQuery函数或使用单个链是否更快?如果一个额外的解释为什么一个比另一个更快,将不胜感激:-)
一个例子:
$('#blah_id').niftyjQueryMethod1().niftyjQueryMethod2();
Run Code Online (Sandbox Code Playgroud)
更快/更慢
$('#blah_id').niftyjQueryMethod1();
$('#blah_id').niftyjQueryMethod2();
Run Code Online (Sandbox Code Playgroud) 鉴于这样的事情:
var results = theElement.Element("Blah").Element("Whatever").Elements("Something");
Run Code Online (Sandbox Code Playgroud)
是否有一种优雅的方法来处理null Blah或Whatever元素,因此在这些情况下结果只是null或空?
我知道我可以拆分查询并手动进行这些检查但是想知道是否有更简洁的东西.
我的问题是在方法链接+继承的背景下不能很好地发挥作用?.但不幸的是,方法链的所有示例/答案都使用单级继承.我的用例涉及多级继承,例如
abstract class PetBuilder{...}
class DogBuilder extends PetBuilder{..}
class DogType1Builder extends DogBuilder {...}
Run Code Online (Sandbox Code Playgroud)
要构造一个Dog Object,我将使用DogBuilder或DogType1Builder
如何使用getThis技巧用于上述用例?
我想使用构建器模式来构造一个复杂的Dog对象(Dog Object Model)".DogType1将有一些添加的属性.
所以使用getThis Trick声明上面的类就会变得像
abstract class PetBuilder<T extends PetBuilder<T>>
class DogBuilder<T extends DogBuilder<T>> extends PetBuilder<DogBuilder<T>>
class DogType1Builder extends DogBuilder<DogType1Builder>
Run Code Online (Sandbox Code Playgroud)
现在这会产生两个问题
'DogBuilder'中的1.builder方法看起来像
public T someMethodInDog(String dogName) {
..
return (T)this; ///i dont want type casting and i cant use getThis Trick Here (compiler reports error for conversion from DogBuilder to T)
}
Run Code Online (Sandbox Code Playgroud)
2.由于DogBuilder已经参数化,因此要创建"DogBuilder"的实例,我将不得不使用
DogBuilder<DogBuilder> builder=new DogBuilder(); //passing <DogBuilder> …Run Code Online (Sandbox Code Playgroud) 我有一个类,它暴露了一个流畅的界面风格,我也想要线程安全.
目前,在类的实例上调用可链接方法会使用操作(Func<T>'s)设置各种集合.
当请求结果时,实际工作就会发生.这允许用户以任何顺序链接方法调用,以便:
var result = myFluentThing
.Execute(() => serviceCall.ExecHttp(), 5)
.IfExecFails(() => DoSomeShizzle())
.Result<TheResultType>();
Run Code Online (Sandbox Code Playgroud)
(这里,5是重试失败的服务呼叫的次数.)
显然这不是线程安全的或可重入的.
有哪些常见的设计模式可以解决这个问题?
如果必须首先调用Execute方法,我可以简单地返回一个新的类实例,但每次都可以使用,因为任何方法都可以在链中的任何一点调用,你将如何解决这个问题?
我更感兴趣的是了解解决这个问题的各种方法,而不仅仅是为了"让它正常工作".
我把完整的代码放在GitHub上,任何人都需要更广泛的背景来实现我的目标:https://github.com/JamieDixon/ServiceManager
c# fluent-interface thread-safety reentrancy method-chaining
我正在尝试在python中实现Maybe monad.然而,我也想要的是某种链接能力.
所以我有一节课:
class Maybe:
def __init__(self, val):
self.val = val
def do(self, func): # Bind function
if self.val is None:
return None
else:
return func(self.val)
Run Code Online (Sandbox Code Playgroud)
我有两个功能:
def double(number):
try:
result = number * 2
return Maybe(result)
except:
return Maybe(None)
def square(number):
try:
result = number * number
return Maybe(result)
except:
return Maybe(None)
Run Code Online (Sandbox Code Playgroud)
这是我如何使用它:
result = Maybe(5).do(double).do(square)
print(result.val)
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种链接多个函数的方法,每个函数执行一个特定的任务.每个函数都将前一个函数的输出作为输入.如果链中的任何函数抛出异常,链应该断开.
这是对Maybe monad进行建模的正确方法吗?
这是处理异常的正确方法吗?
这可以改进吗?
非常感谢.
我有一个像这样的连锁电话:
$object->getUser()->getName();
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用字符串来调用对象上的函数:
$functionName = 'getUser';
$object->$functionName() or call_user_func(array($object, functionName))
Run Code Online (Sandbox Code Playgroud)
我想知道是否有可能为连锁电话做同样的事情?我试着这样做:
$functionName = 'getUser()->getName';
$object->functionName();
Run Code Online (Sandbox Code Playgroud)
但是我收到了一个错误
方法名称必须是字符串
我想这是因为()并->不能解释,因为他们是一个字符串的一部分?我有什么方法可以做到这一点,而不必做:
$function1 = getUser;
$function2 = getName;
$object->$function1()->$function2();
Run Code Online (Sandbox Code Playgroud)
目的是获取一系列函数并将它们链接起来,以便在给定对象上调用此链,例如:
$functions = array('getCoordinates', 'getLongitude'); // or any other chain call
$functionNames = implode('()->',$functions);
$object->$functionNames()
Run Code Online (Sandbox Code Playgroud) 例如,我有以下内容:
class A{
__invoke(){
// return an instance of class A itself
}
}
Run Code Online (Sandbox Code Playgroud)
我可以这样做吗?
new A()()()()... or (new A())()()()...
Run Code Online (Sandbox Code Playgroud)
这是什么解释?假设PHP版本比5.4更新
好吧,我可以再解释一下为什么我要问:我正在使用ganon.php这是一个开源的html dom解析器.它使用类似$ html_node('child_tag')的语法来返回另一个子$ html_node,其中$ html_node是类HTML_NODE的对象实例.所以我在想是否可以使用链接在嵌套的html dom结构中进行选择.
Scala函数具有以下链接方法:
fn1.andThen(fn2)
fn1.compose(fn2)
Run Code Online (Sandbox Code Playgroud)
但是如何写这种情况:
我有cleanUp()必须始终作为最后一步调用的函数。我还有很多其他功能,例如:
class Helper {
private[this] val umsHelper = new UmsHelper()
private[this] val user = umsHelper.createUser()
def cleanUp = ... // delete user/ and other entities
def prepareModel(model: TestModel) = {
// create model on behalf of the user
}
def commitModel() = {
// commit model on behalf of the user
}
}
Run Code Online (Sandbox Code Playgroud)
而且一些外部代码可以使用如下代码:
val help = new Helper()
help.prepareModel()
help.commitModel()
// last step should be called implicitly cleanUp
Run Code Online (Sandbox Code Playgroud)
如何以一种功能性的方式编写代码,即链接将始终cleanUp隐式调用函数作为最后一步?
注意:我将其视为C …
众所周知,lodash-es使用更模块化的语法来构建,以通过构建工具来支持树摇动。
但是,chain相关功能意味着某些功能会附加到对象/原型链。
我可以看到chain已与一起发布lodash-es,但我不确定如何将其与其他链接方法一起正确导入。
一个用例可能看起来像这样:
import { chain } from 'lodash-es'
export function double(input) {
return chain(input)
.without(null)
.map(val => val * 2)
.value()
.join(', ')
}
Run Code Online (Sandbox Code Playgroud)
关键不在于如何chain导入,而在于其他chained函数如何导入。
method-chaining ×10
javascript ×2
php ×2
.net ×1
architecture ×1
c# ×1
call ×1
composition ×1
generics ×1
implicit ×1
inheritance ×1
java ×1
jquery ×1
linq-to-xml ×1
lodash ×1
maybe ×1
methods ×1
monads ×1
performance ×1
python ×1
reentrancy ×1
scala ×1
xelement ×1