2010-01-29 7 views
8

일부 코드를 리팩토링 중이며 HFile이라는 클래스를보고 있습니다. HFile에는 모든 private 생성자가 있으므로 실제로 인스턴스를 만들 수 없습니다. 다음과 같이 HFiles 인스턴스를 만드는 대신 :정적 메서드 과용을 피하기위한 팁

var file = new HFile('filename') 
file.Save() 

모든 HFile 상호 작용은 정적 메서드를 통해 처리됩니다. 그래서 파일을 저장하고 싶다면 다음과 같이 호출합니다 :

HFile.save('filename') 

그리고 나서 내부적으로 HFile의 인스턴스가 만들어지고 저장됩니다. 분명히 모든 이야기를 알지 못해도 어떤 독자라도 판단을해야하지만 정적 인 방법을 사용하는 것이 우리 일에 매우 유행이 된 것 같습니다. 그래서 정적 인 방법의 사용법에 대한 좋은 원칙이나 모범 사례가 있는지 궁금 해서요. 사람들의 그룹에 앉아서 정적 방법의 사용법을 검토하는 데 도움이 될 수 있습니다.

+3

태그에 언어 또는 플랫폼을 넣는 것이 좋습니다. –

답변

5

일반적으로 상황에 국가 또는 조직 구조의 캡슐화가 필요한 경우 클래스를 사용하게됩니다.

한편, 교차 관심사이며 응용 프로그램 전반에 광범위하게 사용할 수있는 것이 있으면 정적 유틸리티 클래스에서 메서드를 고려할 수 있습니다. .NET Framework (및 Java)의 System.Math이 이에 대한 예입니다.

예를 들어, HFile은 아마도 상태가있는 개체 일 수 있으므로 일반적으로 정적 메서드를 사용하여 저장하지 않습니다. 저장하는 정적 메서드에 전체 개체를 전달하지 않고 특정 HFile 개체에 대해 메서드 호출을 만드는 것이 더 간단합니다. 특정 애플리케이션에서 이것이 의미가 있는지 없는지는 애플리케이션의 패러다임이 HFile 객체를 외부 메쏘드가 전달하고 처리 할 수있는 객체로 간주하는지 아니면 자체 저장 가능한 독립형 객체로 간주하는지에 따라 달라집니다.

5

정적 메서드는 모방 할 수 없기 때문에 테스트하기가 어렵습니다. 이런 이유로 우리는 일하는 곳에서 그들을 피하는 경향이 있습니다. 우리는 공장 방법으로 사용하지만.

+0

정적 팩터 리 메서드가 모든 의존성을 인스턴스화하는 클래스 (예 : Guice @Provides 메서드)에서 사용할 수 있다는 것을 추가하고 싶습니다. 그러나 일반 정적 메서드를 사용하는 것처럼 일반 코드에서 정적 팩터 리 메서드를 사용하면 테스트 가능성이 떨어집니다. 특정 구현을 사용하여 코드를 잠그고 종속성을 조롱하지 못하도록합니다. – MageWind

2

이것은 매우 객체 지향적이지 않습니다. 이제 당신의 장소는 OO 코드를 정말로 좋아하지 않을 것입니다. 그러나 데이터와 메서드를 캡슐화하려면 해당 데이터를 처리 할 인스턴스 메서드가 필요합니다.

많은 정적 메서드가 많은 전역 변수와 관련되어 있습니다. 예 : 정적 HFile.save ('filename')를 호출하려는 경우 파일 이름에 저장하려고하는 정보가 전역이어야합니다. 일반적으로 우리는 일들을보다 관리하기 쉽도록 전역을 줄이려고 노력합니다.

하지만 절차 코드를 작성하려면 괜찮습니다.

+1

정적 메서드는 훌륭한 로더를 만듭니다 (팩터드 메서드의 한 유형). 또한 리소스 잠금을 사용하여 다른 프로세스를 보류하는 것을 피하는 것이 매우 유익하다는 것을 알았습니다. –

10

정적 메서드/정적 클래스는 절차 형 코드의 증상으로 개체 지향 언어로 절차 코드를 작성하는 증상입니다. 이런 종류의 사고를 없애기 위해 내가 아는 가장 좋은 방법은 객체 지향 원칙과 관행을 철저히 이해하는 것입니다. 정적 클래스에 대한 테스트를 작성하는 것이 훨씬 어렵 기 때문에 테스트 주도 개발을 사용하고 코드를 테스트 할 수 있도록하면 도움이됩니다. 결국, TDD를 사용하면 테스트 고통을 덜어주기 위해 자연스럽게 더 분리 된 OO 아키텍처쪽으로 끌어 당깁니다.

+1

정적 상태를 유지하지 않으면 정적 메서드에 대한 테스트를 작성하는 것이 가장 쉽습니다. –

+2

@RobertHarvey 부작용이없고 종속성이없는 순수한 함수이거나 모든 종속성이 매개 변수로 주어지면 사실입니다. 나는 정직하게 그렇게 많은 수업을 보지 않는다. 또한, 다른 클래스에있는 사람들을 사용하는 것은 사용에 대한 의존성을 제거해야 할 경우 매우 어려울 수 있습니다. 이는 테스트 가능성을 강조한 이후로 내가 많이 볼 수없는 이유 일 수 있습니다. – tvanfosson

+0

이것들은 내가 쓰는 정적 메서드의 유일한 종류입니다. 대표적인 예를 보려면 .NET 프레임 워크의 Math 클래스를 살펴보십시오. –

2

IMO 정적 방법은 직장에서 흔히 사용하는 목적으로는 유용하지 않습니다. 이 메서드의 단점 :
- 파일 하나를 호출하기 위해 파일을 나타내는 개체를 만드는 점은 무엇입니까?클래스의 기능에 관련된 일을 수행하는 유틸리티 메소드가 아니라 -
: -
인터페이스 기반 다형성

, 여기에 내가 정적 인 방법을 사용하는 것이 어떤 경우는 귀하의 질문에 대답하기 위해 사용할 수 없습니다 어느 한 대상에게. 아마도 객체 배열을 비교하여 비교합니다. 아마도 일부 일반적인 데이터 조작 (변환 등)을 수행합니다.
- 당신은 클래스 변수와 클래스 관련 물건을 할 필요가
- 내가 무엇에 대해 마찬가지로 당신은 내가 너무 많은 정적 메소드의 수에 대해 걱정하지 않을 싱글 톤 디자인 패턴

3

을 구현하려는 경우 이 방법들은하고있다. 값을 반환하거나 인수로 전달한 객체를 수정하는 정적 메서드입니까? 별거 아니야. 개인 정적 필드를 수정하는 정적 메서드? 나는 걱정. 다른 클래스에 속한 공용 정적 필드를 수정하는 정적 메서드입니까? 나는 이마에 습기 찬 수건으로 어두운 방에 누워있을 필요가있다.

+0

동의합니다. 나는 개인적으로 정적 변수를 수정하기 위해 정적 메서드를 사용할 필요가 전혀 없거나 다른 정적 클래스보다 훨씬 더 나쁜 정적 변수를 만들 필요가 전혀 없습니다. –