AngularJS 网络服务是否应该 return 响应的深层副本?
Should AngularJS web services return a deep copy of a response?
我有一个长轮询网络服务。最近的响应被缓存。只要有新数据可用,Web 服务就会通知订阅者。
return 响应的深层副本是一个好习惯还是应该与所有订阅者共享数据?还是仅仅取决于用例?
乍一看,我认为您需要更广泛地了解用法。
这项服务提供什么。它是只读数据还是服务还负责管理对数据的修改?一旦你回答了这个问题,它可能会更容易,所以看看你应该如何处理它。
但事实是,服务应该拥有数据,数据的任何订阅者都不能篡改结果。如果订阅者只应从数据中读取,则应强制执行此操作,但即使他们打算修改数据,直接在对象本身上这样做也是非常糟糕的做法 - especially/specifically 因为同一个订阅者有很多数据。
最后,我认为您需要为每个订阅者提供数据的深拷贝,如果这太耗费资源,请考虑为订阅者提供浅拷贝并公开查询嵌套数据的接口- 这也会 return 份数据。
数据的任何订阅者都应该将数据传递给负责保存数据的方法,例如 service.SaveSomeInformation(responseInformation)
。
TL;DR
不与订阅者共享数据的引用,为每个订阅者提供数据(子集)的副本。
祝你好运
可靠来源
http://martinfowler.com/eaaCatalog/serviceLayer.html
Defines an application's boundary with a layer of services that
establishes a set of available operations and coordinates the
application's response in each operation.
和
... . It encapsulates the application's business logic, controlling
transactions and coor-dinating responses in the implementation of its
operations.
基本上,除非你真的需要,否则永远不要深度复制。
因此,首先与大家分享您的回复。
那么如果订阅者需要修改数据,例如以一种不会破坏其他订阅者所做的但只能更好地为他们服务的方式来完成它,那么 更有效的是在内存 space 和性能方面保持参考 。
但是,如果订阅者需要私下处理特定的 formatting/editing 数据,您仍然应该考虑是否真的需要 deep 副本,或者您是否可以简单地复制相关信息。
例如假设你得到
scope.response = bigDataObject;
某处观察员需要编辑特定的 属性:
scope.data = angular.copy( bigDataObject.some.deeper.property );
scope.data.name = 'somethingElse';
这样你没有分享私人编辑,但你也没有深度复制整个数据。通过仅处理您实际需要的较小数据子集,您可以防止副作用、节省性能和内存,并使代码易于理解和维护。
我有一个长轮询网络服务。最近的响应被缓存。只要有新数据可用,Web 服务就会通知订阅者。
return 响应的深层副本是一个好习惯还是应该与所有订阅者共享数据?还是仅仅取决于用例?
乍一看,我认为您需要更广泛地了解用法。
这项服务提供什么。它是只读数据还是服务还负责管理对数据的修改?一旦你回答了这个问题,它可能会更容易,所以看看你应该如何处理它。
但事实是,服务应该拥有数据,数据的任何订阅者都不能篡改结果。如果订阅者只应从数据中读取,则应强制执行此操作,但即使他们打算修改数据,直接在对象本身上这样做也是非常糟糕的做法 - especially/specifically 因为同一个订阅者有很多数据。
最后,我认为您需要为每个订阅者提供数据的深拷贝,如果这太耗费资源,请考虑为订阅者提供浅拷贝并公开查询嵌套数据的接口- 这也会 return 份数据。
数据的任何订阅者都应该将数据传递给负责保存数据的方法,例如 service.SaveSomeInformation(responseInformation)
。
TL;DR 不与订阅者共享数据的引用,为每个订阅者提供数据(子集)的副本。
祝你好运
可靠来源 http://martinfowler.com/eaaCatalog/serviceLayer.html
Defines an application's boundary with a layer of services that establishes a set of available operations and coordinates the application's response in each operation.
和
... . It encapsulates the application's business logic, controlling transactions and coor-dinating responses in the implementation of its operations.
基本上,除非你真的需要,否则永远不要深度复制。
因此,首先与大家分享您的回复。
那么如果订阅者需要修改数据,例如以一种不会破坏其他订阅者所做的但只能更好地为他们服务的方式来完成它,那么 更有效的是在内存 space 和性能方面保持参考 。
但是,如果订阅者需要私下处理特定的 formatting/editing 数据,您仍然应该考虑是否真的需要 deep 副本,或者您是否可以简单地复制相关信息。
例如假设你得到
scope.response = bigDataObject;
某处观察员需要编辑特定的 属性:
scope.data = angular.copy( bigDataObject.some.deeper.property );
scope.data.name = 'somethingElse';
这样你没有分享私人编辑,但你也没有深度复制整个数据。通过仅处理您实际需要的较小数据子集,您可以防止副作用、节省性能和内存,并使代码易于理解和维护。