반응형

전체 글 59

디자인 패턴. MVVM (Model-View-ViewModel)

MVVM(Model-View-ViewModel) 패턴은 기본적으로 UI와 밀접하게 연결된 ViewModel 레이어를 추가하여 개발자가 UI와 데이터를 더 쉽게 조작할 수 있도록합니다. MVVM 패턴은 뷰(View)와 모델(Model) 사이에서 중간 레이어로 ViewModel을 둬, 뷰(View)와 모델(Model)의 결합도를 낮추어 유지보수성을 향상시킵니다. Model: 데이터와 해당 데이터를 조작하는 비즈니스 로직을 담당합니다. 데이터를 변경하는 주체입니다. View: 유저 인터페이스를 담당합니다. 데이터를 표시하고, 유저 입력을 받아 ViewModel에 전달합니다. ViewModel: 뷰(View)에서 보여지는 데이터와 이를 조작하는 메서드, 상태를 포함합니다. Model과 View 간의 인터페이스 ..

디자인 패턴. MVP (Model-View-Presenter)

MVP (Model-View-Presenter) 패턴은 애플리케이션을 구성하는 구성 요소를 세 가지로 나누는 소프트웨어 아키텍처 패턴입니다. MVP 패턴의 구성요소는 다음과 같습니다. Model 데이터와 비즈니스 로직을 포함하고 있는 컴포넌트 데이터와 비즈니스 로직에 대한 수정은 Presenter에서 수행됩니다. View 사용자 인터페이스를 담당하는 컴포넌트 사용자 입력을 Presenter에 전달합니다. Presenter로부터 데이터를 전달 받아 표시합니다. Presenter View와 Model 사이에서 조정하는 컴포넌트 View로부터 입력을 수신하여 Model을 업데이트하고, Model의 변화를 View에 반영합니다. View와 Model 사이의 인터페이스를 정의합니다. MVP 패턴의 핵심 아이디어는..

디자인 패턴. MVC (Model-View-Controller)

MVC (Model-View-Controller) 패턴은 소프트웨어를 Model, View, Controller로 분리하는 패턴입니다. 각각의 요소는 다음과 같은 역할을 수행합니다. Model: 데이터를 처리하고 저장하는 역할을 합니다. 모델은 애플리케이션의 핵심 로직을 담고 있으며, 데이터의 형태와 구조를 정의합니다. 모델은 데이터를 가져오고, 추가하고, 수정하고, 삭제하는 기능을 제공합니다. View: 사용자 인터페이스를 담당합니다. 뷰는 모델의 데이터를 표시하고, 사용자의 입력을 받아서 컨트롤러로 전달합니다. 뷰는 화면에 보여지는 것을 제외하고는 아무런 로직을 처리하지 않습니다. Controller: 뷰와 모델 사이의 상호작용을 담당합니다. 컨트롤러는 사용자의 입력을 처리하고, 모델의 데이터를 변경..

디자인 패턴. MVC, MVP, MVVM

MVC (Model-View-Controller), MVP (Model-View-Presenter), MVVM (Model-View-ViewModel) 패턴은 소프트웨어 디자인 패턴 중에서 가장 일반적으로 사용되는 패턴 중에 하나입니다. 이 패턴들은 소프트웨어를 구성하는 다양한 요소를 분리하고, 각 요소의 역할을 명확하게 정의하여 소프트웨어를 보다 쉽게 개발, 유지, 보수할 수 있도록 도와줍니다. MVC (Model-View-Controller) MVC 패턴은 소프트웨어를 Model, View, Controller로 분리하는 패턴입니다. 각각의 요소는 다음과 같은 역할을 수행합니다. Model : 데이터를 처리하고 저장하는 역할을 합니다. View : 사용자 인터페이스를 담당합니다. Controller ..

냄새 6. 가변 데이터 (Mutable Data)

가변 데이터(Mutable data)는 값이 변경될 수 있는 데이터를 의미합니다. 이는 데이터가 동시에 여러 곳에서 변경될 가능성이 높아져 코드를 이해하고 유지보수하기 어렵게 만들며, 오류의 가능성도 높아집니다. 이러한 문제를 해결하기 위해서는 불변성(Immutability)을 지향해야 합니다. 즉, 값을 변경하는 대신 새로운 값을 반환하도록 구현하면 됩니다. 이를 통해 코드 유지 보수성이 향상되며, 동시성 이슈 등 다른 문제들을 예방할 수 있습니다. 가변 데이터를 캡슐화하여 객체로 만들고, 값을 사용할 때는 불변 객체를 반환하여 데이터 변경에 대한 책임을 객체 내부에 캡슐화하는 것입니다. 그리고 전역 변수의 사용을 최소화하고, const를 적극 활용하여 불변성을 보장하는 것이 좋습니다. 불변 데이터를 ..

