2

我正在将我作为学习练习编写的 java 应用程序移植到 scala。其中一部分是使用直接通过 TCP 的协议与另一台机器进行通信。该协议有 2 层(应用层和传输层),带有相应的标头和尾标。所以给定的消息最终看起来像

标题 | 标题 | 留言 | 预告片 | 拖车

我想用一个

trait Layer{
   def write(s:String) : Unit
   def read :String
}

每一层都会用它的头|尾来完成消息并将其传递给下一层。然后我会有一个TransportLayer和一个ApplicationLayer我可以结合在一个实现中,比如

 val layer = new TcpLayer with ApplicationLayer with TransportLayer

我对这个设计很兴奋,它让我可以随意重用组件。然后我的困境出现了:

  • 为了避免副作用,write方法不应该返回Unit,而是修改后的String,然后应该发送。这最大限度地减少了副作用,简化了测试,但是客户端代码需要String通过套接字本身发送完成(这已经有副作用但没有办法绕过那个,或者?)。
  • 由于客户端代码应该“触发并忘记”,它应该能够调用write给定的Layer并且不关心修改String(无论如何这对他来说可能是胡言乱语)。因此我认为返回Unit是返回值的正确选择。

关于哪个版本对函数式编程更友好的任何深思熟虑的见解?

4

1 回答 1

1

如果唯一的副作用是在套接字中,那么这个怎么样:

val layers = new TcpLayer with ApplicationLayer with TransportLayer
socket.write (layers.write (message))
unitTestEngine.check (layers.write (message))

或者,如果客户只能layer使用,那么:

val layers = new TcpLayer (socket) with ApplicationLayer with TransportLayer
layers.sink (layers.write (message))
unitTestEngine.check (layers.write (message))

sink返回 Socket 实例的方法在哪里。

于 2013-04-19T18:19:56.770 回答