문제

나는 불변성 개념을 좋아하지만 때로는 응용 프로그램이 평행하지 않은 경우, 불변을 피해야하는 것을 피해야합니까?

응용 프로그램이 멀티 스레드가 아닌 경우 공유 상태 문제에 시달리지 않습니까?

아니면 불변성이 당신이 끝까지 사용하는 OOP와 같은 개념입니까? 사용/성능 등에 따라 불변이되어서는 안되는 경우를 제외합니다.

나는 나 자신을 위해 신청서를 작성할 때이 질문에 직면하고 있습니다. 그것은 적당히 큰 (아마도 1-2k 라인과 같습니다).

도움이 되었습니까?

해결책

나는 불변성을 좋아합니다. 왜냐하면 그것은 다른 사람들 코드를 믿을 필요가 없기 때문에 내가 동일하게 유지하기를 기대하는 물건을 엉망으로 만들지 않기 때문입니다.

객체를 다음과 같은 다른 구성 요소로 전달할 때 List<T>, 당신은 그 구성 요소가하는 일의 자비에 있습니다. 이것은 컬렉션을 속성으로 반환 할 때 특히 중요합니다.

public class Foo { 
  private List<Bar> _barList;
  public ICollection<Bar> BarList { get return _barList; } 
}

이 클래스의 소비자가 컬렉션을 내 아래에서 제거하는 것을 막는 것은 없습니다. 리턴 유형을 전환하더라도 IEnumerable<Bar> 완전히 안전하지는 않습니다. 나쁘게 쓰여진 코드의 일부가 이것을 다시 캐스팅하는 것을 막는 것은 없습니다. List<T> .clear ()를 호출합니다.

그러나 컬렉션이 일관성을 유지하기를 정말로 원한다면 다음과 같이 다시 쓸 수 있습니다.

public class Foo {
  private ImmutableCollection<Bar> _barList;
  public ImmutableCollection<Bar> BarList { get { return _barList; } }
}

이제 수업을 잘못 사용하여 다른 코드를 신뢰해야합니다. 그들은 그것을 엉망으로 만들 수 없습니다.

다른 팁

나는 불변성의 이점을 좋아한다. 그것은 실제로 큰 보너스입니다.

불변성의 주요 이점은 불변의 대상의 소유권을 추적 할 필요가 없다는 것입니다. 그들은 누군가가 필요로하는 한, 더 이상 필요하지 않을 때 아무것도 없어서 사라집니다. 많은 경우 쓰레기 수집가를 사용하는 동안 변한 물체의 소유권을 다루는 명시 적으로 코드를 작성할 필요는 없다는 것을 의미합니다 (가장 큰 예외는 구현하는 것입니다. IDisposable), 많은 경우에, 상태가있는 객체에 명확하게 정의 된 "소유자"가없는 올바른 코드를 작성하는 것은 매우 어렵습니다. 누가 돌연변이 가능한 물체의 상태를 소유하고 있는지에 대한 혼란은 매우 빈번한 버그의 원천이 될 수 있습니다. 불변의 물체를 사용할 때 (구현하는 몇 가지를 제외하고 IDisposable) 일반적으로 소유권 문제를 무시할 수 있습니다.

고려해야 할 또 다른 요점은 의미 적으로 상상할 수있는 대상에 대한 변이 가능한 참조 또는 변이성 객체에 대한 불변의 참조에 대해 추론하는 것이 훨씬 쉽다는 것입니다. 돌연변이 가능한 물체에 대한 변이 가능한 참조를 가지고 있다면 상태 업데이트에 대한 올바른 접근 방식이 단순히 객체를 직접 돌연변이하거나 상태를 새 개체에 복사하고 참조를 돌보고 참조를 업데이트하는 것이 불분명 할 수 있습니다. 경우에 따라 각 유형의 작업이 필요한 상황이 있습니다 ( List<T>, 때때로 배열을 더 큰 배열로 바꾸지 만 일반적으로 배열을 업데이트합니다) 그러나 이러한 접근 방식은 유형이 해당하는 변이 가능한 객체에 대한 독점적 인 제어를 유지하는 경우에만 작동합니다. 돌연변이 유형에 대한 불변의 참조를 갖는 것이 더 도움이됩니다 (이 경우 코드는 읽기 전용 래퍼를 통해 상태의 "라이브 뷰"를 원하는 다른 개체에 참조를 노출시킬 수 있음) 또는 그렇지 않으면 불변의 물체에 대한 돌연변이 가능한 참조는 참조의 수명 동안 결코 돌연변이되지 않습니다.

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