어제 Cpp 코드를 짤 때 문제가 되는 코드들을 배웠다.
수업을 들으면서 어느정도 이해를 했지만 직접 코드를 작성할 때 기억이 날 것 같지 않아서 복습하기로 했다.
변수나 함수의 이름은 그게 무슨 역할을 하는지 명확히 표시해야한다.
똑같은 동작을 하는데 여러 곳에 함수가 분산되어 있으면 코드도 지저분하고 유지보수가 어렵다.
따라서 공통 부모 클래스에서 로직을 구현하고 상속을 받는 형식으로 하는 게 좋다.
한가지의 함수 내에서 여러가지 동작을 하면 복잡하기도 하고 유지보수 하기에도 곤란한 상황이 발생한다.
함수 내에서도 따로 동작하는 함수를 구현하여 호출하는 방식으로 해야 한다.
매개변수가 너무 많고 길면 알아보기도 힘들고, 나중에 사용할 때도 매개변수를 기억하기 힘들다.
따라서 구조체를 따로 만들어서 관리하면 가시성도 좋고 유지보수도 쉽고 사용하기에도 편리하다.
글로벌로 사용 가능한 데이터를 선언해놓으면 사용하기는 편리하겠지만, 어디서든 접근이 가능해 값이 의도치 않은 곳에서 변경될 수 있다.
그러므로 변수는 사용할 함수 내에서 선언 후 사용하는 것이 좋고, 언리얼에서는 Subsystem 을 이용하여 미리 선언해놓은 변수를 사용할 곳에서 GetSubsystem<>() 함수를 이용해 사용하면 된다.
데이터들은 아무데서나 막 건드릴 수 있으면 안 된다.
변수들은 public 이 아닌 private 에 선언하여 public 에 있는 함수들을 통해 값을 얻거나 변형해야한다.
하나의 클래스에 여러 시스템을 관리하는 것보다는 역할을 나누어 책임을 분담하는 것이 좋다.
비슷한 기능을 가진 함수를 여러 부분에 나누어 두는 것이 아닌, 통합적으로 그 기능을 담당하는 클래스를 만들어 관리하는 것이 좋다.
억지로 데이터를 끌어다가 함수를 생성하기보단 간단한 기능이라면 본래의 클래스에서 기능을 수행할 수 있도록 구현하는 편이 좋다.
아까와 마찬가지로 매개변수 목록이 많다면 구조체로 묶어서 관리하자.
체력을 단순히 변수로 생성하는 것이 아닌 클래스로 분류해 여러 기능을 담당하고 적재적소에 사용할 수 있도록 만드는 것도 좋다.
스위치문은 되도록 사용하지 않는 것이 좋으며, 부모 클래스를 만들어 자식 클래스들이 상속 받아 사용하는 것이 좋다.
반복문을 사용하지 말라는 것이 아니라 계속 말해왔던 책임을 분담하라는 의미이다.
만약 어떤 함수 내에 있는 반복문을 즉석에서 구현하여 사용하게 되면, 반복문 뿐만 아니라 함수 내의 변수들도 건드려야하는 상황이 발생할 수 있다.
굳이 다른 함수를 호출만 하고 아무런 기능을 하지 않는 중간 함수는 쓸모가 없다.
그 정도의 단순한 기능을 할 거면 구현을 즉석으로 하는 게 낫다.
이러이러한 기능들을 추가할 수도 있으니 확장성을 대폭 늘려 사용하지도 않는 함수들을 만들어두는 건 비효율적이다.
그럴거면 차라리 부모 클래스를 만들어두고 나중에 필요하면 상속을 하는 형식이 좋다.
모든 클래스가 사용하지 않는 변수를 만드는 것 보다는, 컴포넌트로써 사용될 수 있도록 클래스를 생성해 각각 사용될 수 있도록 한다.
화살표(->)를 통해 참조를 하는데 이를 너무 길게까지 활용하지 않도록 끊어주어야 한다.
아까와 비슷하게 로직 없이 위임만 하는 함수는 굳이 존재할 필요가 없다.
직접 수행할 수 있는 기능이라면 위임없이 책임도 분산할 겸 컴포넌트 등만 넘겨주는 코드를 짜는 것이 좋다.
서로 다른 함수임에도 불구하고 자신이 아닌 다른 함수의 값을 건드리고 참조하는 것은 단일 책임 원칙을 벗어난 코드이다.
따라서 각 내부 함수를 따로 구현하여 다른 곳에서 가져온 값이 아닌 내부에서 값을 변경할 수 있게 구현해야한다.
클래스 내부에 너무 많은 함수나 변수가 선언되어 있으면 코드의 유지보수가 어렵다.
핵심 동작만 유지하고, 나머지는 컴포넌트에 맡기는 함수를 짜는 것이 좋다.
인터페이스에 필요없는 함수가 있으면 오버라이드를 안 해도 되기 때문에 부모 클래서 가상 함수를 구현하고 자식 클래스는 필요한 가상 함수만 상속 받아 구현하면 된다.
또한 기본값을 구현해두어 상속을 받을때 필요에 의한게 아니라면 따로 구현하지 않아도 되도록 한다.
클래스 내부의 데이터는 수동으로 조작되는 것이 아니라, 총괄적으로 관리하는 부모 클래스에서 함수를 선언해 관리해야한다.
모든 클래스에서 필요하지 않은 기능까지 가상 함수로 선언하면 사용하지 않는 클래스에서의 불필요한 코드 작성을 해야하기 때문에 일부는 상속을 포기해야한다.
명시적으로 표기하기 위해 하면 좋기는 하지만, 코드가 변경되었을 때 깜빡하고 주석을 그대로 두거나 너무 많은 주석으로 인해 코드를 제대로 확인하지 못하는 경우를 대비해 많이 달지 않는 것이 좋다.
사용하면 당장이든 언젠가든 해가 될만한 코드들을 배웠다. 직접 코드를 짜고 기능들을 구현할 때 이렇게 완벽하게 짤 수 있도록 계속해서 복습하고 여러번 코드를 작성해보면서 더 효율적이게 짤 수 있도록 연습해야겠다.