Martin Fowler의 Refactoring book 에서 일반적인 코드 냄새에 대해 읽고 있습니다. 그런 맥락에서, 나는 코드베이스에서보고있는 패턴에 대해 궁금해했고, 객관적으로 패턴을 반 패턴으로 간주 할 수 있었다.
패턴은 하나 이상의 메소드에 대한 인수로 오브젝트가 전달되는 패턴으로, 모두 오브젝트의 상태를 변경하지만 오브젝트를 리턴하는 것은 없습니다. 따라서 C # /. NET의 참조 특성에 따라 패스에 의존합니다.
var something = new Thing();
// ...
Foo(something);
int result = Bar(something, 42);
Baz(something);
나는 (특히 메소드의 이름이 적절하게 지정되지 않은 경우) 객체의 상태가 변경되었는지 이해하기 위해 그러한 메소드를 조사해야합니다. 여러 수준의 콜 스택을 추적해야하므로 코드 이해가 더 복잡해집니다.
새로운 상태의 다른 (복제 된) 객체 또는 콜 사이트에서 객체를 변경하는 데 필요한 모든 것을 반환하도록 이러한 코드를 개선하고 싶습니다.
var something1 = new Thing();
// ...
// Let's return a new instance of Thing
var something2 = Foo(something1);
// Let's use out param to 'return' other info about the operation
int result;
var something3 = Bar(something2, out result);
// If necessary, let's capture and make explicit complex changes
var changes = Baz(something3)
something3.Apply(changes);
나에게 그것은 첫 번째 패턴이 가정에서 선택되는 것처럼 보입니다.
- 작업이 적거나 코드 줄이 더 적습니다.
- 그것은 모두 변화 오브젝트에 우리를 할 수 있다는 및 정보의 다른 조각을 반환
- 인스턴스 수가 적으므로 더 효율적입니다
Thing
.
대안을 설명하지만 제안하려면 원래 솔루션에 대한 논쟁이 필요합니다. 원래 솔루션이 반 패턴이라는 주장을 할 수있는 주장이 있다면 무엇입니까?
그리고 대체 솔루션에 어떤 문제가 있습니까?