Contents
접기
728x90
TextRPG 프로젝트 초기 단계에서, 모든 기능이 하나의 메인 클래스 또는 절차적 코드에 집중되어 있었다.
맵 이동, 전투 시스템, 아이템 사용 등 주요 기능이 구분 없이 나열되었고 이로 인해 코드의 복잡성이 증가하고 유지보수성이 떨어지는 문제가 발생했다.
문제 상황
초기 개발 단계에서는 맵 이동, 전투, 아이템 사용 등 게임의 주요 기능이 한 파일 또는 몇 개의 클래스에 몰아넣어진 형태로 구현되었다.
이로 인해 다음과 같은 문제가 발생했다:
- 코드가 한 파일에 집중되어 가독성이 떨어짐
- 전투/아이템/플레이어 기능들이 명확히 분리되지 않고 얽혀 있음
- 기능 추가 시 기존 코드에 직접 수정이 필요하여, 수정 범위가 넓어지고 오류 가능성 증가
원인 분석
- 초기 설계 부재: 구조화 없이 빠른 개발에 초점을 맞춤
- 단일 책임 원칙(SRP) 위반: 하나의 클래스가 여러 역할을 동시에 수행
- 코드 의존성 증가: 데이터와 로직이 섞여서 독립적 관리 불가
해결 방법
이러한 문제를 해결하기 위해 MVC (Model-View-Controller) 패턴을 적용하여 구조를 리팩토링했다.
1. Model: 데이터와 로직 분리
- Player, Monster, Item 클래스를 별도의 Model Layer로 분리
- 모든 게임 데이터(플레이어 상태, 몬스터 HP 등)는 Model이 관리
public class Player
{
public int Hp { get; private set; }
public int Attack { get; private set; }
}
2. View: 화면 출력 담당
- UI 출력 기능(Console.WriteLine 기반)을 UIManager 등 View 전용 클래스로 이동
- 데이터는 View에 주입되고, View는 단순히 출력만 담당
public class UIManager
{
public void ShowPlayerStatus(Player player)
{
Console.WriteLine($"HP: {player.Hp}");
}
}
3. Controller: 흐름과 입력 제어
- 플레이어 입력을 처리하고, 상태에 따라 Model을 업데이트
- MonsterBattleManager, InventoryManager 등 컨트롤러 계층에서 입력/로직 제어 담당
public class MonsterBattleManager
{
private Player player;
private UIManager uiManager;
public MonsterBattleManager(Player player, UIManager uiManager)
{
this.player = player;
this.uiManager = uiManager;
}
public void StartBattle()
{
// 전투 로직 수행
uiManager.ShowPlayerStatus(player);
}
}
결과
- 가독성 향상: Model, View, Controller가 명확히 구분되어 코드를 이해하고 추적하기 쉬워짐
- 유지보수성 강화: 클래스들이 단일 책임을 가지게 되었고 기능 추가 시 관련 계층만 수정하면 되어 수정 범위가 명확해짐
- 확장성 증가: 보스 전투, 스킬 시스템 등 새로운 기능을 기존 구조를 크게 수정하지 않고 추가 가능
얻은 교훈
- 프로젝트 초기 단계에서도 구조적 설계는 필수적이다.
- 기능이 많아질수록 객체별 기능 분리를 더욱 신경써야한다.
728x90
'C# > C#프로젝트' 카테고리의 다른 글
[TeamProject2] C# 팀프로젝트 회고 - Dark Zeb(1등!) (0) | 2025.04.29 |
---|---|
[C#TeamProject][트러블슈팅] Monster 객체 재사용 문제와 객체 복제의 필요성 (0) | 2025.04.27 |
[C#Project] C# 개인 과제 개발 회고 – TextRPG (0) | 2025.04.21 |
[C#Project] Player가 Inventory를 참조할 때 발생한 순환 참조 문제 (Circular Dependency) (0) | 2025.04.19 |
[C#Project] TextRPG게임설계 (0) | 2025.04.18 |