2016-06-09 96 views
1

假设我拦截了网络流量并测量了每个数据包的时间,大小和类型(TCP,UDP,AppleTalk)。没有其他任何东西像IP地址或数据被测量,应该建模。过滤和计算统计数据是我的想法。我无意扩展TCP,UDP,...的额外信息或功能的专门类。我是Scale的新手,想知道正确的方法。枚举成员值或特征在Scala中的建模类型?

有了这样的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 

在后一种情况下,有可能是没有一种特殊类型的数据包。在第一种情况下这是不可能的。我对这些建模差异不感兴趣。我想知道是否可以创建许多特征/类,如第二种解决方案,并使用类型系统对属性进行编码。如果第二种解决方案是正确的,那么假设数据包有另一个属性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 

是第二个解决方案的权利 - 斯卡拉 - 抽动 - 解决方案?

回答

1

一个好的一般方法(有很多例外,保留和特殊情况,就像所有的一般方法一样),我会建议这样来看待它:成员是属性,而特征是行为。

如果模型中的TCP数据包从UDP不同的行为(例如,一个有方法,其他没有,或者是否有接受一个作为参数的功能,而不是其他等),它应该是一个特性,否则,一个属性应该做(如果有需要,你仍然可以拥有没有“特殊类型”的数据包 - 只需使该属性为可选项,那么这并不重要)。