2008-10-16 5 views
9

웹 사이트 비즈니스 계층에서 정적 메서드를 사용할 때의 단점은 무엇입니까? 클래스를 인스턴스화 한 다음 클래스에서 메서드를 호출 할 때의 단점은 무엇입니까? 성능 중 어떤 결과가 나타 납니까?정적 방법의 단점은 무엇입니까?

답변

12

성능 차이는 무시할 수 있습니다.

정적 메서드를 사용하는 단점은 테스트하기가 어렵다는 것입니다. 종속성이 정적 메소드 호출로 표현되면, 그 의존성을 mocks/stub로 대체 할 수 없습니다. 모든 종속성이 인터페이스로 표현되고 구현이 구성 요소로 전달되는 경우 단위 테스트를 위해 구성 요소의 모의/스텁 버전을 사용하고 실제 구현 (실제 IoC 컨테이너로 연결될 수 있음) 전개.

+0

전역 변수 같다. System.Math 정적 클래스는 정적이 아닌 경우보다 테스트 할 만해 보이지 않습니다. 내가 틀렸어, Jon? –

+2

정적 메서드 자체를 테스트 할 수있는 것은 아닙니다. * 정적 메서드를 사용하는 것은 테스트 할 수없는 것입니다. 정적 메서드의 구현을 간단한 것으로 대체 할 수 없기 때문입니다. 예를 들어, 메서드가 데이터베이스에 도달하면 테스트도 수행됩니다. –

0

정적 데이터를 사용하는 메서드는 실제로 웹 응용 프로그램의 모든 사용자가 공유합니다.

코드 전용, 모든 시스템의 정적 메서드와 관련된 일반적인 문제 외의 실제 문제는 없습니다.

3

존 소총은 맞다 - 성능 차이가 크지 않을 것 ...

는 엔터프라이즈 응용 프로그램을 구축하는 경우, 내가 마이크로 소프트에 의해 신봉 전통적인 계층 접근 방식과 번호를 사용하는 것이 좋습니다 것이라고 말해 두 겠는데 다른 소프트웨어 회사. 간단히 설명해 드리겠습니다.

ASP.NET을 가장 익숙하게 사용하기 때문에 ASP.NET에서 사용하는 기술을 쉽게 이해할 수 있습니다.

응용 프로그램의 표현 계층은 표시 할 ASP.NET aspx 페이지와 "프로세스 제어"를위한 ASP.NET 코드 숨김으로 구성됩니다. 이것은 제출을 클릭 할 때 일어나는 일에 대해 이야기하는 멋진 방법입니다. 다른 페이지로 이동합니까? 유효성 검사가 있습니까? 정보를 데이터베이스에 저장해야합니까? 그 후에 어디로 가야합니까?

프로세스 제어는 표현 계층과 비즈니스 계층 간의 연락입니다. 이 레이어는 두 부분으로 나뉘어져 있습니다 (그리고 여기에 귀하의 질문이옵니다). 이 계층을 구현하는 가장 융통성있는 방법은 ProcessPayment, DeleteCustomer, CreateAccount 등과 같은 메소드가있는 비즈니스 논리 클래스 (예 : PaymentProcessing, CustomerManagement 등)를 가지는 것입니다. 이러한 메소드는 정적 메소드입니다.

위의 메서드가 프로세스 제어 계층에서 호출되면 비즈니스 개체 (예 : 고객, 송장, 지불 등)의 모든 인스턴스를 처리하고 적절한 비즈니스 규칙을 적용합니다.

비즈니스 개체는 데이터 계층과의 모든 데이터베이스 상호 작용을 처리합니다. 즉, 포함 된 데이터를 저장하는 방법을 알고 있습니다. 이는 MVC 패턴과 유사합니다.

그래서이게 무슨 이점이 있습니까? 여러 레벨에서 여전히 테스트 가능성을 얻습니다. UI를 테스트하고 적절한 데이터가있는 비즈니스 논리 클래스를 호출하여 비즈니스 프로세스를 테스트 할 수 있으며 비즈니스 개체를 수동으로 인스턴스화하고 메서드를 테스트하여 비즈니스 개체를 테스트 할 수 있습니다. 또한 데이터 모델 또는 개체가 변경되면 UI에 영향을 미치지 않고 비즈니스 논리 클래스 만 변경해야하며 비즈니스 논리가 변경되면 개체에 영향을주지 않고 해당 클래스를 변경할 수 있습니다.

희망 사항

3

정적 메서드를 사용하면 성능 저하가 없으므로 개체 생성/제거의 오버 헤드를 피할 수 있습니다. 일반적으로 중요하지 않습니다.

메서드가 수행하는 작업이 상태 (예 : 팩토리 메서드)와 관련이없는 경우에만 사용해야합니다.

String.Format(), TryParse() 및 Parse() 메서드는 정적 메서드가 의미가있는 경우의 좋은 예제입니다. . 그들은 항상 똑같은 것을 수행하고, 주를 필요로하지 않으며 매우 일반적이어서 인스 턴싱은 덜 합리적입니다.

반면에 (예를 들어, 모든 상태를 메서드에 모든 인수를 전달해야하는 등) 10 개의 인수를 사용하면 모든 것이 복잡해지고 유지 관리가 쉽지 않으며 읽기 쉽고 적게됩니다. 존이 말했듯이 이것이 비즈니스 계층이나 코드의 다른 부분에 관한 것이라면 관련이 없다고 생각합니다. 단지 상황을 정당화 할 때만 사용하십시오.

+1

"다른 객체 인스턴스를 인스턴스화하기 위해 객체 인스턴스를 생성하는 것은 합리적이지 않습니다 .-- 누군가에게 모조 적이거나 플러그 가능한 방식으로 특정 유형의 인스턴스를 작성하는 방법을 알려주는 경우에 해당합니다. 그것이 공장 패턴입니다. –

+0

팩토리 메서드 패턴에 대해 말하고 있습니다 ... –

0
  1. 테스트 용이성은 정적 종속성
  2. 스레딩 덜 테스트 할 수 있습니다 : 당신은
  3. 디자인 동시성 문제를 가질 수 있습니다 : 정적 변수는 상황에 따라 다르다
관련 문제