글 작성자: Doublsb

왜 partial Enum을 쓰려고 했는가

최근 개인 프로젝트에서 partial class를 자주 활용하는 방식으로 개발하고 있다.

파일 하나에 클래스의 모든 멤버나 메서드를 정의하지 않고, 다른 파일에 나눠서 적을 수 있어서 확장성이 높은 방법이라고 생각한다.

 

이런 방식을 자주 쓰다 보니 아래와 같은 경우가 생겼다.

public static partial class ModifierUtil
    {
        public const int StatMaxPenaltyId = 3;
        
        public static void AddStatPenalty(this ModifierStorage storage, int value)
        {
            storage.Add(new ModifierSomething(StatMaxPenaltyId, value));
        }
    }

 

새로운 클래스를 정의할 때마다 관련된 확장 메서드를 만들고 있었는데, 나는 이를 구분하기 위한 Id가 필요했다.

그래서 const로 Id를 선언하고, 파라미터에 전달하는 방식을 사용했다.

 

문제를 깨달은 건 이런 방식으로 세 개 정도 메서드를 만들었을 때였다.

만약 새 Id를 선언하고 싶으면, ModifierUtil 클래스를 선언한 모든 파일을 참조해서 Id를 사용했는지 대조해야만 했다.

이렇게 바보같은 방법을 사용할 수는 없으니, 즉시 Enum을 사용하려고 했다.

 

오잉? 그러면 각기 다른 파일에 Enum을 정의할 수는 없는 걸까?

 

나는 코드에 partial enum을 입력해봤으나, 돌아오는 건 오류 메세지 뿐이었고 ^O^...

결국 모든 Id를 중복 없이 사용하기 위해 한 파일에 작성하게 되었다.

 

 

같은 문제를 제기한 사람들은 없었나?

보통 이런 생각을 한 게 나뿐일리 없기 때문에, 즉시 인터넷에 partial enum을 검색해봤다.

https://github.com/dotnet/csharplang/discussions/2669

 

Feature request: Partial enums · dotnet csharplang · Discussion #2669

Ok so I thought of maybe of doing the partial keyword on enums for large enum files like for example cil OpCode list Example for example to do it like this //ArithmeticOpCodes.cs public partial enu...

github.com

 

깃허브에는 C# 기능 제안 레포가 있고, partial enum 기능을 제안한 사람도 있었다. 2019년에 제안된 뒤로 액션은 없었지만!

그러나 유저들이 토론한 스레드를 읽어보았더니 왜 이 기능이 없었는지는 납득할 수 있었다.

 

 

A, B, C, 세 개의 파일이 있다고 해보자.

//File A
public partial enum Example
{
	a,
	b,
}

//File B
public partial enum Example
{
	c,
	d = 999,
}

//File C
public partial enum Example 
{
	e,
	f,
}

 

자, 여기에서 (int)c는 얼마일까? 혹은, 얼마여야 하는가?

직접 값에 대한 서술을 하지 않는 이상 아무도 알 수 없을 것이다.

 

게다가 enum은 컴파일 시점에 모든 값이 결정되어야 하므로, 런타임에는 값을 변경할 수도 없다.

 

//File A
public partial enum Example
{
	a = 1,
	b = 2,
}

//File B
public partial enum Example
{
	c = 3,
	d = 4,
}

//File C
public partial enum Example 
{
	e = 5,
	f = 6,
}

 

Enum의 값을 알기 어렵다면, 모두 선언해주면 되지 않을까?

그런데 그건 정말 옳은 방식일까? 차라리 C#측에서 모든 값을 선언해야 하는 다른 자료형을 만드는 것이 낫지 않을까 싶다.

반응형