2016-06-03 3 views
-1

적절한 캡슐화 방법에 대해 article으로 문의했습니다. 그것은 정말로 나의주의를 끌었고 나의 이전의 혼란의 일부를 해결했다. 그런 다음 구현에 대해 생각했습니다. 일반적인 참조를 노출하는 속성이나 getter 메서드가 없어야합니다. 이를 달성하기 위해 각 내부 필드를 새로 생성해야합니다. 그러나 건설 논리를 알거나 적절한 생성자를 찾는 것이 항상 가능한 것은 아닙니다. 그래서 나는이 목적을 위해 깊은 복제가 사용될 수 있다고 생각했습니다.정확한 캡슐화를 위해 딥 복제

깊은 복제를 달성하는 몇 가지 방법이 있습니다 (one way, some other ways).

내 질문은 :

1 내 접근 메이크업 감각 않거나 완전히 넌센스인가?

2- 딥 (deep) 복제 작업이 위험하거나 불확실합니까? 그렇다면 핵심 모듈 (비즈니스 모델 게터)에 동적 (또는 불확실한) 동작을 사용하는 것이 적절합니까?

추신 : 기사에서 Java가 사용 되더라도 .NET 또는 C#에 대한 질문을합니다. 나는 정말로 확신 할 수 없지만 자바는 다른 복제 능력을 가지고 있을지도 모른다. Java에 익숙하지 않습니다.

답변

3

Java와 C#은 의미가 동일한 곳에서 충분히 가깝습니다.

나에게이 기사는 게시되지 않은 상태로 남겨 두는 것이 좋을 것입니다. 단 하나의 역할은 사람들을 혼란에 빠뜨리며 "내 모든 노출 된 개체를 인터페이스에서 깊게 복제해야합니다. 바뀌어. "

캡슐화의 핵심은 아닙니다. 예를 들어 - - 캡슐화의 핵심이되도록하는 공공 생년월일 주어진 시대의 계산, 노출되지 않은 : 따라서

class foo { 
    public DateTime Birthdate { get;set;} 
    public int Age { get { return (DateTime.Now - Birthdate).ToYears(); } } 
} 

, 계산되는 시대가 노출되지 않는 방법의 "내부 작업". 또는 그 논리는 캡슐화 된 것입니다.

이제 노출 된 개체가 완전히 변경할 수 없지만 일반적으로 쓰레기가 있는지 확인하려는 경우가 있습니다. (딥 복제는 단순한 묘기가 아니며,에있는 이며,이 기사는 누구에게나 좋은 일을하도록 광범위한 범위의 통찰력을 제공하지 못합니다.)

노출되는 모든 것을 깊게 복제하고 그 안에 포함 된 논리로 클래스를 작성한다는 생각을 버리십시오. 그러면 대다수의 용도에 맞게 캡슐화 할 수 있습니다.

OOP 개념은 항상 실용주의의 매우 건강한 복용량과 함께 취해야합니다.

+0

고맙습니다. 이 개념을 은색 총알처럼 사용해서는 안된다는 것이 맞습니다. 그러나 나는 그것으로부터 통찰력을 얻었습니다. 그것은 가치가 있습니다. 나는이 문제 때문에 여러 번 붙어있다. 나는 이것을 "참고 중독"으로 묘사했으나 제대로 풀 수는 없었다. –

관련 문제