2012-04-27 2 views
0

방금 ​​Caliburn.Micro를 사용하기 시작했고 모든 예제에서 메서드가 모두 공용이라는 것을 알았습니다. 내가 버튼을 클릭하면Caliburn.Micro와 일치시키기 위해 모든 메서드가 public이되어야합니다.

private void CloseMainWindow() 
{ 
    TryClose(); 
} 

, 아무 일도 발생하지 않고 내가 중단 점을 때리지 마세요 : 내 VM에서

x:Name="CloseMainWindow" 

내가 방법을 추가 : 내가 가진 버튼을 추가하여이를 테스트하기로 결정 하지만 내가 공용으로 메서드를 변경하면 작동합니다. 이것이 최선의 방법이라고 생각하지 않습니다.

모든 메서드에 대한 ICommand 속성을 만드는 것이 허용 가능한 솔루션일까요?

편집 : 위의 질문에 대한 답을 읽은 것만으로도 Caliburn.Micro에는 ICommands가 없으며 절대 없을 것입니다. 그래서 내 원래의 질문은 여전히 ​​답변이 필요합니다. 왜 모든 것이 VM에 공개되어야하며 안전합니까?

답변

0

"이게 안전한가요?"라는 것이 무슨 뜻인지 몰라요. 무엇보다 안전합니까?

어쨌든 Caliburn.Micro 은 규칙이 개인용 방법에 바인드되도록 설계되었지만 몇 가지 단점이 있습니다. 첫째, Silverlight 또는 XBAP 또는 샌드 박스 플러그인과 같은 부분 신뢰 환경에서는 작동하지 않습니다. Reflection을 사용하여 개인 회원에 액세스하려면 완전한 신뢰가 필요하며 Caliburn.Micro는 부분 신뢰로 실행할 수 있도록 설계되었습니다 (결국 Silverlight를 지원합니다).

하지만 더 큰 이유는 캡슐화를 위반한다는 것입니다. 이것들은 여러분이 이 수업 외부에서 호출되도록하는 방법입니다. (뷰는 결국 별개의 클래스입니다. 코드 비하인드에서 직접 연결하는 경우 viewmodel 메서드를 public으로 만들어야합니다.) "내 클래스 외부에서 이것을 호출하려고합니다. "언어 사양에서, 그리고 그것은 public입니다. 클래스 밖에서 사적인 메서드를 호출하는 마법을 설정하면 캡슐화와 Least Astonishment의 원칙을 위반하게됩니다. 그 이유는 그것이 private이 아니기 때문입니다.

개인 메서드에 실제로 바인딩하려면 컨벤션을 사용자 정의 할 수 있습니다. 그러나 그것은 코드를 이해하기가 훨씬 어렵게 만들 것이므로, 정말 좋은 설명을 제시 할 수 없다면 추천하지 않을 것입니다.

+0

죄송합니다. 나는 가능할 때마다 사적인 것을 가르쳐왔다. 나는 누군가가 당신의 방법에 접근 할 수 있고 당신이 그것을 공개한다면 의도하지 않았을 때 그것을 실행할 수 있다고 들었다. 변수 대신에 속성을 사용하는 이유와 동일합니다. 내가 너무 엄격하게 가르쳐 온 것이 맞습니까? 나는 아직도 배우고있다, 우리 모두는 아닌가요? –

+0

API를 작성하는 경우 public 메소드는 private보다 신중하게 작성해야합니다. (EXE를 작성하는 경우에는 별 관심이 없지만 다른 사용자가 사용하려는 DLL의 경우는 중요합니다.) API가 구현 세부 사항 및 종속성을 노출하는 것을 원하지 않습니다. 예를 들어, 다른 "초기화"메소드를 먼저 호출하지 않은 경우 불어납니다. 하지만 당신은 사적인 사람과 그걸 가지고 도망 갈 수 있습니다. 그러나 버튼 클릭은 공개 메소드 (이미없는 경우)와 마찬가지로 사용자 지향적이므로 구현 세부 정보를 숨길 수 있습니다. –

관련 문제