팩토링 과정에서 코드의 구조를 개선하는 방법에는 Function과 Class를 사용하는 두 가지 주요 접근 방식이 있습니다. 각 접근 방식은 특정 상황에 따라 더 적합할 수 있으며, 올바른 선택을 통해 코드의 가독성, 유지 보수성, 재사용성을 높일 수 있습니다.
1. Function
Function(함수)은 특정 작업을 수행하는 코드 블록입니다. 함수는 재사용성을 높이고, 코드의 중복을 줄이며, 코드의 가독성을 향상시킵니다. 함수는 일반적으로 단순한 작업을 수행하거나 데이터를 처리하는 데 사용됩니다.
사용 시기
- 작업이 단순할 때: 함수는 간단한 계산이나 데이터를 처리할 때 유용합니다. 예를 들어, 특정 값을 포맷팅하거나 필터링하는 경우입니다.
- 재사용성이 필요할 때: 동일한 로직을 여러 곳에서 사용해야 할 때, 함수를 통해 코드 중복을 줄일 수 있습니다.
- 모듈화가 필요할 때: 코드를 작은 단위로 나누어 이해하기 쉽게 만들고 싶을 때, 함수로 분리합니다.
예제 코드
// Before Refactoring
void processOrder(int orderId) {
// Fetch order details
// Calculate total price
// Apply discount
// Send confirmation email
}
// After Refactoring
void processOrder(int orderId) {
var order = fetchOrderDetails(orderId);
var totalPrice = calculateTotalPrice(order);
var discountedPrice = applyDiscount(totalPrice);
sendConfirmationEmail(order, discountedPrice);
}
Order fetchOrderDetails(int orderId) {
// Fetch order details
}
double calculateTotalPrice(Order order) {
// Calculate total price
}
double applyDiscount(double totalPrice) {
// Apply discount
}
void sendConfirmationEmail(Order order, double discountedPrice) {
// Send confirmation email
}
2. Class
Class(클래스)는 관련된 데이터와 메서드를 묶어서 객체를 생성하는 데 사용됩니다. 클래스는 상태와 동작을 함께 캡슐화하여 객체 지향 프로그래밍을 지원합니다. 클래스는 복잡한 데이터 구조나 상태를 관리할 때 유용합니다.
사용 시기
- 상태를 관리해야 할 때: 클래스는 상태와 동작을 함께 캡슐화하므로, 객체의 상태를 유지하고 관리할 때 유용합니다.
- 복잡한 데이터 구조를 다룰 때: 여러 관련된 데이터를 한 객체로 묶어 관리할 수 있습니다.
- 행동이 다양한 경우: 특정 객체가 수행해야 하는 여러 행동이나 메서드를 정의할 때, 클래스를 사용하여 이러한 행동을 그룹화할 수 있습니다.
예제 코드
// Before Refactoring
class OrderProcessor {
void processOrder(int orderId) {
// Fetch order details
// Calculate total price
// Apply discount
// Send confirmation email
}
}
// After Refactoring
class OrderProcessor {
final OrderRepository _repository;
final DiscountService _discountService;
final EmailService _emailService;
OrderProcessor(this._repository, this._discountService, this._emailService);
void processOrder(int orderId) {
var order = _repository.fetchOrderDetails(orderId);
var totalPrice = _calculateTotalPrice(order);
var discountedPrice = _discountService.applyDiscount(totalPrice);
_emailService.sendConfirmationEmail(order, discountedPrice);
}
double _calculateTotalPrice(Order order) {
// Calculate total price
}
}
class OrderRepository {
Order fetchOrderDetails(int orderId) {
// Fetch order details
}
}
class DiscountService {
double applyDiscount(double totalPrice) {
// Apply discount
}
}
class EmailService {
void sendConfirmationEmail(Order order, double discountedPrice) {
// Send confirmation email
}
}
3. Function vs. Class: 선택 가이드
기준 Function Class
사용 목적 | 단순한 작업 처리 및 재사용성 | 복잡한 데이터와 상태 관리 |
복잡도 | 낮은 복잡도, 단일 책임 원칙(SRP) | 높은 복잡도, 다중 책임 원칙 |
상태 관리 | 상태를 직접적으로 관리하지 않음 | 상태를 캡슐화하여 관리 |
재사용성 | 함수 호출로 재사용 가능 | 객체를 통한 메서드와 속성의 재사용 가능 |
코드 모듈화 | 코드 블록을 작은 함수로 나누어 모듈화 | 클래스를 통한 데이터와 행동의 모듈화 |
테스트 용이성 | 단순 함수의 테스트가 쉬움 | 클래스의 인스턴스와 관련된 복잡한 테스트가 필요 |
팩토링 시 Function과 Class는 각각 다른 용도로 사용됩니다. Function은 단순한 작업을 처리하고 재사용성을 높이며, Class는 상태를 관리하고 복잡한 데이터 구조를 캡슐화하여 객체 지향 프로그래밍을 지원합니다. 코드의 복잡도와 관리해야 할 상태에 따라 적절한 방법을 선택하는 것이 중요합니다. 일반적으로, 간단한 로직이나 재사용성이 필요한 경우에는 함수를, 복잡한 데이터 구조나 상태 관리가 필요한 경우에는 클래스를 사용하는 것이 최적입니다.
공감과 댓글은 저에게 큰 힘이 됩니다.
Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test.
'Flutter' 카테고리의 다른 글
Shorebird Code Push: Flutter 앱 업데이트의 새로운 대안이 될까? (3) | 2024.09.09 |
---|---|
플러터에서 @override 어노테이션 완벽 가이드: 사용법과 옵션으로 코딩 실력 업그레이드하기 (0) | 2024.09.06 |
플러터에서의 팩토링: 기준, 방법, 그리고 초보자가 알아야 할 필수 사항 (0) | 2024.08.26 |
플러터에서 ShoreBird로 코드 푸시 구현하기: 초보자를 위한 쉬운 가이드 (0) | 2024.08.25 |
플러터에서 Firebase Remote Config를 사용하는 방법: 초보자 가이드(CodePush) (0) | 2024.08.25 |