개인 필드가 인스턴스가 아닌 유형의 개인 필드 인 이유는 무엇입니까?


153

C # (및 다른 많은 언어)에서는 동일한 유형의 다른 인스턴스의 개인 필드에 액세스하는 것이 완벽합니다. 예를 들면 다음과 같습니다.

public class Foo
{
    private bool aBool;

    public void DoBar(Foo anotherFoo)
    {
        if (anotherFoo.aBool) ...
    }
}

애즈 C # 1 명세 (섹션 3.5.1, 3.5.2) 전용 필드 액세스 타입이 아닌 경우에 말한다. 동료 와이 문제를 논의하고 있으며 동일한 인스턴스에 대한 액세스를 제한하는 대신 이와 같이 작동하는 이유를 생각해 냈습니다.

우리가 생각해 낼 수있는 가장 좋은 주장은 클래스가 다른 인스턴스와의 동등성을 결정하기 위해 개인 필드에 액세스하려는 동등성 검사입니다. 다른 이유가 있습니까? 아니면 이런 식으로 작동해야한다는 것을 의미하는 황금의 이유 또는 완전히 불가능한 것입니까?


18
대안의 장점은 무엇입니까?
Jon Skeet

19
실제 세계를 잘 모델링하지 않는 것은 사실입니다. 결국, 내 차가 얼마나 많은 가스를 남겼는지보고 할 수 있다고해서 내 차가 모든 차가 얼마나 많은 가스를 남겼는지 알 수있는 것은 아닙니다. 예, 이론적으로 "개인 인스턴스"액세스 권한이있는 것을 볼 수 있습니다. 99 %의 경우에는 다른 인스턴스가 해당 변수에 액세스해야한다고 걱정하기 때문에 실제로는 절대 사용하지 않을 것이라고 생각합니다.
aquinas

2
@Jon 소위 '혜택'을 위해 취해진 입장은 같은 유형이라는 사실에 관계없이 클래스가 다른 인스턴스의 내부 상태를 알 수 없다는 것입니다. 말 당 이익은 아니지만 다른 것을 선택해야 할 꽤 좋은 이유가있을 수 있으며 이것이 우리가 알아 내려고 한 것입니다.
RichK

4
당신은 항상 경우 실패 할, 생성자에서 초기화 게터 / 세터 폐쇄 한 쌍의에 변수를 만들 수 있습니다 가 ... 초기화 도중이었다 동일하지 않습니다
마틴 Sojka는

8
Scala는 인스턴스 프라이빗 멤버를 제공 하며 Java, C # 및 기타 여러 언어에는없는 다른 액세스 수준과 함께 제공 됩니다. 이것은 완전히 합법적 인 질문입니다.
Bruno Reis

답변:


73

이 방법이 작동하는 한 가지 이유는 액세스 수정자가 컴파일 타임에 작동하기 때문이라고 생각 합니다 . 따라서 주어진 객체가 현재 객체 인지 여부를 결정하는 것은 쉽지 않습니다. 예를 들어 다음 코드를 고려하십시오.

public class Foo
{
    private int bar;

    public void Baz(Foo other)
    {
        other.bar = 2;
    }

    public void Boo()
    {
        Baz(this);
    }
}

컴파일러가 반드시 other 가 실제로 사실을this ? 모든 경우에 해당되는 것은 아닙니다. 컴파일 할 수 없다고 주장 할 수는 있지만 올바른 인스턴스의 프라이빗 인스턴스 멤버 액세스 할 수없는 코드 경로가 있음을 의미 합니다.

객체 수준 가시성보다는 유형 수준 만 요구하면 문제를 다루기 쉬워지고 상황을 해야 작동 실제로 일을.

편집하다 : Danilel Hilgarth의 주장은이 추론이 거꾸로된다는 장점이 있습니다. 언어 디자이너는 원하는 언어를 만들 수 있으며 컴파일러 작성자는이를 준수해야합니다. 즉, 언어 디자이너는 컴파일러 작성자가 작업을보다 쉽게 ​​수행 할 수 있도록 인센티브를 제공합니다. (비록이 경우, 개인 회원이 다음 수 있다고 주장 쉬운 충분 단지 를 통해 액세스 할 this) 암시 적 또는 명시 적으로 ().

그러나 나는 그것이 문제를 필요 이상으로 혼란스럽게 만듭니다. 대부분의 사용자 (자신 포함)는 위의 코드가 작동하지 않으면 불필요하게 제한합니다. 결국 데이터 내가 액세스하려고 해요! 왜 통과 this해야합니까?

