2010-11-26 38 views
1

我通過CSV導入的方式工作,我想教給其他人,我有我的看法有以下其中工作方法:請批判我的數據導入與驗證,提供客戶端狀態

  1. 在嘗試處理之前驗證每條記錄(例如持續)。
  2. 任何記錄上的故障都會阻止處理。
  3. 在驗證和處理期間提供狀態。

我在尋找的是如果下面的類和用法例子看起來足夠清晰以符合所描述的意圖的想法。

有三個類。

導入程序:管理整體算法,跟蹤驗證錯誤,提供將每個CSV行轉換爲可以驗證或處理的數據結構的算法。

Importer(CSVFile) 
getProcessor(): Processor 
getValidator(): Validator 
getErrors(): array 
isOKToProcess(): boolean 
lineToData(String data): Object 

驗證:驗證整個文件,每一行,以保證它的確定處理

close(): void 
currentRow(): int 
hasNext(): boolean 
doNext(): void 

處理器:堅持每行

close(): void 
currentRow(): int 
hasNext(): boolean 
doNext(): void 

正如你可以看到最後兩個大致堅持一個Java風格的迭代器。因此,客戶端交互(僞碼 - 假定輸出立即刷新到緩衝區):

importer = new Importer("/path/to/file.csv"); 
validator = importer.getValidator(); 
writeOutput("validating<br/>"); 
while (validator.hasNext()) { 
    validator.doNext(); 
    writeOutput(validator.currentRow() & "<br/>"); 
} 
validator.close(); 
if (!importer.isOKToProcess()) { 
    writeOutput("errors<br/>"); 
    writeOutput(importer.getErrors()); 
    return; // short circuit 
} 
processor = importer.getProcessor(); 
writeOutput("processing<br/>"); 
while(processor.hasNext()) { 
    processor.doNext(); 
    writeOutput(processor.currentRow() & "<br/>"); 
} 
processor.close(); 

一些具體的問題,但請隨時否則批判:

  1. 意義的使用兩個獨立的類(實際上可能是內部的)來驗證和處理?或者可能將所有內容都移入一個Importer類中?
  2. getErrors()取而代之,因爲那是錯誤發生的地方?
  3. currentRow()對導入器而不是驗證器和處理器,因爲它確實是整個導入的當前行?

回答

2

從OO的角度來看,我認爲保持班級獨立是正確的。我不認爲甚至有必要讓Validator成爲一個內部階層。從這個角度思考它。如果您一般實現這一點(也許這樣,有一天您可以通過語法或某種規範告知Validator如何驗證),那麼您可以使用它來驗證多種類型的CSV文件。在這種情況下,你不希望它包含在外部Importer類中。否則,您每次都必須編寫Importer/Validator組合。

一個Importer是一個進口商,一個Validator是一個驗證器。

我肯定會將getErrors()方法轉換爲Validator。否則,就像其他人讚揚你所做的工作一樣。由於Validator正在進行驗證,因此請告訴世界它發現的錯誤。不要把榮耀給予Importer,它還沒有做任何事情。

你的第三點意義不大。 ValidatorImporter都有currentRow()方法。這似乎是正確的。它們在功能上有所不同,都需要跟蹤進展情況。你可能會做的一個改變是給Validator有一個getTotalNumRows()方法。這樣,一旦文件被驗證,Importer可以詢問Validator驗證期間它讀取了多少行。這將使Importer更好地顯示進度,即。作爲一個百分比,而不是隻顯示它在哪一行。

除此之外,我認爲你的設計很好。

+1

隨時批評我的批評:) – 2010-11-26 05:48:04