상속을위한 디자인은 어떻게 추가 비용을 발생시킬 수 있습니까? [닫은]


12

그래서 나는로부터 상속 원 sealed classCSHARP 및 점화되었다. 소스에 액세스 할 수 없으면 봉인을 해제 할 방법이 없습니다.

그런 다음 "왜 sealed존재 하는가?"라는 생각이 들었습니다 . 4 개월 전에. 다음과 같은 많은 것들을 읽음에도 불구하고 그것을 알아낼 수 없었습니다.

나는 그 이후로 모든 것을 소화하려고 노력했지만 너무 나에게 적합합니다. 결국 어제 나는 다시 시도했다. 나는 그들 모두를 다시 스캔하고 몇 가지를 더 스캔했습니다.

마지막으로, 많은 숙고 끝에 새로운 제목을 바탕으로 원래 질문 을 크게 편집 하기로 결정했습니다 .

오래된 질문은 너무 광범위하고 주관적인했다. 기본적으로 묻습니다.

  1. 이전 제목에서 : 밀봉을 사용해야하는 좋은 이유
  2. 본문 : 봉인 클래스를 올바르게 수정하는 방법은 무엇입니까? 상속을 잊어 버리셨습니까? 작곡을 사용하십니까?

그러나 이제는 모든 것이 상속을 막는다는 것을 이해하고 (어제는하지 않았지만) 실제로 상속보다 구성을 사용할 수 있고 사용해야한다는 사실 은 내가 필요한 것이 실제적인 예라 는 것을 깨달았습니다 .sealed

나는 내 질문이 Mindor 씨가 채팅에서 나에게 제안한 것과 정확히 일치 한다고 생각한다 . 상속을위한 디자인은 어떻게 추가 비용을 초래할 수 있는가?


5
이 질문은 매우 적극적으로 표현되며 맹렬한 소리처럼 들립니다. 관련 있고 객관적인 답변을 원할 경우이를 다시 말해야합니다.
행복감

11
많은 프레임 워크 클래스가 봉인 된 이유를 참조하십시오 . 에릭 리퍼 트 그는 수업을 봉인해야 할 몇 가지 이유를 제시합니다.
Robert Harvey

9
그런 다음 기사를 읽지 않았습니다. 돌아가서 다시 읽으십시오. 그것은이 아래로 비등 : 당신이 클라이언트를 확장하여 클래스를 깰 수있는 수많은 방법을 예측할 수 없습니다. 고객을 비난 할 수는 있지만 고객을 지원해야합니다.
Robert Harvey

4
@Cawas 그는 또는 당신이 그것을 자세히 설명하는 기사를 읽을 수 있습니다. 그는 단지 그 기사를 그의 의견과 요약했습니다.
Servy

7
미안하지만 난 여기서 도망친 사람이 아니야 질문에 대한 대답은 매우 간단합니다. 상속을 지원하지 않으려는 경우 클래스를 봉인하십시오. 그게 다야.
Robert Harvey

답변:


27

이것은 이해하기 어렵지 않습니다. sealed삶을 편하게하고 많은 돈을 절약하며 명성을 높이기 위해 Microsoft를 위해 특별히 만들어졌습니다. 언어 기능이기 때문에 다른 사람도 사용할 수 있지만 봉인을 사용할 필요는 없습니다.

대부분의 사람들은 수업을 연장 할 수 없다고 불평하고 있으며, 그렇게하면 수업이 제대로 진행되도록하는 것은 개발자의 책임이라는 것을 모든 사람이 잘 알고 있다고 말합니다. 똑같은 사람들을 제외하고는 Windows의 역사에 대한 단서가 없으며 문제 중 하나 sealed가 해결하려고합니다.

개발자가 .Net 코어 클래스를 확장하고 (봉인이 없기 때문에) 완벽하게 작동한다고 가정 해 봅시다. 예, 개발자를위한 것입니다. 개발자는 제품을 고객에게 제공합니다. 개발자의 앱이 훌륭하게 작동합니다. 고객은 행복합니다. 인생은 좋다

