1. 정적 대 인스턴스
좋은 OO 디자인과 그렇지 않은 것에 대해 매우 명확한 지침이 있다고 생각합니다. 문제는 블로고 스피어가 선과 악을 추악하게 구분하는 것을 어렵게한다는 것이다. 당신은 찾을 수있는 몇 가지 당신이 생각할 수있는 최악의 실천을 지원하는 레퍼런스의 종류.
제가 생각할 수있는 최악의 사례는 언급 한 통계와 모든 사람이 좋아하는 싱글 톤을 포함하여 전역 상태입니다. Misko Hevery의 주제에 대한 고전 기사 의 일부 발췌 .
종속성을 실제로 이해하려면 개발자는 모든 코드 줄을 읽어야합니다. 테스트 스위트를 실행할 때 한 테스트에서 글로벌 상태가 변경되면 후속 또는 병렬 테스트가 예기치 않게 실패 할 수 있습니다. 수동 또는 Guice 종속성 주입을 사용하여 정적 종속성을 해제하십시오.
거리에서의 무시 무시한 행동은 (우리가 참조를 전달하지 않았기 때문에) 고립 된 것으로 판단되는 한 가지를 실행하지만 예상치 못한 상호 작용과 상태 변경은 우리가 물체에 대해 말하지 않은 시스템의 먼 위치에서 발생합니다. 이것은 글로벌 상태를 통해서만 발생할 수 있습니다.
이전에는 이런 식으로 생각하지 않았지만 정적 상태를 사용할 때마다 비밀 통신 채널을 작성하고 API에서 명확하게 표시하지 않습니다. 거리에서의 무시 무시한 행동으로 인해 개발자는 모든 코드를 읽어 잠재적 인 상호 작용을 이해하고 개발자 생산성을 낮추며 새로운 팀원을 혼란스럽게합니다.
이것이 요약되는 것은 일종의 저장된 상태를 가진 것에 대한 정적 참조를 제공해서는 안된다는 것입니다. 내가 정적을 사용하는 유일한 장소는 열거 된 상수에 대한 것이며, 그에 대한 오해가 있습니다.
2. 입력 매개 변수가있는 메소드와 리턴 값이없는 메소드
입력 매개 변수가없고 출력 매개 변수가없는 메소드는 내부적으로 저장된 상태 (즉, 수행중인 작업)에서 작동하도록 보장됩니다. 있습니다 전체 언어 저장 상태를 피할 수있는 아이디어에 내장되어 있습니다.
상태를 저장할 때마다 부작용이 발생할 가능성이 있으므로 항상주의해서 사용해야합니다. 이는 정의 된 입력 및 / 또는 출력 기능을 선호 해야 함을 의미합니다 .
실제로 입력과 출력을 정의한 함수는 테스트하기가 훨씬 쉽습니다. 여기서 함수를 실행할 필요가 없습니다. 어떤 일이 있었는지 확인하기 위해 속성을 설정할 필요가 없습니다. 그렇지 않으면 테스트중인 함수를 실행하기 전에
이 유형의 함수를 정적으로 안전하게 사용할 수도 있습니다 . 그러나 나중에 새로운 구현으로 다른 인스턴스를 제공하는 대신 어딘가에서 해당 기능의 약간 다른 구현을 사용하고 싶을 경우 기능을 대체 할 수있는 방법이 없습니다.
3. 중복 대 구별
질문을 이해하지 못합니다. 두 가지 겹치는 방법의 장점은 무엇입니까?
4. 개인 대 공개
노출 할 필요가없는 것을 노출시키지 마십시오. 그러나 나는 또한 사적인 팬이 아닙니다. 저는 C # 개발자가 아니라 ActionScript 개발자입니다. 저는 2007 년경에 작성된 Adobe의 Flex Framework 코드에서 많은 시간을 보냈습니다. 그리고 그들은 비공개로 만들 내용을 정말 잘못 선택하여 수업을 확장하려는 악몽이되었습니다.
따라서 2007 년경 Adobe 개발자보다 건축가가 더 좋다고 생각하지 않는 한 (질문을 제기하기 전에 몇 년이 더 있다고 말할 수 있습니다.) .
코드 예제에 약간의 문제가있어 아키텍처가 잘못되어 A 또는 B를 선택할 수 없습니다.
우선, 객체 생성과 사용을 분리 해야 할 것입니다 . 따라서 일반적으로 new XMLReader()
사용되는 곳 옆에 권리 가 없습니다 .
또한 @djna가 말했듯이 XML 리더 사용에 사용 된 메소드를 캡슐화해야 API (인스턴스 예제)가 다음과 같이 단순화 될 수 있습니다.
_document Document = reader.read(info);
C #의 작동 방식을 모르지만 여러 웹 기술을 사용해 본 결과 약속 또는 미래 유형을 제외하고는 항상 XML 문서를 즉시 반환 할 수는 없을 것입니다. C #에서 비동기로드를 처리하는 방법에 대한 조언을 드릴 수는 없습니다.
이 접근 방식을 사용하면 XML 객체를 읽고 반환 할 위치 / 대상을 알려주는 매개 변수를 가져와 프로젝트 요구에 따라 스왑 할 수있는 몇 가지 구현을 작성할 수 있습니다. 예를 들어, 데이터베이스, 로컬 상점 또는 원래 예제와 같이 URL에서 직접 읽을 수 있습니다. 정적 메소드를 사용하면 그렇게 할 수 없습니다.