lsirikh / ProperyExplorerTest

에로로님의 예제를 구현 및 응용해보자
0 stars 0 forks source link

> 에로로님 계속 연구를 하다보니까. #3

Open lsirikh opened 2 years ago

lsirikh commented 2 years ago

에로로님 계속 연구를 하다보니까.

아마 DoublePropertySet을 어떻게 바꿔서 해결해야될 것 같은데요.

여기에 제가 backing-field로 뭔가를 만들어서 해결해야되는건가요?

DoublePropertySet을 뭔가 Generic 속성을 Double로 한정짓기 위해서 하신 것 같은데요.

설명을 봐도 이게 왜있고, Getter와Setter를 왜 분리하신것인지 이해가...ㅠㅠ

protected PropertySet(string name, Func<T> getter, Action<T> setter) { this.Name = name; this._getter = getter ?? this.GetDefaultGetter; this._setter = setter ?? this.SetDefaultSetter; } 혹시 이렇게 따로 만드신 이유를 알 수 있을까요?

코드가 없어서 뭔 말인지 정확히는 모르겠는데요. Getter 와 Setter 를 분리한 건 당연한 거라 뭐라 설명을 하기가... 1개 property 가 반드시 1개 의 field 를 get/set 해야한다는 법이 없잖아요.

Originally posted by @shwlee in https://github.com/lsirikh/ProperyExplorerTest/issues/2#issuecomment-930876668

shwlee commented 2 years ago

에로로님 계속 연구를 하다보니까. 아마 DoublePropertySet을 어떻게 바꿔서 해결해야될 것 같은데요. 여기에 제가 backing-field로 뭔가를 만들어서 해결해야되는건가요? DoublePropertySet을 뭔가 Generic 속성을 Double로 한정짓기 위해서 하신 것 같은데요. 설명을 봐도 이게 왜있고, Getter와Setter를 왜 분리하신것인지 이해가...ㅠㅠ

protected PropertySet(string name, Func<T> getter, Action<T> setter) { this.Name = name; this._getter = getter ?? this.GetDefaultGetter; this._setter = setter ?? this.SetDefaultSetter; } 혹시 이렇게 따로 만드신 이유를 알 수 있을까요?

코드가 없어서 뭔 말인지 정확히는 모르겠는데요. Getter 와 Setter 를 분리한 건 당연한 거라 뭐라 설명을 하기가... 1개 property 가 반드시 1개 의 field 를 get/set 해야한다는 법이 없잖아요.

Originally posted by @shwlee in #2 (comment)

따로 만들었다는 게 뭘 의미하는 지 잘 모르겠네요. ?ㅁ?

lsirikh commented 2 years ago

그러면 질문을 바꿔서요!!

원래 PropertySet을 생성할때,

protected PropertySet(string name, Func<T> getter, Action<T> setter) { this.Name = name; this._getter = getter ?? this.GetDefaultGetter; this._setter = setter ?? this.SetDefaultSetter; } 이렇게 만들어주는 것인가요? (저는 이렇게 만들어주는 것을 처음봤습니다.)

이렇게 생성하면 아래 와 같은 형식으로 되는 것인가요?

private int myVar; public int MyProperty { get { return myVar; } set { myVar = value; } } (좀더 말씀드리자면 int 형식이 아니라 T 제너릭 형식이겠지만요....)

제가질문을 드리고도 정확하게 내용을 모르니까 핵심을 집어서 말씀을 못드리겠네요..ㅠ

shwlee commented 2 years ago

아.. 이제 질문을 이해했습니다. (=ㅁ=);;;

우선 PropertySet 의 목적을 다시 잘 이해하셔야 합니다. PropertySet 은 Model 의 속성을 ViewModel 로 중계하기 위한 타입이에요. Model의 속성 중계가 왜 필요하냐? 항상 필요한 건 아니고, 지금 상황에서 필요해서 만들어 사용하는 건데요. 그럼 Model 에 대한 걸 먼저 얘기하자면,

Model은 저장된 데이터를 일정한 형태로 구조화 한 겁니다. view 에서 사용하기 위해 만든 타입이 아니지요. 그럼 view 에서 사용하기 위한 추상화된 구조화 모델은? ViewModel 입니다. 맞죠?

