2013-07-12 43 views
0

作爲一個例子,我們考慮GPS和地理(GIS)實體的領域。OOAD - 文件格式 - 讀者類與對象模型類:哪個應該取決於哪個?

我們將有意義的地理實體(點,路徑,區域)建模爲以任何期望的編程語言中類,和這些類將是一個概念上的「免費實現-」這些實體的表示。

在另一方面,也有很多的文件格式保存這些功能或多或少相同的含義。在GPS領域最常見的文件格式是GPX,KML,Shape文件,WellKnownText等

假設,那麼,我想創建一個GpsFeatureCollection類將包含一個Points性質,Paths財產,等等。此外,我會實施類如GpsReader,KmlReader,ShapeFileReader(及其各自的Writer s)等。

的問題是:

這是OOAD的最佳實踐:

  1. 有一個GpsFeatureCollection實例化一個FileFormat(Reader/Writer)類?
  2. 有一個GpsFeatureCollection實現Read/WriteFromFormat方法,而不是類的?
  3. 讓每個文件格式的閱讀器來實例化一個空GpsFeatureCollection,從文件中讀取數據填充它,然後通過填充對象作爲返回值?
  4. 有一個階級的調停,以避免FileFormatClassObjectModelClass之間的依賴?
  5. 以上都不是?
  6. 「嗯,這取決於......」

我在做「正確的事」很感興趣。我目前的計劃是使用Python,但很可能這對其他語言也很重要。這在目前我的寵物項目造成一些「分析癱瘓」 ......

回答

1

這是我取其中我通過讀寫器實例read()write()方法,這似乎實現脫鉤的良好水平,但提供了靈活性選擇各種讀者和作家。

代碼使用類似Java的語法

聲明一個Reader界面,我們會假設多種實現這樣KMLReaderShapeFileReader

interface Reader { 
    GpsFeatureCollection read(); 
} 

聲明一個Writer界面,我們會假設多種實現這樣的KMLWriterShapeFileWriter

interface Writer { 
    void write(GpsFeatureCollection c); 
} 

讓我們聲明GpsFeatureCollection類有readwrite接受各自接口作爲參數執行作業的方法。

class GpsFeatureCollection { 

    ... 

    public static GpsFeatureCollection read(Reader r) { 
     return r.read(); 
    } 

    public static void write(Writer w) { 
     w.write(this); 
    } 

} 

使用不同讀者和作者的一些使用示例。

// Reading data 
GpsFeaureCollection data = GpsFeatureCollection.read(new ShapeFileReader("/tmp/shapefile")); 

// Writing data 
data.write(new KMLWriter("/tmp/kmlfile")); 
+0

這是純金!非常感謝你。作爲一個唯一的建議,我將命名接口IReader和IWriter(但不包括IGpsFeatureCollectionReader等:P)。再次感謝! – heltonbiker

+1

很高興你喜歡它。 Java人不會使用前綴「I」作爲接口,儘管我不介意只要一直使用它就會使用它。 –

+0

作爲一個附註(現在我吃午飯了,我的大腦又在工作了),另一種可能的設計就是擁有一個'GpxFormat'類,使用'read'和'write'方法來爲公共使用接口。然後,相同的類可以實現很多可能會被IO方法重用的樣板/特定於規範的代碼,並且'FileFormat'類可能只是一種文件處理程序,作爲任何方法的參數傳遞。 – heltonbiker

相關問題