Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 涉及事件时的德米特定律/单一责任_Javascript_Objective C_Law Of Demeter - Fatal编程技术网

Javascript 涉及事件时的德米特定律/单一责任

Javascript 涉及事件时的德米特定律/单一责任,javascript,objective-c,law-of-demeter,Javascript,Objective C,Law Of Demeter,我试图在涉及事件的编程环境中协调Demeter定律-我标记了这个javascript和obj-c(Cocoa的NSNotificationCenter),因为两者都允许事件 在这样的环境中,您可以通过让任意两个对象抛出并绑定/订阅事件来任意解耦它们。在obj-c中,只需执行此操作,而不需要向需要调用方法的对象传递引用,这样做会容易得多。我认为这可能不适合一直使用:从性能的角度来看,您错过了方法分派的优化(除非它是一个大型应用程序,否则可能可以忽略不计)。为了可读性,程序员可能希望明确表示一个对象

我试图在涉及事件的编程环境中协调Demeter定律-我标记了这个javascript和obj-c(Cocoa的NSNotificationCenter),因为两者都允许事件

在这样的环境中,您可以通过让任意两个对象抛出并绑定/订阅事件来任意解耦它们。在obj-c中,只需执行此操作,而不需要向需要调用方法的对象传递引用,这样做会容易得多。我认为这可能不适合一直使用:从性能的角度来看,您错过了方法分派的优化(除非它是一个大型应用程序,否则可能可以忽略不计)。为了可读性,程序员可能希望明确表示一个对象是另一个对象的依赖项,当一个对象只是抛出事件时,这一点并不明显


我想了解一下事件在软件体系结构中的作用:您希望如何平衡事件绑定和直接方法调用?

请谨慎使用您的术语。GUI上下文中的“事件”一词通常意味着用户生成的事件,如鼠标单击、轻触、按键等,而这些类型的事件通常不会使用您似乎引用的来处理。在Cocoa和Cocoa Touch中,用户事件是使用来处理的

这两种模式都促进了对象之间的松散耦合,但观察者中的耦合可以说更松散。参与责任链的对象通常都从一个公共基类继承,或者遵循一些公共接口,并且链中的每个对象通常都知道其在链中的邻居。对于observer,发送消息的对象(例如Cocoa中的通知)不知道哪些对象可能接收消息,而接收消息的对象通常不知道消息来自何处。特别是在Cocoa和NSNotificationCenter中,甚至没有公共接口——每个“观察者”对象在注册接收通知时都会注册一个通知处理程序

如果过度使用观察者模式,可能会造成相当混乱的局面。调试混乱的消息可能非常困难。更糟糕的是,如果消息以同步方式(通常是同步的)传递给观察者,则发送消息的对象无法知道发送消息的成本有多高,而接收消息的对象也不知道自己的性能会如何影响应用程序的其余部分。任何给定消息的观察者数量通常是无界的,这一事实很容易意外地造成实际性能问题。得墨忒尔法的拥护者可能会说“我早就告诉过你了”,但这并不意味着你应该避开观察者。恰当地使用该模式,并理解观察者不应该对信息做出太多繁重的反应,该模式是将信息传递到所需位置的强大方式,它还可以通过消除对象之间的许多关系来简化代码。

我刚才看到了:观察者似乎类似于服务层,一个类通过另一个类到达。我明白,没有任何注册观察员的更新($observators)不会影响测试,但它确实会造成您所说的混淆。有办法解决这个问题吗?我考虑的两种情况是通知“Entry Saved!”、日志记录和状态更新等消息,但也包括数据存储和业务逻辑之间的交互。