AngularJS web服务是否应返回响应的深层副本

Should AngularJS web services return a deep copy of a response?

本文关键字:副本 响应 返回 web 服务 是否 AngularJS      更新时间:2023-12-26

我有一个长轮询web服务。缓存最近的响应。只要有新数据可用,Web服务就会通知订阅者。

返回响应的深层副本是一种好的做法,还是应该与所有订阅者共享数据?还是仅仅取决于用例?

乍一看,我认为这是一个需要更广泛了解用法的情况。

这项服务提供什么。它是只读数据,还是服务也负责管理对数据的修改?一旦你回答了这个问题,可能会更容易,所以看看你应该如何处理

但事实是,服务应该拥有数据,数据的订阅者不应该能够篡改结果。如果订阅者只应该从数据中读取,则应该强制执行此操作,但即使他们希望修改数据,直接在对象本身上这样做也是非常糟糕的做法,尤其是因为同一数据有许多订阅者。

最后,我认为您需要为每个订阅者提供数据的深层副本,如果这太过资源消耗,请考虑为订阅者提供浅层副本,并公开一个查询嵌套数据的接口,这样也会返回数据的副本。

数据的任何订阅者都应该将数据传递给负责保存数据的方法,如service.SaveSomeInformation(responseInformation)

TL;DR不要与订阅者共享数据的引用,为每个订阅者提供数据的副本(子集)

祝好运

可靠来源http://martinfowler.com/eaaCatalog/serviceLayer.html

使用服务层定义应用程序的边界建立一组可用的操作并协调应用程序在每次操作中的响应。

它封装了应用程序的业务逻辑,控制its实施中的交易和协调反应操作。

基本上,在真正需要之前,永远不要深度复制某些内容。

因此,首先与每个人分享你的回应。

然后,如果订阅者需要修改数据,例如,以一种不会破坏其他订阅者所做工作但只能更好地为他们服务的方式来完成数据,那么在内存空间和性能方面,保持引用更有效。

但是,如果订阅者需要私下对数据进行特定的格式化/编辑,您仍然应该考虑您是否真的需要深度副本,或者您是否可以简单地复制相关信息。

例如,假设你得到

scope.response = bigDataObject;

观察者需要在某个地方编辑一个特定的属性:

scope.data = angular.copy( bigDataObject.some.deeper.property );
scope.data.name = 'somethingElse';

通过这种方式,tou没有共享私人编辑,但也没有深度复制整个数据。通过只处理实际需要的较小的数据子集,可以防止副作用,节省性能和内存,并保持代码的可理解性和可维护性。