2017-05-03 23 views
2

私は、Excelテンプレートファイルを埋めてExcelエクスポートを作成する抽象的なアクションを持つ古いStrutsアプリケーションで作業しています。抽象クラスの子クラスでコードの重複を避ける

各Excelエクスポートアクションは、この親クラスを拡張し、Excelテンプレートを埋め込む独自の実装を追加し、独自のテンプレートと出力ファイル名を定義します。

public abstract class ExcelExportAction extends BaseAction { 
    protected abstract String getInputFilename(); 
    protected abstract String getOutputFilename(); 
    protected abstract HSSFWorkbook modifyWorkbook(HSSFWorkbook workbook, HttpServletRequest request); 

    @Override 
    protected final ActionForward run(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) 
    throws Exception { 

     Workbook workbook = new Workbook(getInputFilename()); 
     workbook = modifyWorkbook(workbook, request); 
     addWorkBookToResponse(workbook, getOutputFilename());  

     return null; 
    } 
... 
} 

実装は次のように見ていると、コードの重複がSonarQubeで「警告し」ている場所です:

public class BudgetReportExcelAction extends ExcelExportAction { 
    private static final String INPUT_FILENAME = "Report-Budget-Template.xls"; 
    private static final String OUTPUT_FILENAME = "Report-Customerbudget.xls"; 

    @Override 
    protected String getInputFilename() { 
     return INPUT_FILENAME; 
    } 
    @Override 
    protected String getOutputFilename() { 
     return OUTPUT_FILENAME; 
    } 
    @Override 
    protected HSSFWorkbook modifyWorkbook(HSSFWorkbook workbook, HttpServletRequest request) { 
     /* modify the workbook */ 
     return workbook; 
    } 
} 

任意のアイデアをどのように重複を避けるため?

+0

'ExcelExport'を拡張して共通の機能を実装し、' BudgetReportExcelAction'(および他の子クラス)を 'ExcelExport'の代わりに' DefaultExcelAction'に拡張する、ある種の 'DefaultExcelAction'を作成することができます。 – domsson

+1

私はここに重複は見えません...はい、あなたはメソッドをオーバーライドする必要がありますが、それはOOPのポイントです。 – AxelH

+0

SonarQubeはそうですが、他のコメントで述べたように、これは恐らく編集的な設定です... – GreenTurtle

答えて

4

私がここで見ているコードには重複しているコードはほとんどありませんが、本当に "水を石から搾りたい"場合は、入力ファイル名と出力を受け入れるコンストラクタを基本クラスに追加できますそれぞれの派生クラスがその入力ファイル名と出力ファイル名を基本クラスのコンストラクタに渡すようにします。

+0

これはStrutsのアクションであり、私が知っている限り、空のコンストラクタ。 – GreenTurtle

+1

さて、あなたはオーバーライド可能なものを呼び出すことに悩まされています。私は大したことではないと思う。私たちはいくつかの重要でない行からのコードの重複について話を始める傾向があります。実際にあなたがストラットで言うように、それは私のためには、ストラットを使用しないで十分な理由であり、ストラットで作業する必要がある人のためには働きません。 –

+0

あなたは1分で私を倒す。しかし、あなたは私のアップヴォートを得る;-) – GhostCat

2

ここでは無回答:例では「コードの重複」はありません。

要点:あなたの抽象クラスは、あなたの子クラスに対して特定の "レイアウト"をで駆動します。それは抽象クラスを使用してエッセンスです。

つまり、ここで心配することはありません。

よく知られた「承認済み」パターンに従っています。例えば、あなたの子クラスの@Overrideアノテーションをうまく使っています。

すてきな一日です。

+0

それはまったく同じコードであることを私に伝えるSonarQubeです。今回はそれを無視しなければならないと思う... Thx! – GreenTurtle

+0

誰かがあなたのSonarQubeをコードの重複について編集的に設定しました。 –

+0

C - :=世話をしました。 –

関連する問題