이제 Microsoft는이 특정 .Net 코어 클래스의 버그 수정을 포함하는 새로운 운영 체제를 출시합니다. 고객은 시간을 지키고 새 운영 체제를 설치하도록 선택합니다. 갑자기 고객이 좋아하는 응용 프로그램은 더 이상 작동하지 않습니다. .Net 코어 클래스에서 수정 된 버그를 고려하지 않았기 때문입니다.

누가 비난을 받습니까?

Microsoft의 역사에 익숙한 사람들은 Microsoft의 새로운 OS가 Windows 라이브러리를 잘못 사용하는 응용 프로그램 소프트웨어가 아니라 책임을 져야한다는 것을 알고 있습니다. 따라서 문제를 만든 응용 프로그램 회사 대신 문제를 해결하는 것이 Microsoft의 의무입니다. 이것이 Windows 코드가 부풀어 오른 이유 중 하나입니다. 내가 읽은 바에 따르면 Windows 운영 체제 코드에는 특정 if-then 검사가 포함되어 특정 응용 프로그램 및 버전이 실행 중인지 확인하고 그렇다면 특별한 처리를 수행하여 프로그램이 작동하도록합니다. 그것은 다른 회사의 무능을 해결하기 위해 Microsoft가 소비 한 많은 돈입니다.

를 사용 sealed하면 위의 시나리오가 완전히 제거되지는 않지만 도움이됩니다.


4
@Cawas 그것을 남용하는 것은 꽤 어렵다. 에릭 리퍼 트 ​​(Eric Lippert)는 sealed구체적으로 봉인되지 않은 한, 메소드와 같은 클래스 가 기본적 으로 모두 상속되도록 설계된 클래스가 거의 없기 때문에 기본적 으로 모든 클래스를 원한다고 여러 번 언급했다 . 클래스가 클래스를 지원하도록 빌드되지 않았을 가능성이 더 높으며, 봉인되지 않은 것으로 표시하는 데 방해가된다면 개발 시간을 보내야합니다.
Servy

1
사람들이 내부 개발 소프트웨어를 위해 봉인을 사용하고 있다면 아마도 그것을 잘못 사용하거나 너무 완벽 해 지려고 회사 시간을 낭비하고 있다고 생각합니다. 아마도 특정 시나리오에서 의미가있는 경우가 항상 있기 때문에 아마도 말할 것입니다. 그러나 라이브러리 유형 소프트웨어를 개발하는 사람들에게는 Microsoft가 필요하다고 결정한 것과 같은 이유로 매우 유용하다고 생각합니다.
덩크

2
@Cawas 광대 한 대부분의 개발자가 작성한 클래스의 대부분은 필요하지 않습니다 상속하고, 지원 상속에 기록되지 않습니다. 이것은 타입을 만들어서 코드의 독자 / 사용자에게 빠르고 효과적으로 전달 될 수 있습니다 sealed. 실제로 기본 옵션이라면 누군가가 유형에서 상속받은 경우 해당 유형을 지원하도록 빌드되었음을 알 수 있습니다.
Servy

2
클래스 봉인을 해제한다고해서 해당 클래스가 해당 클래스를 지원하도록 구축 된 것은 아닙니다. 그것은 누군가 누군가가 계급에서 물려 받고 개봉하기를 원한다는 것을 의미합니다. 최선의 경우 밀봉을 사용하면 개발자가 기존 기능 (봉인 클래스와 동일)을 다시 작성하게되지만 소스 코드를 사용할 수있는 경우에는 결과를 고려하지 않고 단순히 봉인을 해제 할 수 있습니다. 구체적이고 드물게 봉인 된 것이 더 좋습니다. 개발자 가이 클래스가 봉인 된 이유 를 알아낼 수 있기 때문 입니다. 봉인 된 수업이 너무 많아 왜 그런지 신경 쓰지 않습니다.
덩크

