원
원츠마인드 (220.♡.126.98)
2024년 5월 24일 AM 11:02 · 수정됨(06. 17. 08:26)
조회 1,095 공감 0
댓글 (21)
- 개
개발용
24.05.24 · 119.♡.145.66
-
여여기는시골마을같아요
→ 개발용 작성자
24.05.24 · 220.♡.126.98
저도 둘다 쓰고 있는데, 쓰다가 뭐가 더 좋을까 고민하게 되네요.
특히 확장성, 유지보수용이성으로 보자면,
예를들어,
Mode가 나중에 10개가 추가되었다고 한다면,
좀 달라질까요?
아니 100개가 추가된다면
어떨까요?
1번의경우,
장점:
enum 항목만 추가하면 된다.
단점:
enum을 변경하게 되면, 기존 GameState 클래스가 변경되어서 Open-Closed 원리에 위배됩니다.
그럼 enum 정의를 GameState 클래스 밖에다 선언하게되면,
GameState 클래스는 외부선언값인 enum 에 의존성을 갖게 됩니다.
2번의 경우,
장점:
확장에 용이하다.의존성이 없다.
단점:
클래스를 그만큼 생성해야한다.
전 2가 그나마 좋다고 생각해서 2를 만들다가
클래스가 많아지다보니,
compare 할 경우 조건문을 많아지고
추가적인 작업들이 있는데
이게 맞는것인가? 의문이 듭니다. - 개
개발용
→ 여기는시골마을같아요
24.05.24 · 119.♡.145.66
개인적으로 1번의 경우 enum 이 추가된다는 가정을 안해서요..
만약 불가피하게 추가된다면 OCP 에따라서 기존 클레스의 enum 을 수정할게 아니라
GameStateExtended extends GameState {
public enum ExtendedMode {
Arena(GameState.Mode.Arena),
PvP(GameState.Mode.PvP),
PvE;
private final GameState.Mode originalMode;
ExtendedMode(GameState.Mode originalMode) {
this.originalMode = originalMode;
}
public GameState.Mode getOriginalMode() {
return originalMode;
}
}
}
식으로 확장을 하던가
Wrapper 로 계속 감싸야 하지 않을까요? -
여여기는시골마을같아요
→ 개발용 작성자
24.05.24 · 220.♡.126.98
자바는 enum 이 object 인가 보군요. ;;;
하긴 swift 도 enum 이 object 였던것 같네요. -
에에놀미타
24.05.24 · 220.♡.243.102
enum class BattleMode { PvE, PvP, Arena };
이건 거의 바뀔 일이 없어서 굳이 복잡하게 할 필요가 없을 것 같아요 -
여여기는시골마을같아요
→ 에놀미타 작성자
24.05.24 · 220.♡.126.98
예시를 게임으로 든것이지만,
다른분야의 클래스일경우 Mode 가 천차만별일수 있습니다.
그럴 경우에 대한 고민이네요. -
KKyleDev
24.05.24 · 112.♡.76.76
일단 완성하고 최적으로 리팩토링하는게 답이 아닌가 싶습니다. 물론 자기가 만든 코드지옥을 헤쳐나올 수 있다며 말이죠. {emo:onion-035.gif:50} -
여여기는시골마을같아요
→ KyleDev 작성자
24.05.24 · 220.♡.126.98
저도 항상 옛날 코드 보고 리팩토링을 하는데
왜 처음부터 이렇게 설계안했을까 하는 후회를 종종합니다.
그런 불평, 고민에서 나온 의문이었습니다. -
에에헤라디야
24.05.25 · 76.♡.210.164
저는 개인적으로 2번으로 해야 한다고 생각합니다. 단일 클래스의 구현은 단일 컨택스트로 최소한의 정보만 가지고 있어야 한다고 생각하거든요. 앞서 댓글에 언급하신 추가적 작업이 있다고 하더라도요.
1번처럼 설계를 하게 되면 해당 클래스는 모든 기능을 다 가지고 있는 초대형 클래스가 되어 버립니다. 그러면 나중에 당연히 리팩토링 1호 대상이 되고 얘를 리팩토링 하게 되면 1번 클래서는 enum을 가진 switch case만 남게 되고 내부 구현은 결국 2번 클래스들로 호출을 하게 되는 형태가 되어버리게 됩니다. 그렇기 때문에 아예 처음부터 2번처럼 작업해야 하는 것이 옳습니다. -
여여기는시골마을같아요
→ 에헤라디야 작성자
24.05.25 · 220.♡.126.98
확장성과 유연성을 고려안한다면
1,2 번 큰차이는 없고 오히려 1번이 더 편할수가 있습니다.
하지만,
우리는 언제 어떻게 요구사항이 변경될지 모르기에..
1번의 경우는 Single Responsilbity 원칙과 Open-Closed 원리에 위배됩니다.
예를 들어서,
GameState 클래스 내부에 DoSometing 함수를 만들어야 하고,
그 안에 Mode 별로 다르게 처리 해야 한다면,
1번의 경우
void DoSomthing (){
if(mode == Arena){
// do something in arena
}
else if ( mode == PvP ){
// do somthing in PvP
}
}
나중에 Mode가 더 추가가 될경우,
저 함수내부에 또 추가해야 합니다.
이건 Single 책임에 위배됩니다.
2번의 경우는
public abstract class GameState(){
public int id;
public string name;
public abstract void DoSomething();
}
public class Arena:GameState(){
public void DoSomething(){
// do something in Arena
}
}
public class PvP :GameState(){
public void DoSomething(){
// do something in PvP
}
}
이렇게 해버리면,
클래스와 코드는 딱 정해진 한가지 모드에 대해서만 관리가 됩니다.
댓글을 작성하려면 이 필요합니다.
자체 기능은 없고 외부에서 구분해서 구현해야하는 단순 구분만 한다면 1번이요
1번은 데이터 CRUD 에서 사용하고
2번은 Controller, Command, Service 등 처리 부분에서 쓰죠
근데, 뭘 선호 한다기 보다는 해당 클래스가 데이터를 담아서 여기저기 주고받으며 사용 할 것인가
아니면 받은 데이터를 처리 할 것인가에 따라서 선택하는거라 둘 다 씁니다.