그것은의 실제 의미를 따라 a
, b
그리고 getProduct
.
게터의 목적은 객체의 인터페이스를 동일하게 유지하면서 실제 구현을 변경할 수 있도록하는 것입니다. 예를 들어, 하루 getA
가 return a + 1;
되면 변경 사항이 getter로 현지화됩니다.
실제 시나리오 사례는 때때로 getter와 관련된 생성자를 통해 할당 된 상수 지원 필드보다 더 복잡합니다. 예를 들어, 필드의 값은 코드의 원래 버전의 데이터베이스에서 계산되거나로드 될 수 있습니다. 다음 버전에서는 성능을 최적화하기 위해 캐싱이 추가 될 수 있습니다. 경우 getProduct
계산 된 버전을 계속 사용, 그것은 캐싱의 혜택을하지 않습니다 (또는 메인테이너는 두 번 같은 변화를 할 것입니다).
가에 대한 완벽한 이해하게되면 getProduct
사용 a
과 b
직접 그들을 사용합니다. 그렇지 않으면 나중에 유지 관리 문제를 방지하기 위해 게터를 사용하십시오.
getter를 사용하는 예 :
class Product {
public:
Product(ProductId id) : {
price = Money.fromCents(
data.findProductById(id).price,
environment.currentCurrency
)
}
Money getPrice() {
return price;
}
Money getPriceWithRebate() {
return getPrice().applyRebate(rebate); // ← Using a getter instead of a field.
}
private:
Money price;
}
현재 getter에 비즈니스 로직이 포함되어 있지 않지만 오브젝트를 초기화 할 때 데이터베이스 작업을 수행하지 않기 위해 생성자의 로직이 getter로 마이그레이션되는 것을 제외하지 않습니다.
class Product {
public:
Product(ProductId id) : id(id) { }
Money getPrice() {
return Money.fromCents(
data.findProductById(id).price,
environment.currentCurrency
)
}
Money getPriceWithRebate() {
return getPrice().applyRebate(rebate);
}
private:
const ProductId id;
}
나중에 캐싱이 추가 될 수 있습니다 (C #에서는 Lazy<T>
코드를 짧고 쉽게 만들 수 있습니다 .C ++에 해당하는 것이 있는지 모르겠습니다).
class Product {
public:
Product(ProductId id) : id(id) { }
Money getPrice() {
if (priceCache == NULL) {
priceCache = Money.fromCents(
data.findProductById(id).price,
environment.currentCurrency
)
return priceCache;
}
Money getPriceWithRebate() {
return getPrice().applyRebate(rebate);
}
private:
const ProductId id;
Money priceCache;
}
두 변경 사항은 모두 getter와 backing 필드에 초점을 맞추 었으며 나머지 코드는 영향을받지 않습니다. 대신에 getter 대신 필드를 사용한 getPriceWithRebate
경우 변경 사항도 반영해야합니다.
개인 필드를 사용하는 예 :
class Product {
public:
Product(ProductId id) : id(id) { }
ProductId getId() const { return id; }
Money getPrice() {
return Money.fromCents(
data.findProductById(id).price, // ← Accessing `id` directly.
environment.currentCurrency
)
}
private:
const ProductId id;
}
게터는 간단합니다. readonly
미래에는 변하지 않을 것으로 예상되는 상수 (C #과 유사 ) 필드를 직접 표현한 것입니다. 따라서 간단하게 유지하고 현장에 직접 액세스하십시오.
또 다른 이점은 getId
이전 코드와 같이 외부에서 사용되지 않는 것으로 보이는 경우 향후에 제거 될 수 있다는 것입니다.
const
:를 나는 컴파일러가 인라인된다는 것을 의미합니다 가정getId
어쨌든 전화를하고 당신이 어느 한 방향으로 변경할 수 있습니다. (그렇지 않으면 나는 getter 를 사용해야하는 이유 에 전적으로 동의한다 .) 그리고 속성 구문을 제공하는 언어에서, 지원 필드보다는 속성을 직접 사용하지 않는 이유는 훨씬 적다.