1
또한 보안 은 그것을 사용해야하는 이유입니다! 파일에 액세스하려는 샌드 박스 응용 프로그램을 고려하십시오. 샌드 박스는 파일 이름 문자열을 테스트 할 수 있지만 공격자가 변경 가능 변수 String 를 보낸 다음 보안 검사 후 또는 I / O 전에 변경 가능한 경우 어떻게해야 합니까? 시나리오 유형이 Java 와 비슷하게 String표시되는 이유라고 생각 하며 동일한 논리가 일부 C # 결정을 뒷받침합니다. finalsealed
Darien

23

sealed클래스의 작성자 가 상속하도록 설계하지 않았 음을 나타냅니다 . 더 적은 아무것도 없습니다.

인터페이스를 올바르게 디자인하는 것은 이미 많은 프로그래머에게 충분하지 않습니다. 상속 될 수있는 클래스를 올바르게 디자인하면 어려움과 코드가 추가됩니다. 더 많은 코드 줄을 작성하면 더 많은 코드를 유지 관리해야합니다. 이러한 어려움을 피하기 위해 sealed클래스가 상속되지 않았 음을 보여줄 수 있으며, 이러한 맥락에서 클래스 봉인은 문제에 대한 완벽한 해결책 입니다.

클래스 CustomBoeing787가에서 파생 된 경우를 상상해보십시오 Airliner. 이것은의 CustomBoeing787일부 보호 메소드를 대체 Airliner하지만 전부는 아닙니다. 개발자가 충분한 시간을 가지고 있고 그만한 가치가 있다면, 오버라이드되지 않은 메소드가 호출 될 때 (예 : 오브젝트의 상태를 변경하는 보호 된 setter) 상황에서도 모든 것이 예상대로 작동하는지 클래스를 단위 테스트 할 수 있습니다. 같은 개발자가 (1) 시간이 없다면 (2) 보스 / 고객에게 수백 또는 수천 달러를 더 쓰고 싶지 않거나 (3) 추가 코드를 작성하고 싶지 않은 경우 바로 지금 필요합니다 (YAGNI).

  • 잠재적 인 버그를 관리하기 위해이 프로젝트를 나중에 유지 보수 할 프로그래머의 관심사라는 점을 고려하여 코드를 그대로 공개하십시오.

  • 또는 sealed미래의 프로그래머에게이 클래스가 상속 될 의도가 아니며 클래스를 봉인 해제하고 부모로 사용하는 것은 자신의 책임하에 수행해야 함을 명시 적으로 표시하도록 클래스에 표시하십시오 .

가능한 많은 클래스를, 또는 가능한 적은 클래스를 인봉하는 것이 좋은 생각입니까? 내 경험으로는 결정적인 대답이 없습니다. 일부 개발자는 sealed너무 많이 사용하는 경향이 있습니다 . 다른 사람들은 클래스가 어떻게 상속되고 클래스가 발생할 수있는 문제에 신경 쓰지 않습니다. 이러한 사용법에서 문제는 프로그래머가 들여 쓰기를 위해 두 개 또는 네 개의 공백을 사용해야하는지 여부를 결정하는 문제와 유사합니다. 정답은 없습니다.


내가 다시 공격적인 사운드,하지만 난 그냥 확실하게하려면 여기 주장하는 경우가 작성한다면 좋아 ... 죄송합니다 ... 난 단지, 당신은 단지 2 가지 방법 중 하나를 쓴 이해할 수 있습니다 tl;dr여기에. 그것은 하나의 "이 하나의 좋은 이유가 아닌, 아니오" , 또는 "나는 좋은 이유가 없다 생각하지만, 나뿐만 아니라 모르겠어요." . 나에게 "정답 없음"은 그 중 하나입니다.
cregox

6
sealed클래스의 작성자가 상속하도록 설계하지 않았 음을 나타냅니다. 그게 당신의 유일한 이유입니다.
Robert Harvey

그것은 조명이없는 자전거를주고 어떤 식 으로든 조명을 추가 할 수없는 좋은 이유입니다.
cregox

