더 적절한 것은 무엇입니까 : 게터와 세터 또는 기능은 무엇입니까?
-
05-07-2019 - |
문제
대체 함수 이름이 API를 더 명확하게 만드는 경우 "getmyValue ()"및 "setmyValue ()"패턴을 포기하는 것이 적절합니까?
예를 들어 C ++ 에이 수업이 있다고 상상해보십시오.
public class SomeClass {
private:
bool mIsVisible;
public:
void draw();
void erase();
}
다음과 같이 "오해"를 얻거나 설정하는 기능을 추가 할 수 있습니다.
bool getVisible() { return mIsVisible; };
void setvisible (bool visible) {if (! misvisible && visible) {draw (); } else if (misvisible &&! visible) {erase (); }
mIsVisible = visible;
}
그러나 다음 방법을 대신 사용하는 것도 마찬가지로 가능합니다.
bool isVisible() { return mIsVisible; };
void show() {
if (!mIsVisible) {
mIsVisible = true;
draw();
}
}
void hide() {
if (mIsVisible) {
mIsVisible = false;
erase();
}
}
간단히 말해서, 단일 "setvisible (bool)"메소드 또는 "show ()"및 "hide ()"메소드 쌍을 갖는 것이 더 낫습니까? 컨벤션이 있습니까, 아니면 순전히 주관적인 일입니까?
해결책
기사를 읽어보세요 "묻지 마세요"실용적인 프로그래머 웹 사이트에서 두 번째 예가 갈 길이라는 것을 알 수 있다고 생각합니다.
기본적으로, 당신은 당신의 첫 번째 예, 즉, 즉 코드를 통해 논리를 전파해서는 안됩니다.
- 현재 가시성 값을 얻고
- 가치에 따라 결정을 내리고
- 객체 업데이트.
다른 팁
당신이 준 예에서 show()
그리고 hide()
적어도 나에게 많은 이해를하십시오.
반면에, 당신이 재산이 있다면 skinPigment
그리고 당신은 기능을 불러 내기로 결정했습니다 tanMe()
그리고 makeAlbino()
그것은 정말로 가난하고 무성한 선택 일 것입니다.
주관적입니다. 사용자 (이 수업을 활용하는 사람들)가 생각하는 방식을 생각하려고 노력해야합니다. 어느 쪽을 결정하든, 그들에게는 분명해야하며 잘 기록 된.
isvisible ()/show ()/hide () 세트와 함께 이동합니다.
setVisible ()은 내부 변수를 변경 함을 의미합니다. show () 및 hide () 부작용을 명확하게 만듭니다.
반면에 모든 getVisible ()/setvisible ()가했을 때 ~였다 내부 변수를 변경하려면 공공 분야로서의 변수를 거의 변경하지 않았습니다.
세터는 실제로 객체 방향과 관련이 거의 없으며,이 예제에 적용되는 프로그래밍 관용구입니다. 게스터는 약간 더 좋지만 많은 경우에도 살 수 있습니다. 모든 것을 얻고 설정할 수 있다면 물체가있는 요점은 무엇입니까? 사물을 달성하기 위해 객체에서 작업을 호출해야하며, 내부 상태를 변경하는 것은 단지 이것의 부작용 일뿐입니다. 다형성의 존재하에있는 세터에 대한 나쁜 점 - OO의 초석 중 하나는 모든 파생 된 클래스에 세터를 갖도록 강요한다는 것입니다. 문제의 개체가 잘못 방문 가능한 내부 상태가 필요하지 않은 경우 어떻게해야합니까? 물론 그는 전화를 무시하고 공허한 것으로 구현할 수 있지만, 당신은 무의미한 수술을받습니다. OTOH, Show 및 Hide와 같은 작업은 내부 상태에 대해 아무것도 밝히지 않고 다른 구현으로 쉽게 무시할 수 있습니다.
일반적으로 세터/게스터는 속성 값 만 설정해야한다고 생각합니다. 당신의 예에서, 당신은 또한 isvisible 속성의 가치에 따라 행동을 수행하고 있습니다. 이 경우, 기능을 수행하여 작업을 수행하고 상태를 업데이트하는 것이 속성을 업데이트하는 부작용으로 작업을 수행하는 세터/getter를 갖는 것보다 상태가 낫다고 주장합니다.
오해를 바꾸면 쇼/숨기기 시나리오를 사용하는 것보다 실제로 객체의 가시성을 즉시 켜고 끄는 경우. 기존 상태에 약간 더 오래 머무르면 (예 : 다른 것이 다시 그리기를 일으킬 때까지) SET/GET 시나리오가 갈 길이 될 것입니다.
나는 show () 및 hide () 메소드가 당신이 무엇을하고 있는지 명시 적으로 말하기 때문에 선호합니다. SetVisible (부울)은 메소드가 바로 표시/그리기인지 여부를 알려주지 않습니다. Plus show () 및 hide ()는 인터페이스 (IMHO)를위한 더 나은 이름이 있습니다.
암시 적으로, '쇼'및 '숨기기'기능은 둘 다 세터입니다.
부울에게는, 당신이 보여준 단일 도구가 좋을 것이라고 생각합니다. 그러나 .Show 및 .hide 함수는 객체의 상태를 변경하는 함수가 아닌 명령처럼 보입니다.
실제로 코드를 작성 해야하는 경우
if (shouldBeShowingAccordingToBusinessLogic()) w.show();
else w.hide();
온통, 당신은 더 나을 것입니다
w.showIfAndOnlyIf(shouldBeShowingAccordingToBusinessLogic())
또는 진정으로 기괴한 경우에, 논리가 코드 스트레치가 끝날 때까지 DHOW를 수행할지 여부를 결정할 수없는 경우 시도 할 수 있습니다.
w.setPostponedVisibility(shouldBeShowingAccordingToBusinessLogic());
...
w.realizeVisibility();
(내가 Bizzare라고 말하지 않았습니까?)
디스플레이/숨기기 솔루션에 대한 추가 동기는 세터로서
그만큼 setVisible
메소드는 '부작용'이 있습니다. SomeClass
. 디스플레이/숨기기 방법은 발생하는 의도를 더 잘 전달합니다.