작성
·
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
키워드 사용 여부에 대한 질문으로 이해했습니다.
switch case
이중 작성sealed class
사용 시, 특정 타입의 인스턴스가 여러 가지 하위 타입 중 어느 것인지 알기 위해 switch case
문을 사용할 수 있습니다.
- 예를 들면, NoteOrder
에서 OrderType
을 통해 추가적인 분기를 두어 정렬 방식을 선택하고 계시며, 이는 올바른 방식입니다.
- 다만, 코드의 가독성을 조금 더 높이기 위해 final
키워드를 생략하고 단순히 orderType
으로 접근하는 것도 가능합니다.
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
패키지로 인해 발생하는 문제와 해결 방법을 안내합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.