2016-11-14 5 views
2

私は現在、他人のコードに追加情報を追加しており、PdfSharp dllを使用しているPdfBuilderクラスに出くわしました。この時点まで、クラスはコンストラクタでBoxRequestという型をとっています。あなたはGetTextで使用されるプロパティがFileRequestタイプから撮影されている見ることができるように完全に異なる2つのタイプの一般的なメソッドを書く

public class PdfBuilder 
    { 
     private readonly BoxRequest _boxRequest; 

     public PdfBuilder(BoxRequest boxRequest) 
     { 
      _boxRequest = boxRequest; 
     } 

     public PdfDocument BuildPdfDocument() 
     { 
      PdfDocument pdfDocument = new PdfDocument(); 

      PdfPage page = pdfDocument.AddPage(); 
      page.Orientation = PageOrientation.Landscape; 

      XGraphics gfx = XGraphics.FromPdfPage(page); 
      XFont font = new XFont("Arial", 40, XFontStyle.Regular); 
      XTextFormatter tf = new XTextFormatter(gfx); 
      XRect rect = new XRect(0, (page.Height/4), page.Width, page.Height); 
      gfx.DrawRectangle(XBrushes.White, rect); 
      tf.Alignment = XParagraphAlignment.Center; 
      tf.DrawString(GetText(), font, XBrushes.Black, rect);   

      return pdfDocument; 
     } 

     private string GetText() 
     { 
      StringBuilder sb = new StringBuilder(); 
      sb.AppendLine(_boxRequest.Name); 
      sb.AppendLine(_boxRequest.Department); 
      sb.AppendLine(_boxRequest.Location.LocationName); 
      return sb.ToString(); 
     } 
    } 

:そうのように:

public PdfDocument GenerateAddressLabelPdf(int id) 
    { 
     var box = _unitOfWork.BoxRepository.GetById(id); 
     var generator = new PdfBuilder(box); 
     return generator.BuildPdfDocument(); 
    } 

そしてPdfBuilderクラスには、次のようになります。

私はこのクラスへの呼び出しを作り、それだけで私はこれが一般的なようにする良いことと考えていた BoxRequest取る見たように、私は今すぐに、 FileRequestと呼ばれる新しいタイプのために、もう一度、この時間を、このクラスを使用する必要があります

これまでのところ、私はそうのようなクラスを変更しました:

public class PdfBuilder<T> 
    { 
     private readonly T _pdfType; 

     public PdfBuilder(T t) 
     { 
      _pdfType = t; 
     } 

     //additional class stuff 
    } 

しかし、私は一人ひとりのために一定のラインをレンダリングする必要があるとして、今私は、私はGetText方法は、一般的な作るべきかに関しては少し混乱していますタイプ。

この時点で私はタイプをGetTextに渡してタイプをチェックし、タイプに基づいて別のラインを追加することができると思います。

+1

ジェネリックスは必要ありません。あなたはBoxRequestとFileRequestまたは\からインターフェイスを抽出し、それらのために別々のPdfBuilderクラスを作成する必要があります(もちろん、どちらかを継承します)。 – Evk

+1

おそらく、すべての具体的なオブジェクトによってインターフェイスを実装することができますか? –

+1

異なるものがすべて 'GetText'であれば、' BoxRequest'と他のクラス 'ToString'メソッドをオーバーライドし、型について気にしないでください。 'GetText()'をsthで置き換えることができます。それ以外の場合は、 'GetText()'をインタフェースに抽出して、両方のCourクラスが適切な方法で実装するようにします。 – nozzleman

答えて

3

私はジェネリックは、この問題に対処する最善の方法であるとは思わない...

異なるすべてのthatsが、これはBoxRequestや他のクラスをオーバーライドすることになる解決する最も簡単な(ない最高の)方法GetTextある場合ToString()方法については全く気にしません。

public class BoxRequest 
{ 
    // ... 

    public override string ToString() 
    { 
     StringBuilder sb = new StringBuilder(); 
     sb.AppendLine(this.Name); 
     sb.AppendLine(this.Department); 
     sb.AppendLine(this.Location.LocationName); 
     return sb.ToString(); 
    } 
} 

public class PdfBuilder 
{ 
    private readonly object request; 

    public PdfBuilder(object request) 
    { 
     this.request = request; 
    } 

    public PdfDocument BuildPdfDocument() 
    { 
     // ... 

     tf.DrawString(request.ToString(), font, XBrushes.Black, rect);   

     // ... 
    } 

} 

このように、クラスを使用して任意のオブジェクトをPDFにすることができます。これがあなたのために一般的であれば(それは私です)、ToString()/GetText()のインターフェースを抽出して、PdfBuilderを消費させてください(それはクリーナーのIMOになります)。

public interface IPdfConvertible 
{ 
    public string GetText() 
} 

// same for FileRequest... 
public class BoxRequest : IPdfConvertible 
{ 
    // ... 

    public string GetText() 
    { 
     StringBuilder sb = new StringBuilder(); 
     sb.AppendLine(this.Name); 
     sb.AppendLine(this.Department); 
     sb.AppendLine(this.Location.LocationName); 
     return sb.ToString(); 
    } 
} 

public class PdfBuilder 
{ 
    private readonly IPdfConvertible request; 

    public PdfBuilder(IPdfConvertible request) 
    { 
     this.request = request; 
    } 

    public PdfDocument BuildPdfDocument() 
    { 
     // ... 

     tf.DrawString(request.GetText(), font, XBrushes.Black, rect);   

     // ... 
    } 
} 
+0

私は個人的に、 'GetText()'メソッドで新しい 'IPdfPrintable'インターフェースを宣言することに賛成しています:1)' PdfBuilder'はそのインターフェースのオブジェクトを必要とします。 2)よく知られている 'ToString()'の意味は変わりません。 –

+0

私はちょうどそのexacltyを編集していた; D – nozzleman

+0

感謝、感謝! – JsonStatham

関連する問題