간단히 말해, 컴파일러가 "어려운"사례를 과장했을 수도 있습니다. 내가 실제로 극복하려는 것은 위의 상황이 디자이너가 작업하고 싶어하는 것처럼 보인다는 것입니다.


33
IMHO,이 추론은 잘못된 길입니다. 컴파일러는 언어 규칙을 시행합니다. 그것들을 만들지 않습니다. 즉, private 멤버가 "private type"이 아닌 "instance private"인 경우 컴파일러는 다른 인스턴스 일 수 있기 때문에 허용 만 허용 this.bar = 2하지 않는 다른 방법으로 구현되었을 것 입니다. other.bar = 2other
Daniel Hilgarth

@Daniel 좋은 지적이지만, 앞에서 언급했듯이 제한 수준을 갖는 것이 클래스 수준의 가시성을 갖는 것보다 더 나쁠 것이라고 생각합니다.
dlev

3
@ dlev : "인스턴스 개인"멤버가 좋은 것이라고 생각하는지 여부에 대해서는 아무 말도하지 않았습니다. :-) 나는 단지 당신이 기술적 구현이 언어의 규칙을 지시하고 내 의견으로는,이 주장이 맞지 않다고 주장하고 있다고 지적하고 싶었다.
Daniel Hilgarth

2
@ 다니엘 포인트 촬영. 나는 여전히 이것이 유효한 고려라고 생각하지만, 궁극적으로 언어 디자이너가 원하는 것을 알아 내고 컴파일러 작성자가 그것을 준수한다는 것은 옳습니다.
dlev

2
컴파일러 인수가 보유하고 있다고 생각하지 않습니다. Ruby와 같은 인스턴스 전용 만 허용하고 에펠과 같은 인스턴스 전용 및 클래스 전용을 허용하는 언어가 있습니다. 이러한 언어에는 컴파일러 생성이 더 어렵거나 더 쉬울 필요가 없었습니다. 자세한 내용은 스레드 아래의 답변도 참조하십시오.
Abel

61

C # 및 유사한 언어에서 사용되는 캡슐화 의 목적이 * 코드의 다른 조각 (C # 및 자바 클래스), 메모리에없는 다른 개체의 상호 의존도를 낮출 수있다.

예를 들어, 한 클래스에서 다른 클래스의 일부 필드를 사용하는 코드를 작성하면 이러한 클래스는 매우 밀접하게 연결됩니다. 그러나 동일한 클래스의 두 객체가있는 코드를 처리하는 경우 추가 종속성이 없습니다. 수업은 항상 그 자체에 달려 있습니다.

그러나 캡슐화에 대한이 모든 이론은 누군가가 속성을 작성하거나 Java에서 get / set 쌍을 작성하고 모든 필드를 직접 노출하는 즉시 실패하므로 클래스가 마치 필드에 액세스하는 것처럼 결합됩니다.

* 캡슐화 종류에 대한 설명은 Abel의 탁월한 답변을 참조하십시오.


3
일단 get/set메소드가 제공 되면 실패한다고 생각하지 않습니다 . 접근 자 메서드는 여전히 추상화를 유지합니다 (사용자는 뒤에 필드가 있거나 속성 뒤에 어떤 필드가 있는지 알 필요가 없습니다). 예를 들어 Complex클래스를 작성하는 경우 극좌표를 가져 오거나 설정하기위한 속성과 직교 좌표를위한 또 다른 get / set을 노출 할 수 있습니다. 클래스가 어떤 클래스를 사용하는지는 사용자에게 알려지지 않았습니다 (전혀 다른 것일 수도 있음).
Ken Wayne VanderLinde

5
@Ken : 노출해야하는지 여부를 고려하지 않고 모든 단일 필드에 속성을 제공하면 실패합니다.
Goran Jovic

@Goran 이상적이지는 않다는 데 동의하지만 기본 필드가 변경되는 경우 get / set 접근자가 추가 논리를 추가 할 수 있기 때문에 여전히 완전히 실패하지는 않습니다.
ForbesLindesay

1
"캡슐화의 목적은 서로 다른 코드 조각의 상호 의존성을 낮추는 것 입니다. " >> no. 캡슐화는 인스턴스 캡슐화를 의미 할 수도 있으며, 언어 또는 생각하는 학교에 따라 다릅니다. OO에서 가장 확실한 목소리 중 하나 인 Bertrand Meyer는이를 기본값으로 간주합니다 private. 당신이 좋아한다면 사물에 대한 나의 견해에 대한 내 대답을 확인할 수 있습니다.).
Abel

