Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/135.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
Actionscript 3 协议简单性与;“适当性”;_Actionscript 3_Erlang_Network Programming_Network Protocols - Fatal编程技术网

Actionscript 3 协议简单性与;“适当性”;

Actionscript 3 协议简单性与;“适当性”;,actionscript-3,erlang,network-programming,network-protocols,Actionscript 3,Erlang,Network Programming,Network Protocols,我和我的一个朋友又吵了一架 考虑需要设计一个简单的基于JSON的协议,该协议基本上用于在各方之间发送事件(消息) 比如说 { event_id: 1, chat_message: "Hello" } { event_id: 2, group_id: 3, presence: "online" } ... 我建议像上面一样保留此协议,而我的朋友建议这样做: { event_id: 1, details: { chat_message: "Hello" } } { event_id: 2

我和我的一个朋友又吵了一架

考虑需要设计一个简单的基于JSON的协议,该协议基本上用于在各方之间发送事件(消息)

比如说

 { event_id: 1, chat_message: "Hello" }
 { event_id: 2, group_id: 3, presence: "online" }
 ...
我建议像上面一样保留此协议,而我的朋友建议这样做:

 { event_id: 1, details: { chat_message: "Hello" } }
 { event_id: 2, group_id: 3, details: {  presence: "online" } }
 ...
他的论点是,就像TCP和HTTP处于不同的“责任”层一样,该协议应该使用“细节”子对象以保持数据分离

他提出的另一个论点是,处理匹配事件的处理程序不应该知道任何有关“路由”信息的信息(比如事件id)

我的论点是:

  • 为了对处理程序隐藏这些信息,我们增加了每条消息的长度(以及网络通信量,这对于与大量消息交换的系统来说可能很重要)
  • 处理程序确实需要知道“路由”信息,例如,正确回答它们:

    this.replyTo(event['event_id'], reply); // or...
    this.replyTo(event, reply); 
    
  • 即使我们需要对处理程序隐藏事件id之类的东西,我们也可以在传递给处理程序之前将它们去掉,这样仍然可以节省流量

  • 这个协议非常简单,不应该被其他任何人使用

    你怎么想?

    喜欢简单

    当您编写一个规范、一个分布式系统以及一个将在您无法控制的许多不同环境中使用的系统时,需要适当性

    务实,通常最好使用“语言的力量”,只编写代码来处理每种情况。除非你需要,否则不要抽象

    保持简单。快点。保持清洁


    你不知道它可能需要演变成什么(功能或性能),你的抽象性越强,就越难重新考虑。

    有人说,从前,ARPAnet还是新的,IP仍然是一个想法的萌芽“哦,天哪,32位IP地址足够了——40亿个地址?没有人会需要它。见鬼,我们可以把它们分成不同的地址类型,有足够的空间。”

    25年后,我们几乎不知道这会成为一个问题

    甚至不要跟我谈论域名命名

    关键是:你需要考虑什么可以改变。为了优雅起见,把它变成一个名称空间的层次结构是不必要和浪费的,当你的额外层没有提供任何更多的信息内容时,为什么还要麻烦呢

    另一方面,如果您这样做是为了使代码对问题中的更改不那么敏感,或者使实现明显更容易或更不容易出错,那么这可能是值得的


    这就是你的答案:这仅仅是为了更优雅,还是它还有其他优势?

    在大项目中积累了多年经验之后,我必须强烈反对和的建议。敏捷和经典方法之间存在着巨大的张力。他们的建议看起来像敏捷,但我不同意。如果你设计了什么东西,千万不要用w设计即使是现在,你也知道这是错误的。它不是敏捷的,它是愚蠢的。我不敢相信你认为你的需求在未来不会改变,所以保持门户开放,重构影响最小化。当在你当前的设计中,事件由不同的子系统处理,如事件类型分派器->路由器到组->最终事件处理程序/存储或其他,保持每个子系统中的更改对彼此的影响最小。对我来说,最好的设计方案是像洋葱皮一样,不要根据当前需求之外的每个细微细节进行设计。它是敏捷的

    你的论点是:

    ad 1.这是过早的优化。如果您真的需要最小化流量,请使用二进制协议;-)否则ti的成本/收益是错误的

    ad 2.它适用于内部程序插装,而不是协议本身。这是错误的设计,尤其是在Erlang中。您的处理程序不应该直接返回到目标,而是返回到某个路由器(通常返回到调度程序),该路由器保持套接字所有权和类似所有权。这看起来又是过早的优化

    ad 3.我更喜欢相反的方法。为子系统提供最小的数据集,以最大限度地减少副作用,简化(单元)测试,并避免从2点开始使用该方法的诱惑。必要时进行扩展。不要以相反的方式进行

    附言:为什么你不命名你的事件,而是使用ids?又是过早的优化

    编辑:ID被澄清,它们是事件编号,但不是事件类。应该有另一个类键。

    这是两个正确的解决方案。 如果你真的要担心网络流量,你的解决方案是可以接受的。 但您还必须记住,代码维护占用了代码生命周期的大部分时间,因此,今天使代码更干净,将来可能会节省一些时间(前面提到的维护)


    在我看来,你应该有基于强有力的事实的很好的论据来考虑这种优化。

    带宽上没有太大的差异,特别是如果你把压缩放在上面。我只是想提一下。是的,它不是-但是为什么我们需要添加它…基本上没有什么?确切地说,这听起来非常接近to在这种情况下,我认为保持简单的一个演示部分意味着使另一个部分变得复杂和不那么灵活。1.谁说JSON不能打包成二进制?:)2.为了让路由器路由消息,它需要知道它应该路由到哪里。我并不是说消息应该直接返回到目的地,一点也不!我相信我明确地说它应该通过路由器。replyTo()方法实际上是router3的快捷方式。完全正确。如果需要,可以扩展。如果需要,可以添加“详细信息”。到目前为止,我还没有看到添加它的理由:)P.S.:因为将名称用于数字是愚蠢的:)事件\ id应该是顺序id,而不是