리팩터링 기법. 변수 캡슐화하기 (Encapsulate Variable)

변수 캡슐화하기(Encapsulate Variable)는 이러한 전역 데이터 문제를 해결하기 위한 방법 중 하나입니다. 전역 데이터를 사용하지 않고 클래스 내부 변수로 변경함으로써 클래스 내에서 데이터를 캡슐화하고 관리할 수 있습니다. 변수 캡슐화하기의 장점은 다음과 같습니다. 데이터 보호: 변수에 직접 접근하는 것을 막아, 데이터를 보호할 수 있습니다. 일관성 유지: 변수에 접근하는 메소드를 통일하여 일관성을 유지할 수 있습니다. 유지보수성 개선: 객체 내부 구현을 변경해도 클라이언트 코드가 영향을 받지 않습니다. 예를 들어, 다음은 전역 변수를 사용하여 이름과 나이를 저장하는 간단한 프로그램입니다. #include #include std::string name; int age; int main() {..

냄새 5. 전역 데이터 (Global Data)

전역 데이터는 프로그램 전체에서 공유되는 데이터를 의미합니다. 전역 변수, 전역 상수, 싱글턴 인스턴스, 레지스트리 항목 등이 포함될 수 있습니다. 전역 데이터는 여러 모듈에서 자유롭게 접근할 수 있기 때문에 모듈 간 결합도가 높아지고, 코드의 복잡도가 증가하며, 디버깅이 어려워질 수 있습니다. - 전역 데이터는 아무곳에서나 변경될 수 있다. - 전역 데이터로 문제가 발생 시 어떤 코드로 인해 값이 바뀐 것인지 알기 어렵다. - 클래스 맴버 변수도 비슷한 문제가 발생 할 수 있다. 또한 전역 데이터가 변경될 경우 해당 데이터를 사용하는 모든 코드를 수정해야 하므로 유지보수성도 저하될 수 있습니다. 전역 데이터를 사용하지 않고 지역 변수나 매개변수로 데이터를 전달하거나 객체지향 설계 원칙 중 하나인 의존성..

리팩터링 기법. 여러 함수를 클래스로 묶기 (Combine Functions into Class)

"Combine Functions into Class" 리팩터링 기법은 "긴 매개 변수 목록" 문제를 해결하는 데 도움이 되는 기법 중 하나입니다. 이 기법은 여러 개의 함수를 하나의 클래스로 묶는 것입니다. 이를 통해 관련된 기능을 하나의 단위로 묶어서 더 간결하고 유지보수가 용이한 코드를 작성할 수 있습니다. 예를 들어, 다음과 같은 두 개의 함수가 있다고 가정해 봅시다. void process_order(std::string customer_name, std::string product_name, int quantity, double price); void cancel_order(std::string customer_name, std::string product_name); 위 함수들은 주문을 처리..

리팩터링. 플래그 인수 제거하기 (Remove Flag Argument)

"플래그 인수 제거하기 (Remove Flag Argument)" 리팩토링 기법은 함수의 매개변수로 전달되는 플래그(flag) 인자를 제거하는 기법입니다. 보통 함수에 여러 가지 동작을 수행하는 데 필요한 여러 개의 플래그 인자를 전달하게 되면, 함수를 호출할 때 플래그 값만 보고 어떤 동작을 수행하는지 이해하기 어려울 수 있습니다. 또한 플래그 인자가 많아질수록 함수의 시그니처(signature)가 복잡해지고, 함수를 호출할 때 인자를 전달하기 어렵게 됩니다. 이를 해결하기 위해 "Remove Flag Argument" 리팩토링 기법을 사용하면 함수 내부에서 플래그 값에 따라 분기하는 대신, 각각의 플래그 값에 대응하는 별도의 함수를 만들어서 호출합니다. 이를 통해 함수의 시그니처가 단순해지고, 함수 ..

반응형