@ Abel : OP가 클래스 중 하나에 대해 물었 기 때문에 솔직히 클래스 캡슐화를 사용하는 언어에 대한 대답을 기반으로했으며 솔직히 알고 있기 때문에 솔직했습니다. 수정과 새로운 흥미로운 정보에 감사드립니다!
Goran Jovic

49

이 흥미로운 실에 이미 몇 가지 답변이 추가되었지만 이 행동이 왜 그런지에 대한 진정한 이유를 찾지 못했습니다 . 시도해 보겠습니다.

옛날에

80 년대의 스몰 토크와 90 년대 중반의 자바 사이에서 객체 지향의 개념이 발전했다. 원래 OO에서만 사용할 수있는 개념으로 생각되지 않은 정보 숨기기 (1978 년에 처음 언급 됨)는 클래스의 모든 데이터 (필드)가 개인용이므로 모든 방법이 공개되므로 스몰 토크에 도입되었습니다. 90 년대 OO의 많은 새로운 개발 과정에서 Bertrand Meyer는 그의 획기적인 책 OOSC (Object Oriented Software Construction) 에서 OO 개념의 상당 부분을 공식화하려고 시도했습니다. )에서 OO 개념과 언어 설계에 대한 (거의) 결정적인 참조로 간주 된 .

개인의 가시성의 경우

Meyer에 따르면 정의 된 클래스 세트 (192-193 페이지)에 메소드를 사용할 수 있어야합니다. 이것은 분명히 매우 세분화 된 정보 숨기기를 제공하며, 클래스 A 및 클래스 B 및 모든 하위 항목에 다음 기능을 사용할 수 있습니다.

feature {classA, classB}
   methodName

의 경우에는 private그 다음은 말한다 : 명시 적으로 자신의 클래스에 볼 수와 같은 유형을 선언하지 않고, 당신이 액세스 할 수없는 자격을 갖춘 호출 기능 (방법 / 필드) 그. 즉 x, 변수 인 경우 x.doSomething()허용되지 않습니다. 물론 클래스 자체 내에서 무단 액세스가 허용됩니다.

다시 말해, 같은 클래스의 인스턴스에 의한 액세스를 허용하려면 해당 클래스에 의한 메소드 액세스를 명시 적으로 허용해야합니다. 이를 인스턴스 전용 대 클래스 전용이라고도합니다.

프로그래밍 언어의 인스턴스 전용

클래스 개인 정보 숨기기와는 달리 인스턴스 개인 정보 숨기기를 사용하는 현재 사용중인 두 개 이상의 언어를 알고 있습니다. 하나는 Meyer가 디자인 한 언어 인 Eiffel으로 최대한의 OO를 필요로합니다. 다른 하나는 오늘날 훨씬 더 일반적인 언어 인 루비입니다. 루비에서 "이 인스턴스에 대한 개인 정보"를private 의미합니다. .

언어 디자인을위한 선택

인스턴스 전용을 허용하는 것이 컴파일러에게는 어렵다고 제안되었습니다. 나는 자격있는 메소드 호출을 허용하거나 허용하지 않는 것이 비교적 간단하기 때문에 그렇게 생각하지 않습니다. 개인 방법의 경우 doSomething()허용되며x.doSomething() 되지 않는 경우 언어 디자이너는 개인용 메서드 및 필드에 대한 인스턴스 전용 액세스 가능성을 효과적으로 정의합니다.

기술적 인 관점에서 볼 때 어떤 방법이든 다른 방법을 선택해야 할 이유가 없습니다 (Eiffel.NET이 IL을 사용하여이 작업을 수행 할 수 있다고 생각할 때 (여러 상속에도 불구하고이 기능을 제공하지 않는 고유 한 이유는 없습니다)).

물론 그것은 취향의 문제이며 다른 사람들이 이미 언급했듯이 개인 메서드와 필드에 대한 클래스 수준의 가시성이 없으면 일부 메서드를 작성하는 것이 더 어려울 수 있습니다.

C #에서 클래스 캡슐화 만 허용하고 인스턴스 캡슐화는 허용하지 않는 이유

