C #의 개인 정적 메소드가 어떤 문제를 겪습니까?


10

클래스에서 여러 번 발생하는 특정 유효성 검사에 대한 개인 유효성 검사 방법을 만들었습니다 (여러 가지 이유로 유효성 검사 데이터를 저장할 수 없음). 이제 ReSharper는 함수를 정적으로 만들 수 있다고 제안합니다. 정적 메서드와 관련된 알려진 문제로 인해 약간 꺼려합니다. 그것은 것입니다 개인 정적 방법. 내 질문은 개인 정적 메서드가 공용 정적 메서드와 같은 유사한 커플 링 및 테스트 문제를 일으킬 수 있습니까? 나쁜 습관입니까? 나는 추측하지 않을 것이지만 여기에 함정이 있는지 확실하지 않습니다.


10
정적 메소드의 "알려진 문제점"은 무엇입니까?
Robert Harvey

3
@Ed : 그렇습니다. 올바르게 작성된 정적 메소드는 외부 API 또는 상태를 건드리지 않아야합니다. 클래스 내에서 캡슐화 된 내부 상태를 조작하는 것은 나에게 완벽하게 보입니다. 단위 테스트는 클래스의 외부 동작을 테스트하기 때문에 단위 테스트가 필요하지 않습니다.
Robert Harvey

1
정적 메서드는 전역 상태를 수정하는 경향이 있으며 상속도 중단합니다 (기능을 확장 할 때마다 파생 클래스의 메서드를 재정의 할 수 없으므로 호출 코드를 수정해야 함). 당신은 그 하나의 구현에 묶여 있습니다. 정적 메서드는 조롱 할 수 없으므로 단위 테스트가 매우 어렵습니다. 그들은 의존성을 숨 깁니다 . 나는 더 많은 것이 확신합니다. 맹목적으로 피하는 것이 아니라 정보에 입각 한 결정을 내리는 것입니다.
Tamás Szelei

2
@ Tamás 정적 메소드는 절대 그렇게하지 않으면 전역 상태를 수정합니다. 일반적으로 유틸리티 클래스에서는 정적 메서드, 하나 이상의 개체를 가져와 부작용없이 개체를 반환하는 메서드 만 사용합니다. 이러한 종류의 방법에는 설명 할 문제가 없습니다.
Robert Harvey

1
@ TamásSzelei 어떻게 글로벌 상태를 수정하는 경향이 있습니까? 매개 변수에 전달하지 않으면 전역 상태를 찾을 수도 없습니다.
코드 InChaos

답변:


16

"이걸 테스트해야합니까?"라고 생각합니다.

어쨌든 메서드가 비공개 인 경우 메서드 자체의 논리를 단위로 테스트하지 않으려는 경우 테스트 가능성과 유지 관리 가능성에 관한 한 클래스가 블랙 박스 인 경우 클래스의 내부 작업은 비즈니스입니다 그리고 그 혼자. 리팩토링 역시 영향을받지 않을 것입니다.

따라서 제 생각에는 : "개인"방법을 "개인 정적"으로 만들면 장기적인 영향이 없습니다.


17

필자의 관점에서 보면 개인 정적 메서드가 가장 쉬운 방법입니다.

DataIn-> 메소드-> DataOut

외부 객체에 대한 의존성, 부작용이 없습니다. 왜 그들을 나쁜 것으로 간주합니까?


감사합니다. 질문 아래의 의견에서 내 우려 사항을 설명했습니다.
Tamás Szelei

2
설명하는 내용은 정적 멤버 변수에 의존하지 않는 정적 메소드에 대해서만 정확합니다. 즉 "좋은"정적 메소드와 "나쁜"정적 메소드를 구별 할 수 있습니다.
Doc Brown

2

퍼블릭 정적 메소드 를 사용하는 클래스를 테스트하는 것은 어려울 수 있습니다. 정적 메소드를 스텁 / 가짜 / 모의하기가 쉽지 않기 때문입니다. 반면 인스턴스 메소드는 특히 가상이거나 인터페이스를 만족하는 경우 쉽게 조롱 할 수 있습니다.

그러나 개인 정적 메소드를 사용하지 않는 이유는 없습니다. 실제로 메모리를 차지하기 위해 클래스의 인스턴스가 필요하지 않기 때문에 약간의 성능 이점이 있습니다.

다른 손에 아무것도 정적 코드 냄새의 비트입니다. 이것이 실제로 "헬퍼 클래스"입니까? 메소드가 매개 변수로 전달 된 클래스 중 하나에 더 유용하게 존재할 수 있습니까? 이러한 질문에 대한 대답은 종종 "정적으로 괜찮습니다"지만 기억할 가치가 있습니다.


정적 메서드를 포함하는 클래스는 이미 메모리를 차지하고 있습니다. static키워드에 대한 당신의 두려움은 근거가없는 것 같습니다.
Robert Harvey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.