[Dart] 다트 Cascade notation 문법 알아보기

2023-12-04


 

사진: Unsplash 의 Masood Aslami


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

 

Operators

Learn about the operators Dart supports.

dart.dev


메인 이미지 출처 : 사진: UnsplashMasood Aslami