private readonly Dictionary<string, Action> commandMap = new()
{
["Jump"] = Jump,
["Run"] = Run,
["Attack"] = Attack,
["Defend"] = Defend
};
public void ExecuteAction(string command)
{
if (commandMap.TryGetValue(command, out var action))
action();
else
Console.WriteLine("Unknown command.");
}
그래서 이런식으로 딕셔너리 매핑한후에
O(N)에서 O(1)으로 줄임
그리고 스위치 길어지면 전략패턴으로 전환하고
if else문 3중첩 이상으로 가면 코드가 가독성이 떨어짐
막상 코드 품질 중요시한다는 놈이 빅오 생각 안하는거니까
if가 BigO 차수를 늘림?
if문 개수가 N이라고? if가 동적으로 수백개까지 늘어나진 않잖아
IF문-> O(N) 구조임 해시테이블 기반->O(1) 구조임
어차피 상수 수준 아닌가. 물론 if문떡칠을 옹호하는건 아닌데 그게 큰 요소라고 생각하진 않음
해시 탐색이 빠름. 최악 시간 복잡도 따져도 딕셔너리쪽이 빠름
C# 딕셔너리는 체이닝이 잘되서 평균 O1임 그래서 실제적으로는 작은건 차이없는데 클수록 차이큼
예전에 한번은 실행속도가 느려서 원인분석좀 해보래서 그런 비슷한거 찾았었거든 근데 병목을 찾으라고 쿠사리먹음 좋은말로 듣긴했는데 넓게보라더라 그런 습관을 들이는거 자체는 좋은데 식당으로 비유하면~ 약간 젓가락질 잘하는정도의 습관같음
예시는 4개고 커맨드가 많아봐야 얼마나 많나 싶긴해서, 커맨드가 20개넘어간다하면 성능보다는 가독성때문에 if문 뜯어낼듯
O(n)이 항상 O(1)보다 느리진 않다. 저렇게 동작이 네개 뿐이면 해시 계산이 더 걸릴 수 있지 않나? - dc App
ㄴㄴ 실제로 체이닝때문에 실제로는 해시테이블쪽이 더 빠른경우가 많습니다. 물론 항상 느리진 않다는건 맞긴합니다
해시테이블은 기본적으로 해시 계산이라는 비용이 있는데 이는 if else가 3중첩 들어가는 이상 대부분은 체이닝비용보다 더 큽니다
캐시가 될만한 코드가 더 중요
재미있는 방식이네, 좋은거 배웠다.