2
@Cawas 어떻게 그렇게? 이러한 맥락에서 자전거 제작자가 자전거에 조명이 없는지 확인하는 것은 중요하지 않지만 , 유형의 사용자에게는 구현이 특정 정확한 구현인지 확인하는 것이 중요합니다. 필요한 제약 조건을 시행합니다. 어떤 경우에는 사람들이 실제로 필요하지 않은 제약 조건을 추가 할 수 있습니다. 당신은 그 예를 제공했습니다. 한 곳에서 구속 조건이 잘못 사용되었다고해서 절대로 아무것도 구속해서는 안된다는 의미는 아닙니다.
Servy

1
또한 보안 은 그것을 사용해야하는 이유입니다! 파일에 액세스하려는 샌드 박스 응용 프로그램을 고려하십시오. 샌드 박스는 파일 이름 문자열을 테스트 할 수 있지만 공격자가 변경 가능 변수 String 를 보낸 다음 보안 검사 후 또는 I / O 전에 변경 가능한 경우 어떻게해야 합니까? 시나리오 유형이 Java 와 비슷하게 String표시되는 이유라고 생각 하며 동일한 논리가 일부 C # 결정을 뒷받침합니다. finalsealed
Darien

4

클래스가 봉인되면 해당 유형을 사용하는 코드가 처리 대상을 정확하게 알 수 있습니다.

이제 C # stringsealed에서 상속받을 수 없지만, 그렇지 않은 경우를 잠시 가정 해 봅시다. 그렇다면, 누군가 다음과 같은 클래스를 작성할 수 있습니다.

public class EvilString// : String
{
    public override string ToString()
    {
        throw new Exception("I'm mean");
    }
    public override bool Equals(object obj)
    {
        return false;
    }
    public override int GetHashCode()
    {
        return 0;
    }
}

이것은 이제 디자이너가 string사실로 알고 있는 모든 종류의 속성을 위반하는 문자열 클래스입니다 . 그들은 그 Equals방법이 전이 될 것이라는 것을 알았습니다 . 도대체,이 equals 메소드는 심지어 문자열과 같을 수 있지만 그 문자열과 같지 않기 때문에 대칭이 아닙니다. 의 ToString방법이 stringnull이 아닌 값에 대해 예외를 발생시키지 않는다는 가정하에 코드를 작성한 모든 종류의 프로그래머가 있다고 확신 합니다. 이제 그 가정을 위반할 수 있습니다.

우리가 이것을 할 수있는 다른 클래스들과 우리가 위반할 수있는 모든 다른 가정들이 있습니다. 에 대한 언어 기능을 제거하면sealed그런 다음 언어 디자이너는 이제 모든 라이브러리 코드에서 이와 같은 사항을 설명해야합니다. 사용하려는 확장 된 유형의 유형이 "적절하게"쓰여질 수 있도록 모든 종류의 검사를 수행해야하는데, 이는 매우 비싼 작업 일 수 있습니다 (개발 시간과 런타임 모두). 그들은 클래스를 봉인함으로써 이것이 불가능하다는 것을 보장하고 의도적으로 확장되도록 설계된 유형을 제외하고 자신의 유형의 구현 세부 사항에 대한 주장을 위반 할 수 없도록 할 수 있습니다. 확장되도록 설계된 유형의 경우 언어 코드가 처리 방법에 대해 훨씬 방어 적이어야합니다.


그러나 코드 에서이 가정을 위반할 수 있습니다 . String의 소스를 잡고 편집하는 것과는 다릅니다. 디자이너는 1 개의 리프, 1 개의 브랜치, 1 개의 클라이언트가 자체 위험과 재량에 따라이를 사용하기 때문에이를 설명 할 필요가 없습니다. 다른 클라이언트가 선호하지 않는 한 배포되지 않습니다. 등등.
cregox

3
@Cawas 예기치 않은 시간에 예외가 발생하여 결과적으로 리소스가 유출되거나 클래스가 미확인 상태로 남아 부적절하게 작동하는 경우? 이 사례는 약간 어리석은 일이지만 누군가가 합리적이라고 생각하는 구현을 작성하지만 특정 값으로 작동하지 않거나 작동하지 않을 때 가끔 발생하는 경우가 있습니다. 그러면 언어 코드가 작동하지 않을 때 불만을 표시합니다. 사람들이 언어가 지원할 수없는 일을하도록하지 않는 것이 좋습니다.
Servy

