기능이 "순수한"경우 아무런 문제가 없습니다. 순수한 기능은 입력 매개 변수에서만 작동하며이를 기반으로 결과를 제공합니다. 전역 상태 나 외부 컨텍스트에 의존하지 않습니다.
자신의 코드 예제를 보면 :
public class Class1
{
public static string GetSomeString()
{
// do something
}
}
이 기능에는 매개 변수가 없습니다. 따라서 순수한 것은 아닙니다 (이 함수의 유일한 순수한 구현은 상수를 반환하는 것입니다). 나는이 예제가 실제 문제를 대표하지 않는다고 가정합니다. 이것은 아마도 순수한 기능이 아니라고 지적합니다.
다른 예를 보자.
public static bool IsOdd(int number) { return (number % 2) == 1; }
이 함수가 정적 인 것은 아무 문제가 없습니다. 우리는 이것을 확장 기능으로 만들어서 클라이언트 코드를 더 읽기 쉽게 만들 수 있습니다. 확장 함수 는 기본적으로 특별한 종류의 정적 함수입니다.
Telastyn은 동시성을 정적 멤버의 잠재적 인 문제로 올바르게 언급합니다. 그러나이 함수는 공유 상태를 사용하지 않으므로 여기에는 동시성 문제가 없습니다. 수천 개의 스레드가 동시성 문제없이이 함수를 동시에 호출 할 수 있습니다.
.NET 프레임 워크에서 확장 메서드는 꽤 오랫동안 존재했습니다. LINQ 에는 많은 확장 함수 (예 : Enumerable.Where () , Enumerable.First () , Enumerable.Single () 등)가 포함되어 있습니다. 우리는 이것들을 나쁜 것으로 보지 않습니까?
단위 테스트는 코드가 대체 가능한 추상화를 사용하는 경우에 도움이되므로 단위 테스트는 시스템 코드를 테스트 이중으로 대체 할 수 있습니다. 정적 함수는 이러한 유연성을 금지하지만 이는 실제 데이터 액세스 계층을 가짜 데이터 액세스 계층 으로 대체하려는 아키텍처 계층 경계에서 주로 중요 합니다.
그러나 어떤 숫자가 홀수인지 짝수인지에 따라 다르게 동작하는 객체에 대한 테스트를 작성할 때 실제로 IsOdd()
함수를 대체 구현 으로 대체 할 필요는 없습니다 . 마찬가지로 Enumerable.Where()
테스트 목적으로 다른 구현 을 제공해야하는 시점도 알 수 없습니다 .
이 함수에 대한 클라이언트 코드의 가독성을 살펴 보자.
옵션 a (확장 메소드로 선언 된 함수 포함) :
public void Execute(int number) {
if (number.IsOdd())
// Do something
}
옵션 b :
public void Execute(int number) {
var helper = new NumberHelper();
if (helper.IsOdd(number))
// Do something
}
정적 (확장) 함수는 첫 번째 코드 조각을 훨씬 더 읽기 쉽게 만들고 가독성은 중요하므로 정적 함수를 사용하십시오.