인스턴스 캡슐화에서 인터넷 스레드를 살펴보면 (언어가 클래스 수준이 아니라 인스턴스 수준에서 액세스 수정자를 정의한다는 사실을 나타내는 데 사용되는 용어 인 경우가 종종 있음) 개념이 찌그러집니다. 그러나 일부 현대 언어는 적어도 개인 액세스 수정 자에 대해 인스턴스 캡슐화를 사용한다는 점을 고려하면 현대 프로그래밍 세계에서 사용할 수 있고 사용 중이라고 생각합니다.

그러나 C #은 언어 디자인을 위해 C ++ 및 Java를 가장 열심히 살펴 보았습니다. Eiffel과 Modula-3도 그림에 있지만 Eiffel missing (다중 상속)의 많은 기능을 고려할 때 개인 액세스 수정 자에 관해서는 Java 및 C ++와 동일한 경로를 선택했다고 생각합니다.

당신이 Eric Lippert, Krzysztof Cwalina, Anders Hejlsberg 또는 C # 표준에서 일한 다른 사람을 잡아야 하는 이유 를 알고 싶다면 . 불행히도 주석 달린 C # 프로그래밍 언어 에서 명확한 메모를 찾을 수 없습니다 .


1
즉 배경의 많은 사랑스러운 대답하는 (상대적으로) 오래된 질문에 응답하는 시간을내어 매우 흥미로운, 감사
RichK

1
@RichK : 천만에요. 너무 늦었을 것 같아요.하지만 깊이에 반응하기에 충분한 주제를 찾았습니다. :)
Abel

COM에서 "private"은 "instance-private"를 의미합니다. 클래스의 정의가 Foo인터페이스와 구현 클래스를 효과적으로 표현 했기 때문에 이것이 어느 정도 측정 된 것이라고 생각합니다 . COM에는 클래스 객체 참조라는 개념이 없었기 때문에 (인터페이스 참조) 클래스가 해당 클래스의 다른 인스턴스가 될 수있는 것에 대한 참조를 보유 할 수있는 방법은 없었습니다. 이 인터페이스 기반 디자인은 성가신 일 이었지만 동일한 내부를 공유하지 않고도 다른 클래스로 대체 할 수있는 클래스를 디자인 할 수있었습니다.
supercat December

2
좋은 대답입니다. OP는이 질문에 답을 표시하는 것을 고려해야합니다.
Gavin Osborn

18

이것은 내 의견 일 뿐이지 만 실제적으로 프로그래머가 클래스의 소스에 액세스 할 수 있으면 클래스 인스턴스의 비공개 멤버에 액세스하여 클래스를 합리적으로 신뢰할 수 있다고 생각합니다. 프로그래머들이 왼쪽에 이미 왕국 열쇠를 주었을 때 오른손을 묶는 이유는 무엇입니까?


13
나는이 주장을 이해하지 못한다. 귀하 가 유일한 개발자이고 귀하가 라이브러리를 사용하는 유일한 사람인 프로그램을 개발하고 있다고 가정 해 봅시다 .이 경우 소스 코드에 액세스 할 수 있기 때문에 모든 회원을 공개하고 있습니까?
aquinas

@ aquinas : 그것은 상당히 다릅니다. 모든 것을 공개하면 끔찍한 프로그래밍 관행으로 이어질 것입니다. 유형이 다른 인스턴스 자체의 개인 필드를 볼 수 있도록 허용하는 것은 매우 좁은 경우입니다.
Igby Largeman

2
아니요, 모든 회원을 공개적으로 주장하는 것은 아닙니다. 천국 아니야! 내 주장은 이미 소스에 있다면 비공개 멤버, 멤버의 사용법, 사용 된 규칙 등을 볼 수 있으며 그 지식을 사용할 수없는 이유는 무엇입니까?
FishBasketGordo

7
나는 사고 방식이 여전히 유형의 측면에 있다고 생각합니다. 유형이 해당 유형의 멤버를 올바르게 처리 할 수없는 경우 무엇을 할 수 있습니까? ( 일반적으로 , 실제로 상호 작용을 제어하는 ​​프로그래머가 될 것이지만,이 시대의 코드 생성 도구에서는 항상 그런 것은 아닙니다.)
Anthony Pegram

3
내 질문은 실제로 신뢰가 아니고 더 많은 것이 필요합니다. 신뢰는 사물에 유쾌한 것을 반영 할 수있을 때 전혀 관련이 없습니다. 개념적으로 개인에게 액세스 할 수있는 이유가 궁금합니다. 모범 사례가 아닌 논리적 인 이유가 있다고 가정했습니다.
RichK

