문제

다음은 대규모 프로젝트 및 API/프레임 워크 디자인에 대한 경험이있는 분들을위한 질문입니다.

나는 미래에 다른 많은 프로젝트에서 사용할 프레임 워크를 연구하고 있으므로 멋지고 확장 가능하게 만들고 싶지만 동시에 간단하고 이해하기 쉬워야합니다.

많은 사람들이 .NET 프레임 워크에 너무 많은 봉인 된 클래스와 개인 회원이 포함되어 있다고 불평한다는 것을 알고 있습니다. 이 비판을 피하고 많은 보호 된 가상 회원과 함께 모든 수업을 열어야합니까?

내 방법과 속성을 많이 만드는 것이 좋은 생각입니까? 보호 된 가상 가능한 한? 어떤 상황에서 당신은 피할 것입니다 보호 된 가상 그리고 회원을 비공개로 만드십시오.

도움이 되었습니까?

해결책

귀하의 수업에는 데이터 구성원이 포함됩니다. 기능이 변경되어서는 안되는 데이터 구성원에서 기본 내부 작업을 수행하는 방법은 항상 비공개 여야합니다. 따라서 초기화 및 할당과 같은 데이터 구성원과 함께 기본 작업을 수행하는 방법은 비공개 여야합니다. 그렇지 않으면, 당신은 불완전한 행동 세트를 활성화 할 수있는 "2 차"미분 클래스의 위험을 실행합니다. 첫 번째 파생 회원은 잠재적으로 클래스의 행동을 재정의 할 수 있습니다.

모두, 나는 당신이 방법을 "보호 된 가상"으로 정의하는 데 매우 조심해야한다고 생각합니다. 방법을 "보호 된 가상"으로 정의하는 데 큰주의를 기울일 것입니다. 가능성 기능을 무시하는 것이지만 어떤면에서는 기대 재정의 기능. 그것은 나에게 무시할 수없는 행동 세트처럼 들린다. 오히려 반복 할 잘 정의 된 행동 세트를 갖고 싶습니다. 당신이 매우 큰 재정의 행동을 원한다면, 나는 측면 지향적 프로그래밍을 조사하는데, 이는 이런 종류의 것을 매우 구조화 된 방식으로 허용합니다.

다른 팁

가상이라는 단어로 메소드를 표시하면 사용자가 해당 논리가 실행되는 방식을 변경할 수 있습니다. 많은 목적을 위해 그것이 바로 당신이 원하는 것입니다. 나는 당신이 이미 그것을 알고 있다고 믿습니다.

그러나 유형은 이러한 종류의 확장을 위해 설계되어야합니다. 사용자가 동작을 변경하는 것이 합리적 인 방법을 적극적으로 선택해야합니다. 유형의 무결성을 망칠 위험이있는 곳에서 가상을 때리면 사용자가 유형을 이해하는 데 실제로 도움이되지 않으며 보안 관련 문제를 포함한 여러 버그를 소개 할 수 있습니다.

나는 보수적 인 접근법을 선호합니다. 나는 내 수업을 모두 표시합니다 sealed 내가 구체적으로 상속을 활성화하고 싶지 않다면 (소수의 경우) 필요한 방법 만 가상으로 만듭니다.

제거하기 쉽습니다 sealed 미래에 상속을 허용하기 위해 클래스를 변경 해야하는 경우 태그. 그러나 이미 다른 유형의 기본 클래스로 사용되고있는 클래스를 변경하려면 기본 클래스를 변경할 때 하위 클래스를 깨뜨릴 위험이 있습니다.

내 관점은 다음과 같습니다.

  • 사용자가 할 수있는 경우 events, 그것은 선호했습니다 protected 행동 양식.
  • 피하려고 노력하다 protected 가능하지 않으면 가능한 한 방법을 사용해야합니다 ;-).

고르는 protected ~ 위에 private 의도적 인 디자인 결정입니다. 귀하는 귀하의 클래스가 그 기능을 사용하는 것을 명시 적으로 지원하고, 그와 함께 제공되는 모든 오버 헤드 (설계 및 구현 노력)와 함께 명시 적으로 지원한다고 진술하고 있습니다. 나는 만 사용할 것입니다 protected 내가 필요하다는 것을 알고있는 상황에서, 나는 직접하고 있기 때문입니다. (또한 내가 말한 것과 같은 줄을 따라 BCL 개발자의 의견을 찾을 수 있습니다.)

그만큼 virtual/비virtual 성능 차이는 .NET 프레임 워크를 실행하기에 충분히 강력한 모든 머신과 관련이 없습니다.

아니요, 당신은 "너무 많은 것"을 가질 수 없습니다. 그러나 우리가 개인 대신 모든 보호를하거나 모든 비용으로 "봉인 된"피해야한다는 생각은 바보입니다. "도우미 방법"과 내부 데이터 구조를 비공개로 유지합니다.

내 방법과 속성을 많이 만드는 것이 좋은 생각입니까? protected virtual 가능한 한?

좋은 생각이 아닙니다.

보호 된 가상 메소드는 결합을 추가하면서 프레임 워크에서 확장 지점을 제공합니다.

확장 성을 제공하는 더 유망한 기술이 있습니다. 구성 그리고 대표단.

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