와플 제목에 대해 죄송합니다. 간결한 제목을 제시 할 수 있다면 질문을 할 필요가 없습니다.
불변 목록 유형이 있다고 가정하십시오. Foo(x)
지정된 인수를 가진 새로운 불변 목록을 끝에 추가 요소로 반환 하는 작업 이 있습니다. 따라서 "Hello", "immutable", "world"값으로 문자열 목록을 작성하려면 다음과 같이 작성할 수 있습니다.
var empty = new ImmutableList<string>();
var list1 = empty.Foo("Hello");
var list2 = list1.Foo("immutable");
var list3 = list2.Foo("word");
(이것은 C # 코드이며 언어가 중요하다고 생각되면 C # 제안에 가장 관심이 있습니다. 근본적으로 언어 질문은 아니지만 언어의 관용구가 중요 할 수 있습니다.)
중요한 것은 기존의 목록이된다는 것입니다 하지 에 의해 변경 Foo
때문에 - empty.Count
여전히 0을 반환합니다.
최종 결과를 얻는 또 다른 (관용적) 방법은 다음과 같습니다.
var list = new ImmutableList<string>().Foo("Hello")
.Foo("immutable")
.Foo("word");
내 질문은 : Foo의 가장 좋은 이름은 무엇입니까?
편집 3 : 나중에 공개 할 때 유형의 이름이 실제로는 아닐 수도 ImmutableList<T>
있으므로 위치가 명확 해집니다. 대신 TestSuite
프레임 워크의 일부가 불변이기 때문에 불변이라고 상상해보십시오 .
(편집 3 끝)
지금까지 내가 생각해 낸 옵션 :
Add
: .NET에서 일반적이지만 원래 목록의 변형을 의미합니다.Cons
: 나는 이것이 기능적 언어에서 일반적인 이름이라고 생각하지만 그러한 언어를 경험하지 않은 사람들에게는 의미가 없다.Plus
: 지금까지 내가 가장 좋아하는 것은 나에게 돌연변이 를 암시하지 않습니다 . 분명히 이것은 Haskell 에서도 사용 되지만 약간 다른 기대치가 있습니다 (Haskell 프로그래머는 다른 목록에 단일 값을 추가하는 대신 두 목록을 함께 추가 할 것으로 기대할 수 있습니다).With
: 다른 불변의 규칙과 일치하지만 IMO에 대한 "추가 성"은 동일하지 않습니다.And
: 매우 설명 적이 지 않습니다.- +에 대한 연산자 과부하 : 나는 정말로 이것을 좋아하지 않습니다. 나는 일반적으로 연산자가 하위 유형에만 적용되어야한다고 생각합니다. 그래도 설득 될 것입니다!
선택에 사용하는 기준은 다음과 같습니다.
- 메소드 호출 결과에 대한 올바른 인상을줍니다 (예 : 추가 요소가있는 원래 목록 임)
- 기존 목록을 변경하지 않도록 최대한 명확하게합니다.
- 위의 두 번째 예와 같이 함께 연결하면 합리적으로 들립니다
충분히 명확하지 않은 경우 자세한 내용을 문의하십시오 ...
편집 1 : 여기 선호에 대한 내 추론의 Plus
에 Add
. 다음 두 줄의 코드를 고려하십시오.
list.Add(foo);
list.Plus(foo);
(이 내 시야에서 입니다 개인 것), 후자는 분명히 버그 - 그것은 서면 같다 "X + 5;" 그 자체로 진술로. 첫 번째 줄은 불변이라는 것을 기억할 때까지 괜찮습니다. 실제로 더하기 연산자가 피연산자를 변경하지 않는 방식 Plus
이 내가 가장 좋아하는 또 다른 이유 입니다. 연산자 오버로드가 약간 심하지 않으면 피연산자 (또는이 경우 메소드 대상)를 변경하지 않는 것을 포함하여 여전히 동일한 의미를 내포합니다.
편집 2 : 좋아하지 않는 이유 추가.
다양한 답변을 효과적으로 있습니다 : "이동 추가로 그 무엇. DateTime
수행하고 String
있다 Replace
명백한 불변성을하지 않는 방법 등." 동의합니다-우선 순위가 있습니다. 사람들이 전화의 그러나, 나는 많이 보았다 DateTime.Add
또는 String.Replace
과 돌연변이를 기대합니다 . "당신은 반환 값을 무시하고 있습니다 String.Replace
; 문자열은 불변이며, 새로운 문자열이 반환됩니다."
지금, 나는이 질문에 대한 미묘한를 공개한다 - 유형 수 없는 사실은 불변의리스트하지만, 다른 불변의 유형합니다. 특히, 스위트에 테스트를 추가하고 새로운 스위트를 만드는 벤치마킹 프레임 워크를 개발 중입니다. 다음이 분명 할 수 있습니다.
var list = new ImmutableList<string>();
list.Add("foo");
아무것도 달성하지 못하지만 다음과 같이 변경하면 훨씬 어두워집니다 .
var suite = new TestSuite<string, int>();
suite.Add(x => x.Length);
괜찮을 것 같습니다. 나에게 이것은 실수를 더 명확하게 만듭니다.
var suite = new TestSuite<string, int>();
suite.Plus(x => x.Length);
그것은 단지 구걸하고 있습니다 :
var suite = new TestSuite<string, int>().Plus(x => x.Length);
이상적으로는 사용자에게 테스트 스위트가 변경 불가능하다는 것을 알리지 않기를 바랍니다. 나는 그들이 성공의 구덩이에 빠지기를 원합니다. 이 수 할 수없는,하지만 난 노력하고 싶습니다.
불변 목록 유형에 대해서만 이야기함으로써 원래 질문을 지나치게 단순화 한 것에 대해 사과드립니다. 모든 컬렉션이 ImmutableList<T>
:) 만큼 자기 설명 적이지는 않습니다.