2023-12-04
1. 정의
동일 object에 대하여 일련의 해당 object 의 메소드/필드 접근 시 좀 더 유연하게 코드를 작성할 수 있게 해주는 일종의 코드 표현법이다.
2. 사용법
아래는 공식 문서의 예제 코드이다.
var paint = Paint();
paint.color = Colors.black;
paint.strokeCap = StrokeCap.round;
paint.strokeWidth = 5.0;
위의 코드는 paint 인스턴스 변수의 설정값을 변경해주는 코드이다. 해당 코드에 Cascade notation 문법을 적용해 보자
var paint = Paint()
..color = Colors.black
..strokeCap = StrokeCap.round
..strokeWidth = 5.0;
Cascade notation를 적용하면 기존의 코드에서 중복된 항목은 제거되고 조금더 깔끔해진 것을 확인할 수 있다.
3. Null safety
만약에 Cascade notation 를 사용할 변수에 Null safety가 필요하다면 아래와 같이 적용할 수 있을것이다.
var button = querySelector('#confirm');
button?.text = 'Confirm';
button?.classes.add('important');
button?.onClick.listen((e) => window.alert('Confirmed!'));
button?.scrollIntoView();
// 아래와 같이 변경할 수 있다.
querySelector('#confirm') // Get an object.
?..text = 'Confirm' // Use its members.
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'))
..scrollIntoView();
마찬가지로 기존의 코드보다 변경된 코드가 중복된 코드도 사라지고 조금더 심플하게 표현된 것을 확인 할 수 있다.
4. Nest Cascade notation
또한 중첩되서 Cascade notation를 적용할 수 도 있다.
final addressBook = (AddressBookBuilder()
..name = 'jenny'
..email = 'jenny@example.com'
..phone = (PhoneNumberBuilder()
..number = '415-555-0100'
..label = 'home')
.build())
.build();
5. 주의점
아래의 코드는 이전 호출의 결과가 없어서 다음 호출이 올바르게 연결되지 않아 발생하는 오류이다. 즉 sb.write('foo') 의 리턴값이 void 이기 때문에 Cascade notation 가 적용되지 않고 에러를 반환하는 것이다.
var sb = StringBuffer();
sb.write('foo')
..write('bar'); // Error: method 'write' isn't defined for 'void'.
때문에 위의 코드는 아래와 같이 변경되어야 한다.
void main() {
var sb = StringBuffer()
..write('foo')
..write('bar');
print(sb.toString()); //foobar
}
6. 출처링크
https://dart.dev/language/operators
메인 이미지 출처 : 사진: Unsplash의Masood Aslami