Inflearn brand logo image

인프런 커뮤니티 질문&답변

mhlee님의 프로필 이미지
mhlee

작성한 질문수

Flutter 중급 1편 - 클린 아키텍처

36 정렬 기능 구현

sealed class 사용 문의2

작성

·

41

0

알려주신 sealed class으로 내용 작성 중에 선생님이 의도하신 부분으로 작성을 했는지 문의드립니다.

 

1.get_notes_use_case.dart 부분 switch case 이중 작성 부분

2.switch case 이중 작성 부분 *참고코드4 처럼 final을 안쓰고 사용가능 여부

 

note_order.dart

*NoteOrder sealed class 구현부

*참고 코드1

import 'package:flutter_note_app/domain/model/util/order_type.dart';

sealed class NoteOrder<T> {
  factory NoteOrder.title(OrderType orderType) = NoteOrderTitle;
  factory NoteOrder.date(OrderType orderType) = NoteOrderDate;
  factory NoteOrder.color(OrderType orderType) = NoteOrderColor;
}

class NoteOrderTitle<T> implements NoteOrder<T> {
  OrderType orderType;
  NoteOrderTitle(this.orderType);
}

class NoteOrderDate<T> implements NoteOrder<T> {
  OrderType orderType;
  NoteOrderDate(this.orderType);
}

class NoteOrderColor<T> implements NoteOrder<T> {
  OrderType orderType;
  NoteOrderColor(this.orderType);
}

 

order_type.dart

*OrderType 구현부 sealed class 구현부

*참고 코드2

sealed class OrderType<T> {
  factory OrderType.ascending() = Ascending;
  factory OrderType.descending() = Descending;
}

class Ascending<T> implements OrderType<T> {
  Ascending();
}

class Descending<T> implements OrderType<T> {
  Descending();
}

 

get_notes_use_case.dart

*notes use case 구현부

*참고 코드3

import 'package:flutter_note_app/domain/model/note.dart';
import 'package:flutter_note_app/domain/model/util/note_order.dart';
import 'package:flutter_note_app/domain/model/util/order_type.dart';
import 'package:flutter_note_app/domain/repository/note_repository.dart';

class GetNotesUseCase {
  final NoteRepository repository;

  GetNotesUseCase(this.repository);

  Future<List<Note>> call(NoteOrder noteOrder) async {
    List<Note> notes = await repository.getNotes();

    switch (noteOrder) {
      case NoteOrderTitle(orderType: final orderType):
        switch (orderType) {
          case Ascending():
            notes.sort((a, b) => a.title.compareTo(b.title));
            break;
          case Descending():
            notes.sort((a, b) => -a.title.compareTo(b.title));
            break;
        }
        break;
      case NoteOrderDate(orderType: final orderType):
        switch (orderType) {
          case Ascending():
            notes.sort((a, b) => a.timestamp.compareTo(b.timestamp));
            break;
          case Descending():
            notes.sort((a, b) => -a.timestamp.compareTo(b.timestamp));
            break;
        }
        break;
      case NoteOrderColor(orderType: final orderType):
        switch (orderType) {
          case Ascending():
            notes.sort((a, b) => a.color.compareTo(b.color));
            break;
          case Descending():
            notes.sort((a, b) => -a.color.compareTo(b.color));
            break;
        }
        break;
    }

    return notes;
  }
}

 

*저번 질문에서 선생님이 알려준 final 안쓰고 사용할수 있는 팁

*참고 코드4

switch (event) {
  case ChangeColor():
    _changeColor(event.color);
    break;
  case SaveNote():
    _saveNote(event.id, event.title, event.content);
    break;
}

 

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

답변 2

0

오준석님의 프로필 이미지
오준석
지식공유자

참고 1, 2 모두 제네릭이 사용되지 않고 있어서 제네릭은 제거해도 될 것 같습니다.

참고 2는 클래스내부에 상태가 없기 때문에 enum으로 사용해도 될 것 같습니다.

참고 3 코드에서는 dart 의 switch 를 활용한 패턴 코드에서는 break 를 쓰지 않아도 됩니다.

0

안녕하세요, 인프런 AI 인턴입니다. mhlee님께서 질문하신 내용을 확인했습니다. sealed class 사용 시 switch case 이중 작성과 final 키워드 사용 여부에 대한 질문으로 이해했습니다.

1. switch case 이중 작성

sealed class 사용 시, 특정 타입의 인스턴스가 여러 가지 하위 타입 중 어느 것인지 알기 위해 switch case 문을 사용할 수 있습니다.
- 예를 들면, NoteOrder 에서 OrderType 을 통해 추가적인 분기를 두어 정렬 방식을 선택하고 계시며, 이는 올바른 방식입니다.
- 다만, 코드의 가독성을 조금 더 높이기 위해 final 키워드를 생략하고 단순히 orderType 으로 접근하는 것도 가능합니다.

2. final 키워드 사용 여부

  • final 키워드: Dart의 switch 문에서는 객체의 특정 필드를 패턴 매칭을 통해 추출할 수 있습니다. final 키워드 없이도 컴파일러는 이를 안정적으로 해석할 수 있도록 개선되었습니다.
  • 따라서, final 키워드를 사용하지 않고도 접근할 수 있으니 참고해주세요. 아래와 같이 작성할 수 있습니다:
    
    switch (orderType) {
    case Ascending():
      notes.sort((a, b) => a.title.compareTo(b.title));
      break;
    case Descending():
      notes.sort((a, b) => -a.title.compareTo(b.title));
      break;
    }
    

위와 같은 방식으로 작성하는 것은 전혀 문제가 없으며, 이 코드 스타일을 유지하는 것이 좋습니다.

질문하신 부분에 대해 자세히 설명을 드렸습니다. 아래는 관련된 유사 사례와 추가적인 참고 링크입니다:
- sealed class 데이터 접근: sealed class 내 데이터 접근 방법을 다룬 게시물입니다.
- freezed3.0에서 build시 when생성되지 않습니다.: freezed 패키지로 인해 발생하는 문제와 해결 방법을 안내합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

mhlee님의 프로필 이미지
mhlee

작성한 질문수

질문하기