2.방대한 클래스 Large Class

[ 2017-07.12 작성 ]

기능이 지나치게 많은 클래스에는 엄청난 수의 인스턴스 변수가 들어있다. 접두어나 접미어가 같다면 하나의 클래스로 추출하는 것이 좋다. 인스턴스 변수를 계속해서 모두 사용하지 않는 클래스에 대해서는 클래스 추출 또는 모듈 추출을 적용한다.

Symptoms

클래스는 많은 필드 / 메서드 / 코드 행을 포함합니다

Reasons for the Problem

Class는 대게 작게 시작됩니다 그러나 시간이 지남에 따라 프로그램이 성장함에 따라 그들은 비대해집니다
일반적으로 기능에 대한 새 클래스를 만드는 것보다 기존 클래스에 새 기능을 배치하는 것이 정신적으로 덜 부담스럽다는것을 알게 됩니다.

Treatment

Class에 너무 많은 기능적인 것들이 있다면 그것을 분리하는 것에 대해 생각해 볼 수 있습니다.

Extract Class : 큰 클래스의 일부 동작을 별도의 구성 요소로 분리 할 수 있는 경우 도움이 됩니다.
Extract SubClass : 큰 클래스의 일부 동작을 다른 방법으로 구현하거나 드물게 사용하는 경우 유용합니다.
Extract Interface : 클라이언트가 사용할 수 있는 작업 및 동작 목록이 필요할 경우 도움이 됩니다.

Payoff

이러한 클래스의 리팩토링은 개발자가 클래스에 대해 많은 수의 속성을 기억할 필요가 없도록 합니다.
많은 경우에 방대한 클래스를 파트로 나누면 코드와 기능의 중복을 피할 수 있습니다.

1. Extract Class

한 클래스가 두 가지 이상 작업을 수행 할 때 어색함이 발생합니다.
대신 새 클래스를 만들고 관련 기능을 담당하는 필드와 메서드를 이 클래스에 포함시킵니다.

  • 이 리팩토링 방법은 Single Responsibility Principle의 준수를 유지하는 데 도움이 됩니다. Class 코드가 더 분명하고 이해할 수 있습니다.
  • 단일 책임 클래스는 보다 안정적이며 변경에 대해 관대합니다. 예를 들어, 10가지 다른 일을 담당하는 클래스가 있다고 가정해 보면 한가지를 위해 이 Class를 변경하면 9가지의 다른 일에 대하여 위반할 위험이 존재합니다.

2. sample code : Extract SubClass로 분리하여 구현할 수 있습니다.

메인 클래스가 현재 두 가지 이상의 특별한 경우를 구현하고 있다면 여러 하위 클래스를 만들 수 있습니다.

PartnerOrderController
namespace Partner.Areas.Page.Controller
public class PartnerOrderController : AbstractController{
   // Member Field 
  // Method
  region [송장처리] endregion
  region [partnerOrder] endregion
  region [PartnerOrderDetail] endregion
  region [PartnerOrderDetail - 강제입금처리] endregion
  region [PartnerOrderDetail - 결제방법 변경] endregion
  region [PartnerOrderDetail - 작업메모] endregion
  region [Partn erOrderDetail - 배송예정일] endregion
  region [PartnerPrintOrder] endregion
  //...
  public ActionResult PartnerOrderExcelUploadPartial()...
  public JsonResult UploadPartnePackingInfo()...
  public ActionResult PartnerOrderDayListExcelDownLoad(ListFormParam param, OrderSearchVO searchVO)...
  //...
  public ActionResult PartnerJopanJob()...
  public Action Result InsertJopan(string materialCode, string size, string color, [DefaultValue(0)]int isDonTang, string paperCount, string orderItemIds)...
  public ActionResult PartnerJopanOrder()...
  public ActionResult PartnerJopanOrderList()...
  
  //code 2338 line 
}

PartnerOrderController에 code가 2338 line이나 됩니다.

PartnerOrderController.Payment
public partial Class PartnerOrderController : AbstractController{
 //  [입금&결제 처리관련]
   region [PartnerOrderDetail - 강제입금처리] endregion
  region [PartnerOrderDetail - 결제방법 변경] endregion
}
PartnerOrderController.Jopan
public partial Class PartnerOrderController : AbstractController{
 //  [조판 관련]
 public ActionResult PartnerJopanJob()...
  public Action Result InsertJopan(string materialCode, string size, string color, [DefaultValue(0)]int isDonTang, string paperCount, string orderItemIds)...
  public ActionResult PartnerJopanOrder()...
  public ActionResult PartnerJopanOrderList()...
}
PartnerOrderController.Excel
public partial Class PartnerOrderController : AbstractController{
 //  [excel 관련]
 public ActionResult PartnerOrderExcelUploadPartial()...
 public JsonResult UploadPartnePackingInfo()...
 public ActionResult PartnerOrderDayListExcelDownLoad(ListFormParam param, OrderSearchVO searchVO)...
}

3. Extract Interface

여러 클라이언트가 Class Interface의 동일한 부분을 사용하고 있다면 이 부분을 자체 인터페이스로 이동할 수 있습니다.