我是一個數據挖掘工具,因此我花費大量時間以各種方式轉換原始數據,以便通過預測模型進行消耗。例如,以特定格式讀取文件,標記,克隆,並投影到某種數字表示形式。多年來,我開發了一套豐富的方法來完成大部分我能想到的數據處理任務,但我沒有一種很好的方式來配置這些組件,除了最基本的方式 - 通常我所做的是很多對源代碼中依賴於特定任務的特定方法的調用。我現在試圖將我的圖書館重構成更好的東西,但我不太確定這是什麼。我現在的想法是,有一個函數對象列表,每個函數對象都定義了一些方法(比如說操作(...)),它們按順序調用,每個方法都是通過引用來處理某些數據流的內容,或者消耗前一個函數對象的輸出。這與我想要的接近,但因爲輸入和輸出的數據類型會有所不同,所以使用泛型變得非常困難。用我上面的例子中,我想通過處理類似數據這一「管道」傳遞的東西:Java模式:用於數據挖掘任務的工程數據流
input: string filename
filename -> collection of strings
collection<string> -> (stemming, stopword removal) -> collection of strings
collection<string> -> (tokenize) -> collection of string arrays
collection<string[]> -> (gram-ify) -> augment individual token strings with n-grams -> collection of string arrays
collection<string[]> -> projection into numeric vectors -> collection<double[]>
這是一個簡單的例子,但是想象一下,我有這樣的組件的100S,我想將它們添加到某些數據流中。這符合我容易配置的要求 - 我可以輕鬆構建一個讀取一些yaml文件並構建出來的管道工廠。然而,組件的設計模式一直困擾着我一段時間?適當的界面是什麼樣的?看起來在這裏做事情的唯一簡單方法是讓對象得到傳遞,實質上取消對象(或者讓一些上下文對象通過,將對象作爲成員變量傳遞),然後檢查輸入的兼容性,拋出運行時異常。這兩種選擇似乎同樣糟糕。不過,我覺得我已經接近了一個非常好的靈活系統。你們能幫我把它推過籬笆嗎?
看起來很近!然而這個罐子目前似乎無法使用...... – downer
你可以下載源代碼,看起來像一個項目maven文件。你可以自己將它編譯成jar。你也可以看看接口的設計,以瞭解他們在做什麼。此外,還有另一個名爲Cocoon的Apache項目也使用管道方法。你可能想看看:http://cocoon.apache.org/ –