13

실제로 평등 검사, 비교, 복제, 연산자 과부하 등이 이유입니다. 예를 들어 복잡한 숫자에 operator +를 구현하는 것은 매우 까다로운 작업입니다.


3
그러나 언급 한 모든 유형에는 다른 유형의 가치를 얻는 한 유형이 필요합니다. 나는 당신이 내 개인 상태를 검사하고 싶다고 말하고 있습니다. 알았어 내 개인 상태 를 설정 하시겠습니까? 안돼, 친구, 자신의 망할 상태를 바꾸지 마라. :)
aquinas

2
@aquinas 그것은 그렇게 작동하지 않습니다. 필드는 필드입니다. 선언 된 경우에만 읽기 전용 readonly이며 선언 인스턴스에도 적용됩니다. 분명히 이것을 금지하기 위해 특정 컴파일러 규칙이 있어야한다고 주장하지만 그러한 모든 규칙은 C # 팀이 사양화, 문서화, 현지화, 테스트, 유지 관리 및 지원 해야하는 기능입니다. 강력한 혜택이 없다면 왜 그렇게할까요?
Aaronaught

@Aaronaught에 동의합니다. 모든 새로운 사양을 구현하고 컴파일러를 변경하는 데 드는 비용이 있습니다. 설정된 시나리오의 경우 복제 방법을 고려하십시오. 물론 개인 생성자를 사용하여 실현하고 싶을 수도 있지만 일부 시나리오에서는 가능하지 않을 수도 있습니다.
Lorenzo Dematté

1
C # 팀? 나는 단지 모든 언어에서 가능한 이론적 언어 변화에 대해 토론하고 있습니다. "더 강력한 효과가 없다면 ..."내가 거기 생각할 수있다 혜택합니다. 그냥와 같은 어떤 컴파일러 보증, 누군가는 유용한 클래스는 자신의 상태를 수정하는 것을 보장하기 위해 찾을 수 있습니다.
aquinas

@aquinas : 그들이 있기 때문에 기능이 구현받을 수 있습니다 에게 유용한 많은 또는 대부분의 사용자 - 그들이 때문이 있습니다 일부 고립 된 경우에 유용합니다.
Aaronaught

9

우선, 비공개 정적 멤버는 어떻게됩니까? 정적 메소드로만 액세스 할 수 있습니까? 당신은 확실히 그것을 원하지 않을 것입니다. 왜냐하면 당신은 당신 const의 에 액세스 할 수 없기 때문 입니다.

명백한 질문에 대해서는의 경우를 StringBuilder링크 된 인스턴스 목록으로 구현 한 경우를 고려하십시오 .

public class StringBuilder
{
    private string chunk;
    private StringBuilder nextChunk;
}

자신의 클래스의 다른 인스턴스의 비공개 멤버에 액세스 할 수 없으면 다음 ToString과 같이 구현해야합니다 .

public override string ToString()
{
    return chunk + nextChunk.ToString();
}

이것은 작동하지만 O (n ^ 2)입니다-그리 효율적이지 않습니다. 실제로, 그것은 아마도 StringBuilder수업을 처음부터 시작 한다는 전체 목적을 상실했을 것입니다 . 자신의 클래스의 다른 인스턴스의 개인 멤버에 액세스 할 수있는 경우 ToString적절한 길이의 문자열을 만든 다음 문자열의 해당 위치에 각 청크의 안전하지 않은 복사본을 수행하여 구현할 수 있습니다 .

public override string ToString()
{
    string ret = string.FastAllocateString(Length);
    StringBuilder next = this;

    unsafe
    {
        fixed (char *dest = ret)
            while (next != null)
            {
                fixed (char *src = next.chunk)
                    string.wstrcpy(dest, src, next.chunk.Length);
                next = next.nextChunk;
            }
    }
    return ret;
}

이 구현은 O (n)이므로 매우 빠르며 클래스의 다른 인스턴스의 비공개 멤버에 액세스 할 수있는 경우에만 가능합니다 .


예, 그러나 일부 필드를 내부로 노출하는 것과 같은 다른 방법은 없습니까?
MikeKulls

2
@ 마이크 : 같은 필드를 노출 internal차종이 민간! 결국 클래스의 내부를 어셈블리의 모든 것에 노출시킵니다.
Gabe

3