어쨌든 컴파일러 빌드에 대해 이야기하고 있습니다. sealed우리가 사용하도록 노출되지 않은 많은 기능들이 내장되어 있습니다. 그것은 왜 그렇게 좁은 범위 밖에서 그것을 사용하는지 설명하지 않으며 컴파일러 코드 만큼 좁아 도 sealed존재를 설명하지 못합니다 .
cregox

2
@Cawas string형식이 컴파일러 코드가 아닙니다. 언어 코드의 일부입니다. 완전히 다릅니다. 어쨌든, 나는 단지 하나의 예를 골랐다. 전체 BCL에서 대부분의 봉인 클래스를 선택하여 예제로 사용할 수 있습니다.
Servy

4
@Cawas : 고객 지원 측면에서 누락 된 부분이 있다고 생각합니다. 클래스를 상속받을 수있게 허용하면 고객이 클래스를 상속 한 다음 중단 될 때 고객에게 전화하게됩니다. 하루 종일 그들에게 자신의 위험에 따라 그 클래스 에서 상속 받았다고 말할 수는 있지만, 전화 를 상속받을 있기 때문에 전화를 계속 받을 것이므로 그렇게하는 것이 안전하다고 가정합니다.
Robert Harvey

3

봉인을 사용해야 할 이유가 있습니까?

응? 자주는 아닙니다. 나는 내가 불변의 유형 (또는 다른 제한)이 경우에만 밀봉에 사용됩니다 정말 정말 불변을 유지하기 위해 필요를 하고 나는 신뢰 상속자는 시스템에 미묘한, catastropic 버그를 도입하지 않고 그 요구 사항을 furfill 할 수 없습니다.

봉인을 사용해야 할 합당한 이유가 있다고 가정하고 상속으로 수행하는 모든 것을 기본으로 사용해야한다고 가정 해보십시오.

우리는 기본값이 아닌 것들에 대해 상속을 사용합니다. 구성이 상속보다 선호 되더라도 상속이 버려지는 것은 아닙니다. 상속에는 디자인 및 코드 유지 관리에 도입되는 몇 가지 본질적인 문제가 있으며 구성은 일반적으로 적은 문제로 거의 동일한 일을합니다. 그리고 그것은 구성이 선호 되더라도 상속이 특정 부분 집합에 좋다는 것을 의미합니다.

너무 의미가있는 것은 아니지만, 지금 SOLID 및 단위 테스트에 대해 들어 본 적이 있다면 암석 밑에서 빠져 나와 실제로 코드를 작성해야합니다. 상황은 명확하지 않으며 "항상 X를 사용하거나"절대 사용하지 않습니다 "또는"Z가 가장 좋습니다 "가 올바른 방법이되는 경우는 거의 없습니다 (질문의 견해를 바탕으로 한 것처럼 보입니다). 코드를 작성할 sealed다른 트레이드 오프와 마찬가지로 좋은 경우와 슬픔을 일으키는 경우를 볼 수 있습니다 .


로버트가 정교하고 싶지 않은 "이것은 고객에게 상속받지 않아도되는 것"이 ​​가장 유망한 해답 일 것입니다 sealed.
cregox

@Cawas-잘 할 수 있을지 모르겠습니다. 나는 거의 그것을하지 않으며, 종종 (성능 최적화, 디자인 단순화를 위해) 무언가를 불변으로 유지한다는 보장이 객체에서 상속 할 수없는 가치가있는 트레이드 오프입니다.
Telastyn

멋지다. 덩크는 이미 그것을 마셨다! : P 답변 주셔서 감사합니다. 그리고 당신은 내 전문 지식에 대한 "미묘한 힌트"를 얻을 수있는 유일한 사람이었습니다. 사람들이 내가 더 많이 알고 있다고 생각하는 것 같습니다. 모르겠습니다 ... 그러나 "그냥 코딩"만으로도이 암석에서 벗어날 수 있기를 바랍니다. 어쩌면 내가 생각하는 것만 큼 절차 적으로가 아니라 어떤 식 으로든 그러한 개념을 적용 할 수도 있습니다.
cregox