뭐 어찌됐든 View는 ViewModel 을 통해 Model 의 속성을 사용해야합니다. 그 ViewModel 이 Model 의 속성을 이용하는 방법은 여러가지가 있습니다.

  1. Model 이 가지고 있는 속성을 하나하나 그대로 복사해와서 ViewModel 의 속성에 할당해 사용하는 방법도 있을 수 있구요.
  2. 아예 Model 자체를 ViewModel 의 특정 property 로 보관해 직접 binding 해서 사용하는 방법도 있지요. 여타 다른 방법도 있을 겁니다.

둘 다 장단점이 있습니다. 1번 방법은 옮겨 담기를 하는 방식이기 때문에 무조건 ViewModel 쪽에 메모리 추가 할당/복사가 발생합니다. 옮겨담는 구문들이 필요하기 때문에 코드 역시 지저분해지고 길어지겠죠. 2번 방법은 Model 에 View에서 필요한 구조나 기능이 추가로 필요해 질 수 있습니다. 예를 들면 변경 통보 구문 같은 것이 Model 에 구현되어야 할 수도 있고, Model 의 데이터를 가공해서 view 가 사용해야할 경우 Model 내부에 가공 로직이 들어가는 경우가 생길 수도 있습니다. (Model 의 immutable 처리는 논외로 할게요.)

PropertySet 은 2번 상황에 포커스를 둔 처리입니다. 아래와 같은 요구 사항이 있어서 만든 거예요.

  1. 아! 뭔지 모르겠고, 로딩된 Model 을 최대한 가공하지 않고 그냥 ViewModel 던져놓으면 알아서 Binding 되게 하고 싶엉!
  2. view 에서 필요한 건 ViewModel 이 알아서 하고 Model 은 그냥 로딩된 값을 제공해줭!
  3. 그러면서 보통 two way binding 처럼 Model 의 값이 실시간으로 바뀌었으면 좋겠당!

그래서 PropertySet 을 만든 겁니다. (즉, Model 의 타입을 최대한 건드리지 않고 Model 의 속성을 중계하기 위해 만든 겁니다.) view 와의 Binding 은 Model을 중계하는 PropertySet 에서 처리하고 Model 의 값을 읽고 쓰는 것 역시 PropertySet을 통해 수행하는 거죠. 그럼 변경통보 구문이 Model 에 들어갈 필요 없이 PropertySet에 구현되면 되겠죠? PropertyExplorer 에서 (Model의)속성을 검색하는 기능 역시 Model 이 아니라 PropertySet 에 들어있죠? 이런 식으로 Model 타입을 건드리지 않고 속성만 사용하고 업데이트 하기 위해 PropertySet을 만들었어요.

자, 그러면 다시 본론으로 돌아와서 Model 의 속성을 중계한다는 건, Model의 속성을 get 하기도 하고, set 하기도 해야하겠죠?

private T myVar; public T MyProperty { get { return myVar; } set { myVar = value; } }

여기에 myVar 가 Model 의 속성이 와야 합니다. 예를 들면 RectModel.X 같은 속성이 와야 하죠. 그런데 RectModel.X 를 backing-field 에 할당하면 값복사가 일어날 뿐 원본 RectModel.X 에 변경이 발생하지 않겠죠? 즉, 중계가 안 되는 겁니다.

그래서 PropertySet 을 가져다 쓰는 쪽에서 Model 의 속성을 get/set 하는 델리게이트를 함께 전달시키도록 만든 것이죠. 거기에 약간의 확장을 갖기 위해 Model 없이 사용할 수 있도록 default constructor와 기본 getter / setter 둔 겁니다.

PropertySet 의 목적을 잘 생각해보시면 이해가 될 거 같네요. 지금 제가 설명한 내용은 중간쯤부터 나옵니다. https://blog.naver.com/vactorman/221131965521

요 편을 다시 정독해보시는 걸 추천드려욜 ~ㅅ~

그게 아니면... 더 좋은 방법이 있을까요?

lsirikh commented 2 years ago

아 감사합니다.

이해했습니다.

public abstract class PropertySet<T> : BaseNotifier, IPropertySet<T>

여기에서 새로운 double, string 등등의 형태로 구현된 PropertySets.cs 에 있는 ex)

public class DoublePropertySet : PropertySet<double>같은 생성자를 이용해서

데이터만 있는 모델의 타입을 미니멀개발자님이 최근에 올리신 인터페이스 컨트롤 프로젝트와 같은 형식으로

다시말해, NofityPropertyChanged의 기능을 갖춘 모델형태로 바꾼다는거죠?

대략 개념이 맞는지 모르겠네요..