2011-08-16 5 views
3

私は自分の道を「頭の最初のデザインパターン」でやっていて、すぐにこれを実際に使いたいと思っています。 私はアプリケーションを他のアプリケーションと接続するコードを書いています。実際、XMLファイルを含む電子メールを生成して電子メールで送信する必要があります。しかし、将来は他のものが必要になるかもしれません。 - 伝送 のためのデータ - 送信する手段(電子メールかもしれないが、別のデータ交換のためのFTPやWebサービスすることができる)ジェネリックについての建築/ベストプラクティスの質問

はこのように、私は「物事その変更」を識別しました

だから、私:

そしてSendViaMailは

のようなものです: - のDataObject 抽象クラスを作成しました - DataExchangeの抽象クラスを作成しました - インタフェースを作成したが をITransmissionMethodあなたがこのアプローチについてどう思いますか

class MyExchange : DataExchange<MyDataObject,SendViaMail> { } 

: -

class SendViaMail : ISendMethod<System.Net.Mail.Attachment> 
{ 
    public override void Send(System.Net.Mail.Attachment dataItem) 
    { 
     throw new NotImplementedException(); 
    } 
} 

今、私のようなクラスを作成することができますか?それは思いません

private abstract System.Net.Mail.Attachment PrepareObjectForSendingMyDataObject dataObject) { 
// Serialize XML file and make it into attachment object 
} 

:今、私が本当にやりたいことはVisual Studioが似メソッドを実装するために私を強制する

private abstract [the type of the T in ISendMethod<T>] PrepareObjectForSending(T dataObject) { 
} 

ようになっているはずのDataExchangeでの抽象メソッドを作成しています甘い?しかし、あなたはこのアプローチについてどう思いますか?将来、人々は新しいデータオブジェクトと新しいsendメソッドを作成することができ、コードは引き続き動作します。私がしようとしてきたことは、インタフェースとプログラムを変更してプログラムを抽出することです。どうですか?

+0

は私には少し不自然なようです。おそらく、送信メソッドに 'enum'を使うだけです。データオブジェクトを保持するためにジェネリックは必要ありません。 IMHOこれは、それ自身のために過度に複雑なコードの良い例です。 – Yuck

+4

私はYuckと半分同意します。道路が変わる可能性があるからといって、それをサポートするために建築を建てるべきではありません。システムをセットアップして、必要になった場合にそのアーキテクチャに移行することは不可能ではなく、すべてを構築しないようにすることをお勧めします。 –

+1

ここで書いたことから、ジェネリック医薬品の使用があなたを買うのを見るのは難しいです。 DataObjectとSendMethodの基本クラス/インターフェースを使う方が良いかもしれません。物事をより簡単にする場合にのみジェネリックを使用してください。 –

答えて

4

これはうまくいくが、懸念をさらに分けることができる。

class DataExchange<TDataObject, TTransmissionObject> 
{ 
    IConverter<TDataObject, TTransmissionObject> conterver; 
    ISendMethod<TTransmissionObject> sender; 

    public Send(TDataObject dataObject) 
    { 
     TTransmissionObject tro = conterver.Convert(dataObject); 
     sender.Send(tro); 
    } 
} 

改宗は、ちょうど伝送に適したオブジェクトにデータオブジェクトを変換します:

class DataToAttachmentConverter : IConverter<DataObject, Attachment> 
{ 
    Attachment Convert(DataObject) { } 
} 
class DataToXmlConverter : IConverter<DataObject, XmlDocument> 
{ 
    XmlDocument Convert(DataObject) { } 
} 

送信者にのみ送信しますDataExchangeのは非常にシンプルに作り、労働者に実際の作業を委任する - ここだけの別のバージョンです。すべて一緒に置く

class MailSender : ISendMethod<Attachment> 
{ 
    void Send(Attachment) {} 
} 
class FtpPublisher : ISendMethod<XmlDocument> 
{ 
    void Send(XmlDocument) {} 
} 

var exchanges = new [] { 
     new DataExchange<DataObject, Attachment>(new DataToAttachmentConverter(), new MailSender()), 
     new DataExchange<DataObject, XmlDocument>(new DataToXmlConverter(), new FtpPublisher()) 
}; 

foreach(var ex in exchanges) 
    ex.Send(dataObject); //send as an attachent and put to ftp site. 
+0

さらに良い - 感謝! –