내가 만들고 있는 게임에서 Script 구조가 CharacterSystem, SkillSystem, StatSystem으로 폴더를 구분하고 어셈블리 definition을 각 파일에 넣어둔 상태임
그런데 CharacterSystem은 SkillSystem을 참조하고 SkillSystem은 CharacterSystem을 참조하는 순환 참조 문제가 발생함
그래서 AI한테 물어보니 의존성 역전 얘기를 하더라고
Core라는 새로운 폴더와 asmdef를 만들고 Core는 다른 무엇도 참조하지 않게 하고 CharacterSystem의 핵심인 Character.cs만 Core로 옮겨서 해결하라고 해서 옮김
그 결과 Core가 StatSystem이랑 SkillSystem을 참조해야만 하는 상황이 만들어져서 다시 물어보니 Character.cs에 필요한 파일들만 Core로 옮기라고 하는데 이거 계속 반복하면 Core에 모든 파일이 들어가게 생겨서 그냥 내가 생각을 해봤음
그렇게 생각을 해서 나온게 ICharacter같은 인터페이스를 만들어서 이 인터페이스를 Core에 넣어두고 실제 구현은 CharacterSystem에서 하고 SkillSystem은 ICharacter를 참조하게 했는데 내가 제대로 해결한게 맞는지 의문이 들어서 글 씀
1. 폴더 구조를 처음부터 잘못 잡아서 문제가 생긴건가?
2. 의존성 역전을 제대로 사용한게 맞나?
의존성 역전은 흠. 뭐냐 약간 그런 개념인거 같음. 지금 구현되거는 원래는 상대 클래스를 그대로 참조함. 하지만 중간에 인터페이스를 하나 넣어서 상대 클래스가 뭔지 명확히 안써도 호출가능하게 하는 그런 느낌이고 두 클래스간의 관계는 따로 '세팅' 하는 클래스에서 한다 이거임 캐릭터 클래스에서는 '직접' 스킬시스템 클래스를 접근하지 않는거지 예를 들면 각종 System이라는 것은 ISystem이라는 모듈을 구현한다고 해보셈 그럼 ISystem은 캐릭터/직업/스킬 모든걸 해야되잖음? 그럼 ISystem은 구체적일수가 없음 object getValue(string key);, object getValueById(string key, int id) 같은거나 되겠지
ISystem skillSystem을 받아서 getValue(string key); 로 모든걸 해결한다고 해보셈 그러면 뭐가 좋으냐 ChracterSystem은 내부에서 어떤 기능을 동작할때 skillSystem.getCapableSkillList() 이런걸 받는게 아니라 skillSystem.getValue("capableSystem") 이걸 받고 skillSystem은 이걸 알맞게 구현해줘야됨 그리고 이 값을 상대적으로 일반적인 데이터 자료형을 통해서 주고 받으면 됨 그러면 뭐가 좋으냐? skillSystem의 함수의 이름이나 그런게 에러 났을때 컴파일 타임에 에러가 안남 런타임에는 날수도 있음 컴파일타임에 에러가 안나고 런타임에 에러가 나면 뭐가 좋으냐 . SkillSystem을 지워버려도
skill시스템을 사용하지 않는 다른 씬을 테스트할때는 에러가 안남
여튼 상대클래스 혹은 상대클래스에서만 쓰는 데이터성 클래스를 알고 잇어야만 되는 클래스를 없애버리고 걔를 몰라도 우선은 돌아가는 클래스로 만들어서 코드상의 결합도를 줄이면 관리가 편해진다는 거임 만약 캐릭터 클래스와 유사하지만 스킬시스템을 활용하는게 아니라 강화시스템을 사용하는 다른 기능(NPC 클래스)을 넣고 싶어 그러면 서로 알지 못하게 의존성 주입이 따로 되도록 디커플링 시켜놓은 코드에서는 캐릭터 클래스 복사 해서 NPC클래스라고 이름 바꾸고, 스킬시스템 클래스 복사해서 강화시스템이라고 이름만 바꾸면 됨 우선 돌아가는 코드가 됨 거기서 홈페이지 페이지나 모바일 UI바꾸듯이 그 코드만 수정하면 기존 코드는 에러 안나고 추가기능 개발이 빨라짐. 그런걸 노리는거 같음. 잘은 모름 ㅋㅋ
너가 말하는 DIP는 그런 개념이 아님 변화에 대응하기위해 의존성을 추상화로 옮긴다는 개념임. 우선 전체 로직을 하나로 합쳐서 생각해봐 이후 로직을 역할에 따라 분리해보는거야 캐릭터 , 스킬 , 스탯이 하나의 모듈에 정의되어있다고 하면, 이제 이걸 역할에 따라서 캐릭터 - 스킬 - 스탯으로 분리하는거야 분리 되었으면 의존관계를 파악해야지 캐릭터는 스킬과 스탯을 Has 관계로 가지는게 논리적으로 맞을거야. 그렇다면 캐릭터는 이 스킬과 스탯에 대한 정보를 참조하고 있어야 하지.
만약 이 과정에서 스킬과 스탯이 캐릭터를 상호 참조하는 상황이 발생하는 경우, 가장 좋은 방법은 이 정보들을 몰라도 상관없도록 함수 인터페이스를 고치는것이고, 불가능하다면 공용 인터페이스를 통해서 네가 말한 DI를 제공하는게 맞아