반응형

전체 글 59

냄새 11. 기본형 집착(Primitive Obsession)

기본형 집착(Primitive Obsession)은 객체 지향 언어에서 자주 나타나는 코드 냄새 중 하나입니다. 기본형 집착은 프로그래머가 객체를 사용하기보다 기본형 데이터 타입(정수, 문자열, 부동 소수점 등)을 사용하여 비즈니스 로직을 구현하도록 유도하는 코드 구조를 의미합니다. 기본형 집착은 코드의 가독성과 유지보수성을 저해하며, 프로그램의 일관성과 안정성을 감소시킬 수 있습니다. 예를 들어, 각 사용자의 나이를 저장하는 경우, 기본적으로 나이를 int 형으로 저장할 수 있습니다. 그러나 이는 유효한 나이 값만이 저장된다는 보장이 없으므로 나이 값이 음수일 수 있거나 매우 큰 값이 될 수 있습니다. 이러한 문제를 해결하기 위해 객체를 사용할 수 있습니다. 나이를 나타내는 Age 클래스를 정의하면 유..

냄새 10. 데이터 뭉치(Data Clumps)

데이터 뭉치(Data Clumps)는 코드에서 같은 데이터 집합이 여러 곳에서 사용되는 경우를 가리키는 냄새입니다. 이러한 데이터 뭉치는 흔히 다음과 같은 형태로 나타납니다. Class Employee { public: Employee(string inName, string inEmployeeAreaCode, string inEmployeeNumber) :_name(inName), _employeeAreaCode(inEmployeeAreaCode), _employeeNumber(inEmployeeNumber) {} string GetEmployeePhoneNumber() { return _employeeAreaCode + "-" + _employeeNumber; } private: string _empl..

냄새 9. 기능 편애(Feature Envy)

기능 편애(Feature Envy)는 어떤 메소드가 자신이 속한 클래스가 아닌 다른 클래스의 메소드나 데이터를 자주 호출할 때 발생하는 코드 냄새(code smell)입니다. 즉, 메소드가 다른 클래스의 기능에 너무 의존적이어서, 해당 메소드가 다른 클래스에 더 적합하게 위치할 수 있는지를 고민해봐야 하는 경우입니다. 기능 편애는 두 개의 클래스 간에 너무 많은 상호작용이 일어나는 것으로 보통 인식됩니다. 이러한 경우 해당 클래스들은 결합도(coupling)가 높아져서 코드의 재사용성, 유지보수성, 확장성이 떨어지게 됩니다. 또한, 한 클래스가 다른 클래스의 많은 기능을 사용하게 되면, 코드 일관성이 떨어지고, 클래스의 책임을 명확하게 분리하지 못하게 됩니다. 기능 편애는 보통 다음과 같은 문제를 유발할..

리팩터링 기법. 클래스 인라인(Inline Class)

클래스 인라인하기(Inline Class)는 작은 클래스를 효율적으로 사용하기 위한 리팩터링 기법 중 하나입니다. 클래스 인라인하기는 클래스의 모든 기능을 클래스의 사용처에 삽입하여 호출하는 비용을 줄이는 방법입니다. 해당 리팩터링은 클래스 추출하기(Extract Class) 와 반대되는 리팩터링입니다. 클래스 인라인하기를 적용하면, 작은 클래스를 사용할 때 클래스를 생성하는 비용이 줄어들기 때문에, 성능 개선에 효과적입니다. 하지만 클래스의 크기가 너무 크거나 복잡한 경우에는 오히려 가독성이 떨어질 수 있으므로 주의해야 합니다. 클래스 인라인하기를 적용하는 방법은 다음과 같습니다. 클래스의 기능을 호출하는 모든 코드를 찾습니다. 클래스의 기능이 호출되는 곳으로 이동하여, 클래스의 기능을 호출하는 코드를..

디자인 패턴. 팩토리 메서드(Factory Method) 패턴

팩토리 메서드(Factory Method) 패턴은 객체를 생성하기 위한 인터페이스를 정의하고, 객체의 생성을 서브클래스에서 처리하도록 하는 패턴입니다. 이를 통해 객체 생성의 유연성을 확보하고, 객체 생성 로직을 캡슐화하여 유지보수성을 향상시킬 수 있습니다. 팩토리 메서드 패턴은 크게 두 가지 요소로 구성됩니다. Creator(생성자) : 객체를 생성하는 인터페이스를 정의합니다. 실제 객체 생성은 서브클래스에서 처리합니다. Concrete Creator(구체적 생성자) : Creator 인터페이스를 구현하여 객체를 생성합니다. 팩토리 메서드 패턴의 예시로, 공장에서 제품을 생산하는 과정을 생각해볼 수 있습니다. 공장은 제품을 생성하기 위한 템플릿을 제공하고, 제품의 종류에 따라 실제 제품을 생성하는 일은..

디자인 패턴. 싱글톤(Singleton) 패턴

싱글톤(Singleton) 패턴은 객체 생성 패턴 중 하나로, 어떤 클래스에 대해 단 하나의 객체만을 생성하고, 이후에는 생성된 객체를 계속해서 재사용하는 방법을 말합니다. 싱글톤 패턴은 다음과 같은 특징을 가집니다. 단일 인스턴스 해당 클래스의 인스턴스는 단 하나만 생성됩니다. 생성자가 private으로 선언되어 있어서 외부에서 객체를 생성할 수 없습니다. 전역 접근 생성된 인스턴스는 어디서든지 전역적으로 접근 가능합니다. 해당 클래스의 유일한 인스턴스에 접근하기 위한 전역적인 접근점이 제공됩니다. 싱글톤 패턴은 다음과 같은 상황에서 유용합니다. 시스템에서 단 하나의 객체만을 유지해야 하는 경우 유일한 객체를 사용하여 일관성을 유지할 수 있습니다. 자원이 제한적인 경우나 객체를 여러 개 생성하면 자원을..

디자인 패턴. 생성 패턴(Creational Patterns)

생성 패턴(Creational Patterns)은 객체 생성과 관련된 디자인 패턴으로, 객체를 생성하는 방법이나 객체의 생성과정에서의 문제를 해결하는 데에 중점을 둡니다. 객체를 생성하는 방법은 다양한 방법이 있습니다. 일반적으로 객체를 생성하기 위해서는 생성자를 호출하면 됩니다. 하지만 생성자만으로 객체를 생성하는 것으로는 여러 가지 문제점이 있을 수 있습니다. 예를 들어, 다음과 같은 문제점이 있습니다. 객체를 생성하는 방법이 복잡한 경우 객체를 생성하는 방법이 유연하지 않은 경우 객체를 생성하는 방법이 변경되었을 때 시스템 전체에 영향을 미치는 경우 이러한 문제점들을 해결하기 위해서 생성 패턴이 사용됩니다. 생성 패턴은 이러한 객체 생성 방법에 대한 문제를 해결하기 위해 일반적인 객체 생성 방법을 ..

GoF의 디자인 패턴

GoF(Gang of Four)의 디자인 패턴에서는 총 23가지의 디자인 패턴을 다룹니다. 이 중 23가지 패턴은 크게 생성 패턴, 구조 패턴, 행위 패턴으로 구분됩니다. 생성 패턴 (Creational Patterns) 추상 팩토리 (Abstract Factory) 팩토리 메서드 (Factory Method) 싱글톤 (Singleton) 빌더 (Builder) 프로토타입 (Prototype) 구조 패턴 (Structural Patterns) 어댑터 (Adapter) 브리지 (Bridge) 컴포지트 (Composite) 데코레이터 (Decorator) 퍼사드 (Facade) 플라이웨이트 (Flyweight) 프록시 (Proxy) 행위 패턴 (Behavioral Patterns) 책임 연쇄 (Chain o..

리팩터링 기법. 함수 인라인(Inline Function)

함수 인라인(Inline Function)은 함수 호출 대신 함수 코드 자체를 호출하는 코드로 대체하는 리팩터링 기법 중 하나입니다. 즉, 함수 호출이 발생하는 부분을 함수의 코드로 직접 대체함으로써 함수 호출의 오버헤드를 제거하고 성능을 향상시킬 수 있습니다. 인라인 함수는 함수의 크기가 작을 때 효과적입니다. 함수 호출이 많이 일어나는 루프와 같은 코드에서 인라인 함수를 사용하면 성능을 향상시킬 수 있습니다. 또한, 인라인 함수는 일반적으로 함수 호출을 대체하기 때문에 코드의 가독성이 향상될 수도 있습니다. 함수를 인라인으로 변환하는 것은 일반적으로 함수 코드를 함수 호출로 대체하는 것보다 코드 양이 늘어나기 때문에 코드의 크기가 커지는 단점이 있습니다. 또한, 함수 코드를 직접 호출하는 것이기 때문..

리팩터링 기법. 필드 옮기기(Move Field)

필드 옮기기(Move Field)는 클래스의 필드를 다른 클래스로 옮기는 리팩터링 기법 중 하나입니다. 클래스의 필드는 그 클래스가 속한 책임 영역에 해당하는 데이터여야 하지만, 때로는 다른 클래스와 관련된 데이터가 되기도 합니다. 이럴 때는 그 필드를 다른 클래스로 이동시켜야 합니다. 이 기법은 두 클래스 사이의 결합도를 줄여주고, 데이터와 책임이 더 잘 어울리도록 만들어줍니다. 필드를 옮길 때는 먼저 이 필드가 다른 클래스에서 사용될지, 아니면 새로운 클래스가 필요한지를 결정해야 합니다. 새로운 클래스가 필요하다면, 먼저 그 클래스를 작성하고, 이전 클래스의 필드를 새 클래스의 필드로 옮기고, 이전 클래스에서는 그 필드에 대한 getter, setter 메서드를 작성합니다. 그리고 이전 클래스의 메서..

반응형