2016-09-21 4 views
0

아래 프로그램을 리팩토링하고 싶습니다. 그것은 너무 많은 매개 변수 냄새가 있습니다. 어떻게 리팩토링 할 수 있습니까?자바 코드에서 너무 많은 매개 변수 리팩토링

package net.sourceforge.ganttproject.export; 

import net.sourceforge.ganttproject.GanttExportSettings; 
import net.sourceforge.ganttproject.task.TaskContainmentHierarchyFacade; 
import net.sourceforge.ganttproject.resource.HumanResourceManager; 
import java.io.File; 

public class PDFExportData extends ProjectExportData { 

    final String myStylesheet; 

public PDFExportData(GanttExportSettings myExportSettings, File myOutputFile, String myProjectName, String myProjectDescription, String myOrganization, HumanResourceManager myResourceManager, TaskContainmentHierarchyFacade myTaskHierarchyFacade, GanttChartExportProcessor myGanttChartExportProcessor, ResourceChartExportProcessor myResourceChartExportProcessor, String stylesheet) { 
     super(myExportSettings, myOutputFile, myProjectName, myProjectDescription, myOrganization, myResourceManager, myTaskHierarchyFacade, myGanttChartExportProcessor, myResourceChartExportProcessor); 

     myStylesheet = stylesheet; 
    } 
} 

답변

0

나는 Builder 패턴을 제안합니다. 자바에서 구현하기 쉽다. 객체 생성 프로세스를 캡슐화하는 데 도움이됩니다. PDFExportData 생성자를 private (편의상)으로 선언하고 PDFExportDataBuilder 정적 클래스를 추가하기 만하면됩니다. 여기

은 예이다 :

public class PDFExportData extends ProjectExportData { 

    final String myStylesheet; 

    public static class PDFExportDataBuilder { 

     private GanttExportSettings myExportSettings; 
     private File myOutputFile; 
     private String myProjectName; 
     private String myProjectDescription; 
     private String myOrganization; 
     private HumanResourceManager myResourceManager; 
     private TaskContainmentHierarchyFacade myTaskHierarchyFacade; 
     private GanttChartExportProcessor myGanttChartExportProcessor; 
     private ResourceChartExportProcessor myResourceChartExportProcessor; 
     private String stylesheet; 

     public PDFExportDataBuilder setMyExportSettings(GanttExportSettings myExportSettings) { 
      this.myExportSettings = myExportSettings; 
      return this; 
     } 

     public PDFExportDataBuilder setMyOutputFile(File myOutputFile) { 
      this.myOutputFile = myOutputFile; 
      return this; 
     } 

     public PDFExportDataBuilder setMyProjectName(String myProjectName) { 
      this.myProjectName = myProjectName; 
      return this; 
     } 

     public PDFExportDataBuilder setMyProjectDescription(String myProjectDescription) { 
      this.myProjectDescription = myProjectDescription; 
      return this; 
     } 

     public PDFExportDataBuilder setMyOrganization(String myOrganization) { 
      this.myOrganization = myOrganization; 
      return this; 
     } 

     public PDFExportDataBuilder setMyResourceManager(HumanResourceManager myResourceManager) { 
      this.myResourceManager = myResourceManager; 
      return this; 
     } 

     public PDFExportDataBuilder setMyTaskHierarchyFacade(TaskContainmentHierarchyFacade myTaskHierarchyFacade) { 
      this.myTaskHierarchyFacade = myTaskHierarchyFacade; 
      return this; 
     } 

     public PDFExportDataBuilder setMyGanttChartExportProcessor(GanttChartExportProcessor myGanttChartExportProcessor) { 
      this.myGanttChartExportProcessor = myGanttChartExportProcessor; 
      return this; 
     } 

     public PDFExportDataBuilder setMyResourceChartExportProcessor(ResourceChartExportProcessor myResourceChartExportProcessor) { 
      this.myResourceChartExportProcessor = myResourceChartExportProcessor; 
      return this; 
    } 

     public PDFExportDataBuilder setStylesheet(String stylesheet) { 
      this.stylesheet = stylesheet; 
      return this; 
     } 

     public PDFExportData create() { 
      return new PDFExportData(this); 
     } 
    } 

    private PDFExportData(PDFExportData.PDFExportDataBuilder b) { 
     super(b.myExportSettings, b.myOutputFile, b.myProjectName, b.myProjectDescription, b.myOrganization, b.myResourceManager, b.myTaskHierarchyFacade, b.myGanttChartExportProcessor, b.myResourceChartExportProcessor); 

     myStylesheet = b.stylesheet; 
    } 
} 

그리고이 후 인스턴스화 그래서 냄새 쉬운 조용 아니다 :

공공 정적 무효 메인 (문자열 []에 args) 예외 {

을 던진다
PDFExportData pdf = new PDFExportData.PDFExportDataBuilder() 
      .setMyExportSettings(new GanttExportSettings()) 
      .setMyGanttChartExportProcessor(new GanttChartExportProcessor()) 
      .setMyGanttChartExportProcessor(new GanttChartExportProcessor()) 
      /// .... 
      .create(); 
} 

이 경우 필요한 매개 변수를 모두 작성기로 전달해야합니다.

Bundle 일부를 생성하여 PDFExportData 생성자에 전달해야하는 모든 값을 저장할 수 있습니다.

관련 문제