더 적절한 것은 무엇입니까 : 게터와 세터 또는 기능은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/175228

문제

대체 함수 이름이 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 ()"메소드 쌍을 갖는 것이 더 낫습니까? 컨벤션이 있습니까, 아니면 순전히 주관적인 일입니까?

도움이 되었습니까?

해결책

기사를 읽어보세요 "묻지 마세요"실용적인 프로그래머 웹 사이트에서 두 번째 예가 갈 길이라는 것을 알 수 있다고 생각합니다.

기본적으로, 당신은 당신의 첫 번째 예, 즉, 즉 코드를 통해 논리를 전파해서는 안됩니다.

  1. 현재 가시성 값을 얻고
  2. 가치에 따라 결정을 내리고
  3. 객체 업데이트.

다른 팁

당신이 준 예에서 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. 디스플레이/숨기기 방법은 발생하는 의도를 더 잘 전달합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top