3

우선, Microsoft가 수업을 봉인하는 이유에 대한 Eric Lippert의 게시물을 읽어보십시오.

http://blogs.msdn.com/b/ericlippert/archive/2004/01/22/61803.aspx

두 번째로, 밀봉 키워드는 그것이하는 일을 정확하게 수행하기 위해 존재합니다. 상속을 막고 싶은 상황이 많이 있습니다. 당신이 모인 수업을 생각해보십시오. 코드가 특정 방식으로 작동하는 클래스에 의존하는 경우 누군가 해당 클래스의 메소드 또는 속성 중 하나를 재정 의하여 응용 프로그램이 실패하는 것을 원하지 않습니다.

셋째, 봉인을 사용하면 상속보다 구성을 장려하는 것이 좋은 습관입니다. 상속 이상의 구성을 사용한다는 것은 Liskov의 대체 원칙을 어길 수 없으며 개방 / 폐쇄 원칙을 따르는 것입니다. sealed따라서 oo 프로그래밍의 5 가지 가장 중요한 원칙 중 2 가지를 따르는 데 도움이되는 키워드입니다. 나는 그것이 매우 귀중한 기능이라고 말합니다.


첫 번째 부분은 이미 질문 의견에서 지적되었습니다. 두 번째 부분은 실제 원인이 없으면 더 많은 추론입니다. 세 번째 부분은 이미 다른 곳에 접근했지만 무언가 관련이있을 수 있습니다. 나는 그것에 초점을 맞출 것이다.
cregox

세 번째 요점은 상속에 대한 구성을 장려하지 않으며, 이것이 전체적으로 최선의 선택이더라도 상속을 옵션으로 완전히 제거합니다.
Michael Shaw

코드베이스를 제어하는지 여부에 따라 다릅니다. 수업을 봉인하면 나중에 필요할 때 언제든지 봉인을 풀 수 있습니다.
Stephen

2

이 질문에는 객관적인 답변이 없으며 모든 것이 귀하의 관점에 달려 있다고 생각합니다.

한편으로, 어떤 사람들은 모든 것을 "개방"하기를 원하며 모든 것이 올바르게 작동하도록하는 부담은 수업을 확장하는 사람에게 있습니다. 이것이 기본적으로 클래스가 상속을받는 이유입니다. Java 메소드가 모두 기본적으로 가상 인 이유는 무엇입니까?

다른 한편으로, 일부는 기본적으로 모든 것을 닫고이를 여는 옵션을 제공하기를 원합니다. 이 경우, 그가 "공개"로 만드는 모든 것을 상상할 수있는 방식으로 안전하게 사용할 수 있도록 보장하는 것이 기본 클래스의 저자입니다. 이것이 C #에서 모든 메소드가 기본적으로 비 가상적이며 무시되도록 가상으로 선언해야하는 이유입니다. 또한 "공개"불이행을 우회하는 방법이 필요한 사람들을위한 것이기도합니다. 클래스 봉인 / 최종을 만드는 것과 같이, 그들은 클래스에서 파생 된 누군가가 자신의 클래스 디자인에 큰 문제를 겪기 때문입니다.


이게 더 좋아! 이것은 "사람들이 닫고 싶어서"좋은 이유 일 수 있습니다. 그리고 그것은 또한 질문에서 말하려고하는 것입니다 : C ++의 비 가상 클래스가 재정의 될 수있는 것처럼 보입니다. sealed캔트. 우리는 어떻게 그들로부터 물려받을 수 있습니까? 내가 읽을 수는 없습니다. 이제까지. 모르겠어요 나는 봉인에 대해 처음 들었으므로 지금이 주제에 대해 4 개월 동안왔다 갔다했습니다. 그리고 봉인 클래스에서 아무것도 수정 해야 할 때 여전히 올바른 방법을 모르겠습니다 . 그래서 "열기 옵션"이 보이지 않습니다!
cregox

