[C#] partial class

Ceing·2025년 3월 11일

C-Sharp

목록 보기
3/4
post-thumbnail

개요

  • partial class는 C#에서 제공하는 클래스, 구조체, 메서드 등 한 타입을 두 개 이상으로 분할이 가능하게 함
  • 즉 하나의 클래스를 여러 파일에 걸쳐서 정의할 수 있게 함
  • 왜 사용해야할지를 예제를 들겠음

예제

  • HTTP 요청 메시지의 데이터는 string 문자열이므로 C#에서 이를 사용하기 위해선 객체 혹은 적절한 값으로 파싱하는 작업이 필요
  • 또한 다시 객체를 HTTP 응답 메시지 바디에 넣으려면 string 으로 변환하는 작업이 필요
  • 따라서 string => 객체, 객체 => string을 가능하게 해주는 Converter 클래스를 정의

1. ISP 위배 문제

namespace Project
{
  public class Converter
  {
  	  /**
      * 컨버터 등록 관련 기능
      */
      
      // 컨버터 등록 가능한지 검증
  	  public void CanRegister(){
      
      }
      
      // 컨버터 등록
      public void Register(){
      
      }
      
      /**
      * 컨버팅(변환) 관련 기능
      */
  	  
      // 컨버팅 가능한지 검증
      public bool CanConvert()
      {

      }

	  // 문자열에서 값으로 컨버팅 수행
      public T ConvertStringToValue(string str)
      {

      }
      
      // 값에서 문자열로 컨버팅 수행
      public string ConvertValueToStirng(T value)
      {

      }
      
      
  }
  
}
  • 현재 Converter 클래스는 컨버터 등록과 사용이 혼용됨.
  • 좋은 객체 지향 설계 SOLID 중 ISP를 위하여 등록과 사용을 분리하기로 함.
  • 어떻게 할지 고민하다 partial 키워드를 통해 이 둘을 분리해보기로 다짐.
  1. 1차적 해결(partial)
namespace Project
{
 /**
  * 컨버터 등록 관련 기능
  */
  public partial class Converter
  {
  	  
      
      // 컨버터 등록 가능한지 검증
  	  public void CanRegister(){
      
      }
      
      // 컨버터 등록
      public void Register(){
      
      }
  }
  
  /**
	* 컨버팅(변환) 관련 기능
    */
  public partial class Converter
  {
      // 컨버팅 가능한지 검증
      public bool CanConvert()
      {

      }

	  // 문자열에서 값으로 컨버팅 수행
      public T ConvertStringToValue(string str)
      {

      }
      
      // 값에서 문자열로 컨버팅 수행
      public string ConvertValueToStirng(T value)
      {

      }
      
  }
  
}
  • 이렇게 Converter을 등록과 사용으로 partial을 통해 분리해보았지만 생각해보면 ISP에 따르면 그 둘을 "완전히" 분리해야 올바른 ISP를 준수한 설계임
  • partial로 각 영역을 분리하긴 하였지만 결국 사용 시점에 한 Converter에 의존되므로 아예 다른 클래스를 만들어 완전히 분리하고자 함

3. 최종 해결

namespace Project
{
 /**
  * 컨버터 등록 관련 기능
  */
  public class Register
  {
  	  
      
      // 컨버터 등록 가능한지 검증
  	  public void CanRegister(){
      
      }
      
      // 컨버터 등록
      public void Register(){
      
      }
  }
  
  /**
	* 컨버팅(변환) 관련 기능
    */
  public class Converter
  {
      // 컨버팅 가능한지 검증
      public bool CanConvert()
      {

      }

	  // 문자열에서 값으로 컨버팅 수행
      public T ConvertStringToValue(string str)
      {

      }
      
      // 값에서 문자열로 컨버팅 수행
      public string ConvertValueToStirng(T value)
      {

      }
      
  }
  
}

최종적으로 둘을 완전히 분리하여서 ISP를 만족할 수 있었음

의의

  • partial 개념을 이해하고자 해당 예제를 떠올려서 ISP에 부합하는 설계를 하고자 하였지만, ISP를 지키기에는 완전한 독립이 아니었음
  • 따라서 partial은 한 클래스가 갖는 기능을 분리할 때 사용하자
profile
이유에 대해 끊임없이 생각하고 고민하는 개발자

0개의 댓글