2023-11-28
1. 패턴
Getter
아래는 getter를 사용한 패턴이다. get 키워드를 이용해 직사각형의 넓이를 추출하는 간단한 예제이다.
class Rectangle {
final int width, height;
Rectangle(this.width, this.height);
// This computed property is treated like a function
// that returns a value.
int get area => width * height;
}
Setter
아래는 Setter 를 활용한 패턴으로 Point 클래스로 x와 y와 받아 중앙값을 구한다.
class Rectangle {
final int width, height;
Rectangle(this.width, this.height);
int get area => width * height;
// Use a private variable to
// expose the value with a getter;
Point _center;
Point get center => _center;
set center(Point origin) {
_center = Point(
origin.x + width / 2,
origin.y + height / 2,
);
}
}
void main() {
var rectangle = Rectangle(12,6);
print(rectangle.area);
// The setter will calculate the center based on what we tell it is the
// _origin_ (top left corner) of the rectangle on a plot.
// in this case, we're setting the origin at (4,4).
rectangle.center = Point(4,4);
print(rectangle.cernter);
}
2. 주의점
다만 Effective Dart에서는 지양하는 getter setter 패턴이 있다.
Bad
아래 코드는 안좋은 패턴이다.
class Box {
var _contents;
get contents => _contents;
set contents(value) {
_contents = value;
}
}
Good
아래 코드는 좋은 패턴이다.
class Box {
var contents;
}
AVOID wrapping fields in getters and setters just to be “safe”.
Dart에서는 단순한 필드의 안전한 사용을 위해 getter와 setter를 사용하지 말라고 하고 있다. 그 이유는 Fields and getters/setters are completely indistinguishable(필드와 getter/setter 들은 완전히 구별할 수 없기 때문이다.) 또한 Dart에서는 public 데이터 멤버가 있으면 해당 getter 및 setter가 클래스 인터페이스의 일부로 암시적으로 선언되기 때문에 굳이 해당 부분을 선언할 필요가 없어진다.
클린 코드를 위해서 linter > rules in your analysis_options.yaml file 에 해당 부분을 추가하는 것을 고려해 볼 수 있다.
linter:
rules:
- unnecessary_getters_setters
3. 참고링크
https://flutterbyexample.com/lesson/getters-and-setters
https://dart.dev/tools/linter-rules/unnecessary_getters_setters