4
이것이 C ++ 클래스 메소드가 기본적으로 가상이 아닌 이유는 아닙니다. 메서드를 가상으로 만들면 메서드 조회 테이블에 추가 오버 헤드가 있어야하며 C ++에는 기능을 원할 때 오버 헤드에 대해서만 비용을 지불한다는 철학이 있습니다.
Michael Shaw

@Ptolemy Ok, 나는 그것을 제거했다. 나는 사람들이 그것에 대해 불평하기 시작한다는 것을 알았 기 때문에 결코 그것을 써서는 안된다.
행복감

사람들이 기본적으로 닫힌 수업을 만들고 싶다고 주장하고 적극적으로 수업을 열어야한다면 빨대를 밟아야합니다.
Michael Shaw

IMO API와 관련하여 비공개 / 보호 / 공개 토론과 매우 유사합니다. 클래스를 제어하는 ​​사람, 클래스를 상속하려는 사람, 두 사람 간의 의사 소통 및 새 버전이 나오는 빈도에 따라 크게 달라집니다.
Darien

-2

C #에서 봉인 된 문제는 오히려 최종적인 것입니다. 7 년 동안의 C # 상용 개발에서 내가 사용한 유일한 장소는 조정 된 동작을 구현하기 위해 프레임 워크 클래스를 확장해야하는 합당한 이유가 있다고 생각하는 Microsoft .NET 클래스에서만 가능했으며 클래스가 봉인 되었기 때문에 .

사용 가능한 모든 가능한 방법에 대해 생각하고 그들 중 누구도 합법적이지 않다고 결정하는 수업을 작성하는 것은 불가능합니다. 마찬가지로 프레임 워크 보안이 상속되지 않는 클래스에 의존하는 경우 보안 디자인 결함이 있습니다.

결론적으로, 나는 봉인이 유용한 목적을 제공하지 않는다는 견해를 가지고 있으며, 지금까지 읽은 것은 그 견해를 바꾸지 않았습니다.

지금까지 봉인 된 것을 정당화하는 세 가지 주장이 있었음을 알 수 있습니다.

  1. 인수 1은 사람들이 클래스에서 상속 한 다음 내부를 제대로 이해하지 않고 해당 클래스의 내부에 대한 액세스 권한을 높일 때 버그의 원인을 제거한다는 것입니다.

  2. 인수 2는 Microsoft 클래스를 확장 한 다음 Microsoft가 해당 클래스에서 버그 수정을 구현하지만 해당 버그에 의존하는 경우 코드가 손상되고 Microsoft는 책임을지지 않으며 봉인되지 않습니다.

  3. 인수 3은 클래스의 개발자로서 클래스 디자인의 일부로 클래스를 확장 할 수 있는지 여부입니다.

인수 1은 최종 프로그래머가 내 코드를 사용하는 방법을 모른다는 주장 인 것 같습니다. 그럴 수도 있지만 여전히 객체 인터페이스에 액세스하도록 허용하면 객체를 사용하고 있으며 사용법을 이해하지 않고 전화를 걸고 있다는 사실이 여전히 유지되므로 그렇게 많은 피해를 줄 수 있습니다. . 이것은 봉인 필요성의 미미한 정당화입니다.

arg 2의 실제 기반이 어디에서 왔는지 이해합니다. 특히 Microsoft가 win32 api 호출에 대한 추가 OS 검사를 수행하여 잘못된 형식의 호출을 식별하면 Windows NT와 비교하여 Windows XP의 전반적인 안정성이 향상되었지만 Windows XP가 릴리스 될 때 많은 앱이 중단 된 단기 비용이 발생했습니다. Microsoft는 이러한 검사에서 '규칙'을 사용하여이 문제를 해결했습니다. 앱 X가 알려진 규칙 인이 규칙을 위반하면 알려진 버그

.NET 라이브러리에 버그가 있으면 해결 방법을 찾을 수밖에 없으며 Microsoft 픽스가 나올 때 가능성이 높기 때문에 인수 2는 최선의 방법으로 밀봉되어 있기 때문에 잘못된 주장입니다. 고장난 행동에 따른 해결 방법이 이제 깨졌습니다. 상속을 사용하거나 다른 추가 래퍼 코드를 사용 하여이 문제를 해결했는지 여부에 관계없이 코드가 수정되면 해결 방법이 중단됩니다.

