C#

[코드 최적화] 스파게티화 된 코드를 푸는 방법 0장 - 개요

LemonCandy 2021. 8. 11. 00:07

오늘 코드중에 꽤나 거슬리는 코드를 발견하게 되어 기록을 남깁니다.

요약하면 이런 코드입니다.

    void Start()
    {
        if(1 /*조건 1*/)
        {
            // 내용
            // 내용
            // 내용
            // 내용
            // 내용

            if (1 /*조건 2*/)
            {
                // 내용
                // 내용
                // 내용
                // 내용
                // 내용
                // 내용
                // 내용

                // 내용
                if (1 /*조건 3*/)
                {
                    // 내용
                    // 내용

                    if (1 /*조건 4*/)
                    {
                        // 내용
                        // 내용

                        if (1 /*조건 5*/)
                        {
                            // 내용
                            // 내용

                            if (1 /*조건 6*/)
                            {
                                // 내용
                                // 내용
                                // 내용
                                // 내용

                                if (1 /*조건 7*/)
                                {
                                    // 내용
                                    // 내용
                                    // 내용
                                    // 내용
                                }
                            }
                        }
                    }
                    else
                    {
                        // 내용
                        // 내용
                        // 내용
                        // 내용
                    }
                }

                // 내용
            }
        }

        // 내용
    }

 

저는 함께 일하는 동료들 개개인의 코드 취향을 존중합니다만, 개인적으로 저런 코드는 가만히 두지 못하고 의도를 물은 뒤, 반드시 필요한 의도가 있다면 의도를 지키는 선에서 리팩토링을 진행하는 편입니다.

십중팔구 저런 상태의 코드는 장기적으로 반드시, 반드시! 문제를 발생시킵니다.

 

첫번째로 코드 깊이가 깊어짐으로 인하여 코드가 화면 밖을 넘어서기 때문에 우리가 한눈에 코드를 볼수 없게됩니다.

코드는 "한눈에 들어와야 하므로" 가능하면 한 화면을 넘지 않는게 좋습니다.

 

두번째로 if 아래쪽의 else 처리를 하고 싶을때에 코드 구분이 힘들어집니다.

이 부분만 보고 위에 어떤 if 조건이 들어있는지 구분이 가능합니까?

 

세번째로 깊이를 떠나 저런식으로 코드를 작성하다보면 반드시 여러가지의 기능이 중첩되며, 기능을 덧대다보면 하나의 함수에서 너무 많은 일들을 하게되어 나중에는 저 함수 위에서 너무 많은 기능들이 구현되어버리는 상황이 되기 때문에 뒤늦게 최적화 및 모듈화 하려고 해도 쉽게 진행할 수 없습니다.

 

말 그대로 우리가 흔히 들어본 스파게티 코드가 되는것입니다.

 

위의 이유들로 인하여 저렇게 코딩하는 것은 멀리해야하는 것이 맞습니다.

현업 프로그래머분들이라면 당연히 알고 계시겠지만, 저런 상황을 맞닥뜨리는 경우 써볼법한 꼼수들을 소개합니다.

어렵지 않으며, 쉽게 정리할수 있고, 일부라도 수정해두면 장기적으로 정리하기 수월해집니다.

너무 스파게티화 되어있는 코드는 한번에 정리하기 힘들기 때문입니다.

 

분명 이 주제와 같은 문제를 함께 일하는 동료들이 일부러 만든 것은 아닐 것입니다.

경험상 제가 느낀 가장 큰 원인은 최초에 잘 만든 코드 사이로 서로 자신의 작업물을 하나 둘씩 끼워넣어가며, 자신의 작업물을 완성시키다보니 저러한 악취들이 쌓여갑니다. 보통 하나 둘 끼워넣는 상태에서는 괜찮겠지? 문제없겠지?라고 생각하며 눈치 채지 못하지만 위에 제가 예시로 들은 것처럼 결국 최종적으로 누군가가 저런 상황을 직면하여 사고가 일어나기 직전이 되어서야 깨달을 수 있게 됩니다.

 

결국 누구의 손에서는 폭발하며, 누군가는 책임져야하는 코드입니다.

 

그때 눈치를 채고 손을 대려고 하더라도 본인이 함부로 손대기에는 너무 스파게티화 되어 손을 대기 어렵습니다. 실력을 떠나 저런 코드를 고치기 위해서는 경우에 따라서 꽤나 깊은 경험과 강력한 집중력이 요구됩니다. 실수라도 일어난다면 책임은 본인이 지니까요...

 

자신이 몸담고 있는 프로젝트의 코드에 책임감을 가지고 항상 정리해두어야합니다.

 

하지만 이러한 것들이 자신의 가치를 증명하기도 합니다.

따라서, 앞으로 소개해드리는 방법으로 코드를 정리해두시면 보다 큰 문제들을 없애는데 도움이 되실것으로 생각합니다.

내용 보시면서 많은 도움이 되셨으면 하며, 질문은 덧글로 부탁드릴게요.

감사합니다.