본문 바로가기
Flutter

플러터에서의 팩토링: 기준, 방법, 그리고 초보자가 알아야 할 필수 사항

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

 

1. 팩토링의 중요성

팩토링은 기존 코드의 기능을 변경하지 않으면서 코드의 구조를 개선하는 과정입니다.

이는 코드의 가독성을 높이고, 유지 보수를 용이하게 하며, 버그를 줄이고, 성능을 개선할 수 있습니다.

플러터 앱 개발에서도 팩토링은 필수적인 과정으로, 효율적이고 안정적인 앱을 만들기 위해 꼭 필요합니다.

2. 팩토링 기준

팩토링을 진행할 때는 다음과 같은 기준을 고려해야 합니다:

2.1. 코드 중복 제거

  • 기준: 코드가 여러 곳에서 반복되고 있을 때.
  • 설명: 동일한 코드 블록이 여러 곳에 반복되면, 코드 유지 관리가 어려워지고 버그가 발생할 가능성이 높습니다. 중복 코드를 함수나 위젯으로 추출하여 재사용성을 높입니다.

2.2. 복잡도 감소

  • 기준: 함수나 클래스가 너무 복잡하거나 길어질 때.
  • 설명: 함수나 클래스가 지나치게 복잡하면 이해하기 어렵고, 수정 시 실수가 발생할 가능성이 높습니다. 단일 책임 원칙(SRP)을 따르도록 코드를 분리합니다.

2.3. 네이밍 컨벤션 준수

  • 기준: 변수, 함수, 클래스 이름이 명확하지 않거나 일관성이 없을 때.
  • 설명: 일관된 네이밍 컨벤션을 사용하면 코드의 가독성을 높이고 이해하기 쉬워집니다. 이름이 직관적이고 목적이 분명해야 합니다.

2.4. 코드 가독성 향상

  • 기준: 코드가 읽기 어렵거나 이해하기 힘들 때.
  • 설명: 코드가 복잡하거나 논리적으로 혼란스러울 때는 가독성을 높이기 위한 리팩토링이 필요합니다. 주석 추가, 적절한 들여쓰기, 적절한 함수 분리 등을 고려합니다.

2.5. 성능 개선

  • 기준: 코드가 비효율적이거나 성능에 문제가 있을 때.
  • 설명: 성능이 중요한 경우, 비효율적인 코드 구조를 개선하여 앱의 반응 속도를 향상시킬 수 있습니다.

3. 팩토링 방법

팩토링을 효과적으로 진행하기 위해 다음 방법들을 사용할 수 있습니다:

3.1. 함수 추출

  • 설명: 코드 블록을 별도의 함수로 추출하여 재사용성을 높이고, 코드의 가독성을 향상시킵니다.
  • 예제
// Before Refactoring
void calculate() {
  // 복잡한 로직
  int result = 0;
  for (int i = 0; i < 10; i++) {
    result += i * i;
  }
  print(result);
}

// After Refactoring
void calculate() {
  int result = _computeSum();
  print(result);
}

int _computeSum() {
  int result = 0;
  for (int i = 0; i < 10; i++) {
    result += i * i;
  }
  return result;
}

3.2. 위젯 분리

  • 설명: 복잡한 위젯을 더 작은 단위의 위젯으로 분리하여 재사용성과 가독성을 높입니다.
  • 예제
// Before Refactoring
class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Text('Title'),
        // 긴 위젯 트리
        Container(
          padding: EdgeInsets.all(10),
          child: Row(
            children: <Widget>[
              Icon(Icons.star),
              Text('Subtitle'),
            ],
          ),
        ),
        // ... 더 많은 위젯
      ],
    );
  }
}

// After Refactoring
class MyWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Text('Title'),
        _buildContent(),
      ],
    );
  }

  Widget _buildContent() {
    return Container(
      padding: EdgeInsets.all(10),
      child: Row(
        children: <Widget>[
          Icon(Icons.star),
          Text('Subtitle'),
        ],
      ),
    );
  }
}

3.3. 모델 클래스 사용

  • 설명: 복잡한 데이터를 처리할 때 모델 클래스를 사용하여 데이터의 구조를 명확하게 합니다.
  • 예제
// Before Refactoring
class UserProfile {
  String name;
  int age;
  String email;

  UserProfile(this.name, this.age, this.email);
}

// After Refactoring
class UserProfile {
  final String name;
  final int age;
  final String email;

  UserProfile({required this.name, required this.age, required this.email});
}

3.4. 상태 관리 개선

  • 설명: 상태 관리 라이브러리(예: Provider, Riverpod 등)를 활용하여 상태 관리를 더 효율적으로 합니다.
  • 예제
// Before Refactoring
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Consumer<MyModel>(
          builder: (context, model, child) {
            return Text(model.someData);
          },
        ),
      ),
    );
  }
}

// After Refactoring with Provider
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider(
      create: (context) => MyModel(),
      child: MaterialApp(
        home: Scaffold(
          body: Consumer<MyModel>(
            builder: (context, model, child) {
              return Text(model.someData);
            },
          ),
        ),
      ),
    );
  }
}

4. 초보자가 꼭 알아야 할 사항

4.1. 소규모 팩토링부터 시작하기

초보자는 큰 규모의 팩토링을 시도하기보다는 작은 단위로 진행하는 것이 좋습니다. 소규모 팩토링을 통해 점진적으로 코드를 개선하면서 익숙해질 수 있습니다.

4.2. 테스트 작성

팩토링 전과 후에 테스트를 작성하여 코드의 기능이 변경되지 않았음을 확인하는 것이 중요합니다. 테스트가 없으면 리팩토링 과정에서 버그가 발생할 수 있습니다.

4.3. 버전 관리 활용

버전 관리 시스템(예: Git)을 활용하여 팩토링 과정에서의 변경 이력을 관리합니다. 문제가 발생했을 때 이전 버전으로 되돌리는 것이 쉽습니다.

4.4. 팀과의 협업

팀 프로젝트에서는 팩토링 작업을 팀원들과 협의하여 진행하는 것이 좋습니다. 팀원들과의 코드 리뷰를 통해 더 나은 코드를 작성할 수 있습니다.

 

플러터에서의 팩토링은 코드의 품질을 높이고 유지 보수를 용이하게 만드는 중요한 과정입니다.

코드를 리팩토링할 때는 중복 제거, 복잡도 감소, 네이밍 컨벤션 준수, 코드 가독성 향상, 성능 개선 등의 기준을 고려하며, 함수 추출, 위젯 분리, 모델 클래스 사용, 상태 관리 개선 등의 방법을 활용할 수 있습니다.

초보자는 소규모 팩토링부터 시작하고, 테스트와 버전 관리, 팀 협업을 통해 안정적인 리팩토링 작업을 진행하는 것이 좋습니다.

공감과 댓글은 저에게 큰 힘이 됩니다.

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

 

 

반응형