인수 3은 그 자체를 정당화 할 수있는 물질이있는 유일한 주장입니다. 그러나 여전히 약합니다. 그것은 코드 재사용에 반대합니다.


2
/ me는 Microsoft에 전자 메일을 보냅니다. 클래스 X를 풀고 새로운 .NET 릴리스를 제공 할 수 있습니까? 내가 말했듯이, 상업 개발에서 봉인 된 수업을 본 유일한 시간은 그것을 풀 수 없었습니다.
Michael Shaw

6
It is impossible to write a class thinking about every possible way it could be used-이것이 바로 많은 Framework 클래스가 봉인 된 이유입니다. 따라서 누군가 클래스를 확장 할 수있는 모든 가능한 방법에 대해 생각할 필요가 없습니다.
Robert Harvey

5
봉인을 풀 수 있다면 봉인 할 점이 많지 않습니까?
Robert Harvey

2
@Ptolemy 사람들이 수업을 확장 할 수있게하는 기능 입니다. 상당한 양의 개발 노력을 소비하는 것. 그것은 수업의 저자가 노력을 정당화 할 수있는 잠재적 인 확장에서 충분한 이점을 볼 수 있다면 정당화 할 가치가있는 기능입니다. 그들이 노력을 정당화 할 수 없어서 유형과 사용자가 확장을 지원하도록 구축되지 않은 경우 유형을 확장하는 것을 방지하는 것이 중요합니다. 그렇지 않으면 기술적으로 유형을 확장 할 수는 있지만 제대로 작동하지 않을 때 당신은 그렇게합니다.
Servy

2
@Cawas : 당신은 어려워요.
Robert Harvey


-8

내 질문에 분명한 것처럼, 나는 여기 전문가가 아닙니다. 그러나 나는 sealed존재할 이유 도 없다.

코드 아키텍트가 인터페이스를 디자인하는 것을 돕기 위해 만들어진 것 같습니다. 야생에서 나가는 클래스를 작성하고 많은 사람들이 클래스를 상속 받으려면 해당 클래스의 항목을 수정하면 너무 많은 사람들이 클래스를 깨뜨릴 수 있습니다. 그래서 우리는 그것을 봉인하고 아무도 상속 할 수 없습니다. "문제 해결됨".

글쎄, "반점을 덮고 다른 점을 밝히는 것"처럼 보입니다. 그리고 그것은 심지어 문제를 해결하는 것이 아니라 단지 도구를 제거하는 것입니다 : 상속. 어떤 도구와 마찬가지로 많은 사용법이 있으며 불안정한 클래스에서 상속하는 것은 위험합니다. 그 위험을 감수 한 사람은 누구나 더 잘 알아야합니다.

키워드가있을 수 stable있으므로 사람들은 키워드 를 상속하는 것이 더 안전하다는 것을 알 것입니다.


2
"문제가 해결되었습니다"-정확합니다.
Robert Harvey

@RobertHarvey 다음 단락에서 설명한대로 해결되지 않았습니다.
cregox

8
수업을 확장 할 수 없기 때문에 화를냅니다. 그렇다고 sealed프레임 워크 디자이너에게는 유용한 도구가 아닙니다. 프레임 워크의 클래스는 블랙 박스 여야합니다. 클래스를 제대로 사용하기 위해 클래스의 내부에 대해 알 필요는 없습니다. 그러나 그것이 바로 상속이 요구하는 것입니다.
Robert Harvey

나는 그것이 유용하지 않다고 결코 말하지 않았다. 사용법이 보이지 않는다고 말하고 이유를 지적하십시오. 부탁 드려요, 그것을 사용해야 할 좋은 이유를주세요! "닫힌 디자인 패턴을 따르고 싶어"하더라도 괜찮습니다. 나는 그 이유를 분명히 밝히는 사람을 보지 못합니다.
cregox

7
좋은 이유는 봉인 된 클래스에서 상속을 지원할 필요가 없기 때문입니다.
Robert Harvey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.