2016-06-09 100 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不同的行爲(例如,一個有方法,其他沒有,或者是否有接受一個作爲參數的功能,而不是其他等),它應該是一個特性,否則,一個屬性應該做(如果有需要,你仍然可以擁有沒有「特殊類型」的數據包 - 只需使該屬性爲可選項,那麼這並不重要)。