나는 이것이 해롭다고 생각한다
ISet<T>
는 곧 발생할 재난으로 코드 냄새로 간주되고 해로운 것으로 간주되어야 한다.그런데 왜요?Nanos gigantum humeris insidentes
If I have seen further it is by standing on the shoulders of Giants. -- Isaac Newton
I say with Didacus Stella, a dwarf standing on the shoulders of a giant may see farther than a giant himself. -- Diego de Estella
만약 우리가 기존의 생각을 반복해서 사용한다면, 우리는 그 위에 있는 모든 지식 라이브러리 위에 세울 수 있다.우리는 자이언트 위에 서서 더 멀리 볼 수 있다.
그렇다면 우리는 기존의 생각과 자료 라이브러리에 입각할 수 있는가?네Set Theory와Set Algebra입니다.이러한 생각을 반복적으로 사용하는 과정에서 우리는 이전 사람들이 발견한 모든 함정, 모든 오류, 모든 진보와 해결 방안의 기초 위에서 계속 전진할 수 있다.
ISet<T>
그렇게 할 수 있을까?아뇨.어디
ISet<T>
에 문제가 생겼어요?다른 일을 하기 전에, 나는 집합이 무엇인지 먼저 알아야 할 것 같다.집합은 하나의 집합이다. 그 중에서 모든 원소는 한 번만 존재하고 원소의 순서에 무관심하며 내부 구조가 어떠한지 무관심하다.그것은 장면 속의 내용에만 관심을 갖는다.이 점
ISet<T>
만으로도 평가할 수 있다.하지만 그게 전부는 아니다.집합은 본질적으로 변하지 않는다.모든 짝수의 집합을 고려하다.집합에 새로운 숫자를 추가할 이유가 없습니다. 왜냐하면 집합에는 항상 모든 짝수가 포함되어 있기 때문입니다.그럼 왜
ISet<T>
제공 Add()
합니까?이것 괜찮아요?고려 사항:ISet<Int32> evens = new HashSet<Int32>(new Int32[] { 2, 4, 6, 8...});
Assert.False(evens.Contains(1)); // passes
_ = evens.Add(1);
Assert.False(evens.Contains(1)); // fails
잠깐만, 왜 이게 허락이야?우리는 방금 집합의 의미를 위반했다!그러나 이것은 우리가 집합의 의미를 위반할 수 있는 유일한 곳이 아니다.아, 아니요.
ISet<Color> primaryColors = new HashSet<Color>(new Color[] { Color.Red, Color.Yellow, Color.Blue });
ISet<Color> printerColors = new HashSet<Color>(new Color[] { Color.Cyan, Color.Magenta, Color.Yellow, Color.Black });
primaryColors.UnionWith(printerColors);
Assert.False(primaryColors.Contains(Color.Magenta)) // fails
양홍색은 원색이 아니다!왜 이러지?너는 UnionWith()
의 서명과 요약만 보면 원인을 알 수 있다.public void UnionWith(IEnumerable<T> other);
Modifies the current set so that it contains all elements that are present in the current set, in the specified collection, or in both.
그러나 이것은 아직 이야기의 결말이 아니다.Set Algebra, 당신이 익숙한 Abstract Algebra처럼 신분이라는 개념이 있는데 이것은 그것의 운영에 매우 중요하다.그것들은 공중 집합(⑥)과 우주 집합(U)이다.항등식이 없는 집합 대수를 시도해 보세요. 0과 1이 없는 추상적인 대수를 시도해 보세요!
그 밖에 Algebraic Number Theory는 하나
ISet<T>
로 코드 냄새만 있는 상황이 아니라 나중에 재구성하기가 어려워진다. 비록 그 자체가 문제지만.세부적인 유출이 이루어졌기 때문에 leaky abstraction은 다른 어떤 제품과 같은 집합이라는 것을 알고 있습니다.왜 그래?문제는 ISet<T>
조작에서 즉각 나타났다.모든 원색의 칭찬을 고려해 보자.이것은 세 가지 원색 중 하나가 아닌 모든 색을 포함하는 집합이다.너의 메모리는 틀림없이 다 쓸 거야!무한한 색깔이 있어요!비록 우리가 컴퓨터에서 표시할 수 있는 24비트 색만 사용하더라도, 일부 고급 색 공간에서 더 많은 양을 사용하더라도, 이것은 분배16,777,216 - 3
색 구조를 의미하며, 각각 32비트씩 536,870,816
비트나 67,108,852
바이트의 메모리에 사용된다는 것을 의미한다.나는 너의 상황을 모르겠지만, 나는 컴퓨터 한 대를 장착할 수 없다.compliment
뭘까
ISet<T>
의 문제는 ISet<T>
에서 비롯된 것이고 ICollection<T>
자체에 문제가 있다. 왜냐하면 모든 소장품의 공통점에 대해 잘못된 가설을 했기 때문이다.집합은 단지 이러한 가설을 위반하는 영역 중의 하나일 뿐이다.대신 집합은 가능한 한 정해진Set Theory과Set Algebra와 일치해야 한다.이것은 집합의 기본적인 의미가 당연하다는 것을 확보할 뿐만 아니라 발견과 발표의 이용Set Theory과 Set Algebra의 해결 방안은 어려운 문제에 직면한 프로그래머에게 쉽게 채택될 수 있을 뿐만 아니라 특별 이론과 특별 대수를 사용하여 새로운 해결 방안을 풀 수 있다. 특별 대수는 발견되지 않은 문제로 가득 차 있을 수 있다.
나는 줄곧 Collectathon에서 이 일을 해 왔다. 이것은 내가 이달 초(2020년 9월)에 다시 시작한 프로젝트이다.본고까지 생성된 코드는 아직 제출되지 않았다. 왜냐하면 나는 예상한 대수 연산을 충실하게 하고 있기 때문이다. 그러나 실현과 인터페이스는 매우 즐겁고 실제로는 상당히 간단하다.그 밖에 앞에서 언급한 바와 같이 개념적으로도 하나의 집합이다. 넓은 의미의 집합 기반을 실현할 때 간소화할 수 있고 간단하게
Set
에서 파생함으로써 전체 집합 대수를 자동으로 제공할 수 있다.이것은 코드를 다시 사용하는 아주 좋은 예이다.다시 한 번:
If I have seen further it is by standing on the shoulders of Giants. -- Isaac Newton
Reference
이 문제에 관하여(나는 이것이 해롭다고 생각한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/entomy/iset-t-considered-harmful-2hpd텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)