枚举作为 Scala 中建模类型的成员值或特征?
Enumeration as member value or trait for modelling type in Scala?
假设我拦截了网络流量并测量了每个数据包的时间、大小和类型(TCP、UDP、AppleTalk)。 IP 地址或数据之类的其他任何东西都不会被测量并且应该被建模。过滤和计算统计数据是我的想法。我无意扩展 specialize 类 for TCP, UDP, ... 额外的信息或功能。我是 Scale 的新手,想知道正确的方法是什么。
使用像 C/C++ 中的枚举:
object TransportType extends Enumeration {
type TransportType = Value
val TCP = Value("TCP")
val UDP = Value("UDP")
val AppleTalk = Value("AppleTalk")
}
class Packet(val time:int , val size:Int, val type:TransportType)
val p1 = new Packet(0, 200, TransportType.UDP)
val p2 = new Packet(1, 1000, TransportType.TCP)
或具有特征:
object TransportType {
trait TCP
trait UDP
trait AppleTalk
}
class Packet(val time:int , val size:Int)
val p1 = new Packet(0, 200) with TransportType.UDP
val p2 = new Packet(1, 1000) with TransportType.TCP
在后一种情况下,可能存在没有特殊类型的数据包。这在第一种情况下是不可能的。我对这些建模差异不感兴趣。我想知道是否建议像第二个解决方案中那样创建许多 traits/classes 并使用类型系统对属性进行编码。如果第二个解决方案是正确的,则假设数据包具有另一个属性 Origin。这样建模可以吗:
object Origin {
trait NA
trait SA
trait EU
trait Asia
trait Africa
trait Australia
}
val p1 = new Packet(0, 200) with TransportType.UDP with Origin.Asia
第二个解决方案是否正确 - Scala-tic - 解决方案?
一个很好的通用方法(有很多例外、保留和特殊情况,就像所有通用方法一样),我建议这样看:成员是属性,而特征是行为。
如果模型中的 tcp 数据包行为与 udp 不同(例如,一个有另一个没有的方法,或者如果有函数接受一个作为参数,但不是另一个等),它应该是一个特征,否则,一个 属性 应该做(如果有需要,你仍然可以有没有 "special type" 的数据包 - 只需制作 属性可选的,所以,这并不重要)。
假设我拦截了网络流量并测量了每个数据包的时间、大小和类型(TCP、UDP、AppleTalk)。 IP 地址或数据之类的其他任何东西都不会被测量并且应该被建模。过滤和计算统计数据是我的想法。我无意扩展 specialize 类 for TCP, UDP, ... 额外的信息或功能。我是 Scale 的新手,想知道正确的方法是什么。
使用像 C/C++ 中的枚举:
object TransportType extends Enumeration {
type TransportType = Value
val TCP = Value("TCP")
val UDP = Value("UDP")
val AppleTalk = Value("AppleTalk")
}
class Packet(val time:int , val size:Int, val type:TransportType)
val p1 = new Packet(0, 200, TransportType.UDP)
val p2 = new Packet(1, 1000, TransportType.TCP)
或具有特征:
object TransportType {
trait TCP
trait UDP
trait AppleTalk
}
class Packet(val time:int , val size:Int)
val p1 = new Packet(0, 200) with TransportType.UDP
val p2 = new Packet(1, 1000) with TransportType.TCP
在后一种情况下,可能存在没有特殊类型的数据包。这在第一种情况下是不可能的。我对这些建模差异不感兴趣。我想知道是否建议像第二个解决方案中那样创建许多 traits/classes 并使用类型系统对属性进行编码。如果第二个解决方案是正确的,则假设数据包具有另一个属性 Origin。这样建模可以吗:
object Origin {
trait NA
trait SA
trait EU
trait Asia
trait Africa
trait Australia
}
val p1 = new Packet(0, 200) with TransportType.UDP with Origin.Asia
第二个解决方案是否正确 - Scala-tic - 解决方案?
一个很好的通用方法(有很多例外、保留和特殊情况,就像所有通用方法一样),我建议这样看:成员是属性,而特征是行为。
如果模型中的 tcp 数据包行为与 udp 不同(例如,一个有另一个没有的方法,或者如果有函数接受一个作为参数,但不是另一个等),它应该是一个特征,否则,一个 属性 应该做(如果有需要,你仍然可以有没有 "special type" 的数据包 - 只需制作 属性可选的,所以,这并不重要)。