이것은 많은 언어에서 완벽하게 합법적입니다 (하나는 C ++). 액세스 수정자는 OOP의 캡슐화 원칙에서 비롯됩니다. 아이디어는 외부 액세스를 제한하는 것입니다 .이 경우 outside는 다른 클래스입니다. 예를 들어 C #의 중첩 클래스는 부모 개인 멤버도 액세스 할 수 있습니다.

이것은 언어 디자이너를위한 디자인 선택이지만. 이 액세스의 제한은 엔터티의 격리에 많은 기여를하지 않으면 서 매우 일반적인 일부 시나리오를 극도로 복잡하게 만들 수 있습니다.

비슷한 토론이 있습니다


1

데이터가 각 인스턴스 전용 인 다른 수준의 프라이버시를 추가 할 수없는 이유가 있다고 생각하지 않습니다. 실제로, 그것은 언어에 대한 완전한 느낌을 제공 할 수도 있습니다.

그러나 실제로는 실제로 그렇게 유용하지 않을 것입니다. 당신이 지적했듯이, 우리의 일반적인 사적 성은 평등 검사와 같은 것들뿐만 아니라 유형의 여러 인스턴스를 포함하는 대부분의 다른 작업에 유용합니다. 그러나 OOP에서 중요한 점이므로 데이터 추상화 유지 관리에 대한 귀하의 요점도 마음에 듭니다.

그런 식으로 액세스를 제한하는 기능을 제공하면 OOP에 추가 할 수있는 좋은 기능이 될 수 있습니다. 정말 유용한가요? 클래스가 자체 코드를 신뢰할 수 있기 때문에 아니오라고 말하고 싶습니다. 해당 클래스는 개인 멤버에 액세스 할 수있는 유일한 항목이므로 다른 클래스의 인스턴스를 처리 할 때 데이터 추상화가 필요한 이유는 없습니다.

물론 프라이빗이 인스턴스에 적용되는 것처럼 항상 코드 작성할 수 있습니다 . get/set데이터를 액세스 / 변경 하려면 일반적인 방법을 사용하십시오 . 클래스가 내부 변경의 대상이 될 수 있다면 코드 관리가 더 쉬워 질 것입니다.


0

위에 주어진 훌륭한 답변. 이 문제의 한 부분은 클래스 자체를 인스턴스화하는 것이 처음부터 허용된다는 사실입니다. 예를 들어, 재귀를 끝내는 논리가있는 한 재귀 논리 "for"루프에서 해당 유형의 트릭을 사용합니다. 그러나 이러한 루프를 만들지 않고 동일한 클래스를 인스턴스화하거나 내부에 전달하면 널리 사용되는 프로그래밍 패러다임이더라도 논리적으로 자체 위험이 발생합니다. 예를 들어 C # 클래스는 기본 생성자에서 자체 복사본을 인스턴스화 할 수 있지만 규칙을 위반하거나 인과 관계 루프를 만들지는 않습니다. 왜?

BTW .... 같은 문제가 "보호 된"구성원에게도 적용됩니다. :(

프로그래밍 패러다임은 여전히 ​​완전한 문제와 위험이 수반되기 때문에이 문제와 같은 문제가 발생하여 사람들을 혼동하고 개인 멤버를 갖는 모든 이유를 무시할 때까지 대부분의 프로그래머가 완전히 이해하지 못하기 때문에 프로그래밍 패러다임을 완전히 받아들이지 않았습니다.

C #의이 "이상하고 별난"측면은 좋은 프로그래밍이 경험과 기술과 관련이없는 또 하나의 이유이지만, 차에서 일하는 것과 같은 속임수와 함정을 아는 것입니다. 규칙이 깨 졌다는 주장은 모든 컴퓨팅 언어에 매우 나쁜 모델입니다.


-1

데이터가 동일한 유형의 다른 인스턴스에 대한 개인 정보 인 경우 더 이상 동일한 유형일 필요는 없습니다. 다른 인스턴스와 동일하게 동작하거나 작동하지 않는 것 같습니다. 해당 개인 내부 데이터를 기반으로 동작을 쉽게 수정할 수 있습니다. 그것은 내 의견으로는 혼란을 퍼뜨릴 것입니다.

느슨하게 말해서, 나는 개인적으로 기본 클래스에서 파생 된 클래스를 작성하면 '인스턴스 당 개인 데이터가 있음'으로 설명하는 것과 유사한 기능을 제공한다고 생각합니다. 대신 '고유 한'유형마다 새로운 클래스 정의가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.