문제

수동 뷰를 올바르게 사용하는 방법을 이해하려고합니다. 수동적 관점에서 내가 보는 모든 예가 Demeter의 법칙을 어기는 것 같습니다.

//In the presenter code
myview.mytextfield.text = "whatever";

그렇다면 패시브 뷰의 더 나은 구현은 무엇입니까?

도움이 되었습니까?

해결책

첫째, 대부분의 프로그래밍 규칙과 마찬가지로 Demeter의 법칙은 원칙이나 지침에 더 가깝고 원칙이 적용되지 않는 경우가 있습니다. 즉, Demeter의 법칙은 실제로 적용되지 않습니다. 수동적 견해 이 경우 법의 이유는 문제가되지 않기 때문입니다.

Demeter의 법칙은 다음과 같은 의존성 체인을 방지하려고 노력하고 있습니다.

objectA.objectB.objectC.DoSomething();

분명히 ObjectB의 구현이 대상을 사용하여 대신에 사용되면 대변의 종속성을 깨뜨리고 컴파일 오류가 발생합니다. 극단적으로 옮겨 가면 구현 변경으로 체인이 방해받을 때마다 산탄 총 수술을받습니다.

의 경우 수동적 견해

  • 발표자는 인터페이스에 의존하므로 인터페이스가 동일하게 유지되는 한보기의 구현이 변경 될 수 있습니다.
  • 보기는 일반적으로 속성을 시스템 유형 및 컬렉션과 같은 일반화 된 데이터 유형으로 노출시킵니다. 이를 통해 발표자에게 영향을 미치지 않고 UI를 변경할 수 있습니다.
  • 발표자에게 View는 데이터 구조, 데이터를 검색하고 덤프하기위한 장소에 지나지 않는 것으로 보입니다. 보기는 매우 간단하기 때문에 발표자는 종속성 체인을 수행 할 수 없어야합니다.

따라서 귀하가 준 예제는 일반적으로 구현됩니다.

//from presenter
view.MeaningfulName = "data";

보기는 다음과 같습니다.

//from view
public string MeaninfulName
{
    get
    {
        return someControl.text;
    }
    set
    {
        someControl.text = value;
    }

이것이 상황을 조금 명확하게하기를 바랍니다.

다른 팁

더 나은 구현은 발표자와보기 사이에 API를 갖는 것입니다. 발표자는 단일 메소드 (보기의 인터페이스에 정의 됨)를 통해 데이터를 뷰로 푸시합니다. 뷰는 일부 내부 논리에 따라 새로운 입력을 관리합니다.

따라서 발표자는 견해에 대해 아무것도 알 필요가 없으며 Demeter의 법칙은 안전합니다.

좋아, 그래, 그래 하다 기본적으로 객체에 대한 인터페이스가 객체의 구현을 밝히지 않아야한다고 말하는 Demeter의 법칙을 깨뜨립니다. 그러나 두 번째는 구현에 대한 많은 힌트를 제공합니다.

일반적으로 올바른 인터페이스가 있는지 물어볼 때라고 생각합니다. 뭐 ~이다 이 텍스트 필드? 누가 그들을 시야에서 설정하고 있습니까? View가 그 반대 대신 데이터에 대한 모델을 요구해서는 안됩니까?

아마도 관찰자 패턴이 필요할 수도 있습니다. 모델은 이해 당사자 목록을 유지하고 내부 상태가 변경 될 때 통지합니다.


아, 저것 수동적 견해. 오랫동안 그것을 보지 못했습니다. 기본적으로 두 부분이 보입니다. 그 중 하나는 컨트롤러 (모델이 아닌)가 모든 업데이트를 구동함으로써 효율성을 높이기 때문에 해당 필드를 업데이트하기 위해 특정 필드 방법을 노출 시킨다는 것입니다. 이것은 결국 머피의 법칙과 같은 은유 적 의미에서 "법"일뿐입니다. 그러나 일반적으로 좋은 생각입니다. 이 경우, 나는보기를 다시 만들어 개별 필드에 업데이트를 마무리하기 위해 정면으로 사용했습니다.

그래도 관찰자 패턴이 필요하지 않습니다. 이제 컨트롤러가 모든 업데이트를 만들었 기 때문입니다. 전체 코드에 약간의 복잡성과 오류 경력이 추가됩니다. 이제 컨트롤러를 작성하여 병렬 업데이트를 작성하기 때문입니다.

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