문제

정적 기능을 언제 사용 해야하는지, 언제 ASP.NET에 있지 않습니까?

성능과 같은 다양한 측면에서, 모범 사례 등 (그리고 더 많은 것이 관련이 있다고 생각하는 것)을 사용하는 데있어 장점과 단점은 무엇입니까?

도움이 되었습니까?

해결책

단점 :

  • 스레딩 문제 (정적 함수는 인스턴스를 호출 할 필요가 없으므로 코드의 다른 부분에서 쉽게 호출 할 수 있으며 공유 상태로 읽거나 쓰면이 상태가 멀티 스레드 환경에서 손상 될 수 있습니다. asp.net과 같은
  • 단위 테스트가 어렵습니다 (정적 함수가 객체 인스턴스가 필요하지 않으므로 생성자 주입이 불가능하다는 의미입니다.

장점 :

  • 성능 (이것은 의심 스럽다 - 대부분의 경우 성능 이득은 코드의 다른 부분에 비해 완전히 무시할 수 있습니다).

다른 팁

모든 응용 프로그램과 마찬가지로 정적이 적절한 솔루션 인 상황이 분명히 있습니다. 요청 범위가 아닌 애플리케이션 범위에서 살아야 할 객체가있을 때마다 정적이어야하며 정적 메소드를 사용하여 액세스하고 조작해야합니다.

예를 들어, 다음은 ASP.NET 응용 프로그램에 대해 최근에 쓴 코드 스 니펫이 있습니다. 시리얼 라이저는 생성 비용이 많이 들며 응용 프로그램이 살아남는 한 유형 당 동일한 유형을 재사용 할 수 있으므로 각 요청 스레드에서 시간을 낭비 할 필요가 없습니다.

(메모: 이것은 정적 측면을 보여주기 위해 제거되었습니다)

public class XmlSerializerUtility
{
    private static Dictionary<Type, XmlSerializer> serializers = new Dictionary<Type, XmlSerializer>();
    private static object sync = new object();

    public static T Deserialize<T>(string input)
    {
       XmlSerializer xs = GetSerializer(typeof(T));
        using (StringReader sr = new StringReader(input))
        {
            return (T)xs.Deserialize(sr);
        }
    }

    public static XmlDocument Serialize(object input)
    {
        XmlDocument doc = new XmlDocument();
        XmlSerializer xs = GetSerializer(input.GetType());
        using (MemoryStream stream = new MemoryStream())
        {
            xs.Serialize(stream, input);
            stream.Position = 0;
            doc.Load(stream);
        }
        return doc;
    }

    private static XmlSerializer GetSerializer(Type type)
    {
        lock (sync)
        {
            XmlSerializer xs = null;
            if (!serializers.ContainsKey(type))
            {
                xs = new XmlSerializer(type);
                serializers.Add(type, xs);
            }
            else
            {
                xs = serializers[type];
            }
            return xs;
        }
    }
}

정적 방법의 유일한 주요 단점은 거의 전적으로 단위가 아닌 테스트 가능하다는 것입니다. 이 방법의 사용자는 콘크리트 방법에 결합해야하며 추상화에 결합 할 수 없으므로 불가능하지는 않더라도 가짜 또는 조롱을 어렵게 만듭니다.

그러나 코드에 따라 문제가 될 수도 있고 아닐 수도 있습니다.

당신이 조심하고 싶은 또 다른 것은 정적 데이터가 서버에 대한 모든 요청에서 보편적이라는 것입니다.

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