我正在将我作为学习练习编写的 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
是返回值的正确选择。
关于哪个版本对函数式编程更友好的任何深思熟虑的见解?