안녕하세요. 개발하며 자주 도움 받고 있습니다. 감사합니다.
작은 게임을 개발 중인데, 코드를 어떻게 만들어야 하는지 판단이 어려워 질문을 드립니다.
작업한 내용을 설명 드리겠습니다.
1. 액터는 빈번히 생성 및 소멸되기 때문에 데이터를 분리하여 메모리에 들고 있고, 액터 인스턴스 생성 시 참조하려 합니다. 예시 코드에선 DataSet입니다.
2. 각 액터는 총 세 가지 기능이 있습니다.
1) 공통 데이터로 하는 공통 기능인 ShowName
2) 고유 데이터로 하는 공통 기능인 Work
3) 고유 데이터로 하는 고유 기능인 Play, Sing
3. 공통 데이터가 있기 때문에 이를 묶어 DataParent를 만든 뒤 각 액터에서 사용할 고유 데이터를 추가로 정의한 DataA, DataB를 만들었습니다.
4. 공통 기능을 묶어 ActorParent를 만들고, ShowName에 DataParent.Name이 필요하기 때문에 필드로 넣었습니다.
5. 고유 기능을 추가로 정의한 ActorA, ActorB를 만들고 DataA 사용량이 많은 ActorA에는 DataA 필드를 추가로 넣었습니다. DataB 사용량이 적은 ActorB는 부모의 Data를 매번 캐스팅해서 사용하도록 하였습니다.
public abstract class DataParent
{
public readonly string Name;
protected DataParent(string[] data)
{
Name = data[0];
}
}
public class DataA : DataParent
{
public readonly string AValue1;
public readonly string AValue2;
public DataA(string[] data) : base(data)
{
AValue1 = data[1];
AValue2 = data[2];
}
}
public class DataB : DataParent
{
public readonly string BValue;
public DataB(string[] data) : base(data)
{
BValue = data[1];
}
}
public abstract class ActorParent
{
protected readonly DataParent Data;
protected ActorParent(DataParent data)
{
Data = data;
}
public void ShowName() => Console.WriteLine(Data.Name);
public abstract void Work();
}
public class ActorA : ActorParent
{
private readonly DataA DataA;
public ActorA(DataParent data) : base(data)
{
DataA = (DataA)data;
}
public override void Work() => Console.WriteLine($"A work : {DataA.AValue1}");
public void Play() => Console.WriteLine($"A play : {DataA.AValue2}");
}
public class ActorB : ActorParent
{
public ActorB(DataParent data) : base(data) { }
public override void Work() => Console.WriteLine($"B work : {(Data as DataB).BValue}");
public void Sing() => Console.WriteLine($"B sing");
}
public class Manager
{
public static Dictionary<string, DataParent> DataSet = new()
{
{ "A", new DataA(new string[] { "aaa", "avalue1", "avalue2" }) },
{ "B", new DataB(new string[] { "bbb", "bvalue" }) },
};
public void Run()
{
var actorA = new ActorA(DataSet["A"]);
var actorB = new ActorB(DataSet["B"]);
var actors = new List<ActorParent>
{
actorA,
actorB,
};
foreach (var actor in actors)
{
actor.ShowName();
actor.Work();
}
actorA.Play();
actorB.Sing();
}
}
다음은 질문입니다.
1. 이런 구조 안에서는 ActorA처럼 하위 데이터 타입의 필드를 하나 더 만들어 사용 하는 게 최선의 방법일까요? 아니라면 어떤 방법이 있을까요?
2. 위에 적은 작업 순서대로 진행하다 보니 자연스레 이런 구조가 만들어졌는데, 혹시 개선 할 수 있다면 어느 부분에서 생각을 달리 했어야 했을까요?
3. 혹시 공부가 많이 필요해 보여 직접적인 답변을 주시기 꺼려 지신다면, 이런 구조를 개선할 수 있는 힌트나 검색 해봄직한 키워드를 주시면 정말 감사드리겠습니다.
내리 며칠 고민하다 용기 내어 질문 드려봅니다. 감사합니다.
[최초 등록일: ]
[최종 수정일: 4/27/2022]