본문 바로가기
Flutter

플러터에서 팩토링: Function vs. Class, 어떤 것을 선택해야 할까?

by Maccrey Coding 2024. 8. 26.
반응형

 

팩토링 과정에서 코드의 구조를 개선하는 방법에는 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.

 

Tester Share [테스터쉐어] - Google Play 앱

Tester Share로 Google Play 앱 등록을 단순화하세요.

play.google.com

반응형