문제

말하는 내가 있는 클래스를 의미를 수행 하나의 기능입니다.후을 수행하는 기능,그것은 파괴될 수 있습니다.이유가 있습아보세요 하나의 이러한 접근 방식은?

// Initialize arguments in constructor
MyClass myObject = new MyClass(arg1, arg2, arg3);
myObject.myMethod();

// Pass arguments to method
MyClass myObject = new MyClass();
myObject.myMethod(arg1, arg2, arg3);

// Pass arguments to static method
MyClass.myMethod(arg1, arg2, arg3);

되었다는 의도적으로 막연한 세부 사항에 대해하려고,대한 지침을 얻을 다른 상황입니다.그러나지 않았다 정말 마음에 간단한 라이브러리 함수가 수학을 좋아.random().나는 생각하고 더 많은 클래스를 수행하는 일부 특정,복잡한 작업이지만,필요(공개)방법 그것을 할 수 있습니다.

도움이 되었습니까?

해결책

내가 사용 유틸리티 클래스에 가득으로 정적인 방법입니다.그들은 훌륭한의 통합을 도우미는 방법을 것이라 그렇지 않으면 주위에 거짓말을 일으키는 중복 및 유지보수 지옥입니다.그들은 매우 쉽게 사용하여,아니한 인스턴스화,아니 처분,그냥'n'forget.나이 의식하지 못하는 시도를 만드는 서비스 지향 아키텍처는 많이-무국적자의 서비스는 자신의 직업과 다른 아무것도 있습니다.시스템으로 성장 그러나,드래곤이다.

다형성
말로는 우리가 방법 UtilityClass.SomeMethod 는 행복하게 버즈와 함께.우리는 갑자기 변경할 필요 기능에 약간 있습니다.대부분의 기능은 동일하지만,우리는 우리를 변경해야의 몇 가지 부분 그럼에도 불구하고.없었다는 정적 방법을 만들 수도 있다 유도체 클래스와 방법을 변경 내용으로 필요합니다.으로 정적 방법,우리가 할 수 없습니다.인 경우,우리는 그냥 기능을 추가하기 전 또는 후에,기존의 방법을 만들 수 있습니다 새로운 클래스고 호 중 하나 내부의 하나는 그냥니다.

인터페이스는 불황
정적 방법을 정의할 수 없습을 통해 인터페이스는 논리는 이유입니다.그리고 이후 우리가 이를 무시할 수 없음에 정적 방법,정체되는 클래스들은 쓸모 없을 때 우리는 전달해야 그들이 주위에 그들의 인터페이스입니다.이 렌더링하게 사용할 수 없는 정 클래스 전략의 일환으로 패턴이다.우리가 패치를 몇 가지 문제에 의해 전달하는 대신 대리자 인터페이스.

테스트
이것은 기본적으로 손으로 인터페이스는 불 위에서 언급된다.으로 우리의 능력의 교류 구현이 매우 제한적이,우리는 또한 문제를 교체 생산 코드를 테스트 코드입니다.다시,우리는 그들을 마무리 하지만 그것을 우리를 필요로 변경의 큰 부분의 코드를 받아들일 수 있는 래퍼는 대신 실제적인 개체입니다.

촉진 덩
정적으로 방법은 일반적으로 사용되는 유틸리티로 방법 및 유틸리티는 방법이 일반적으로 다른 목적으로,우리는 것이 신속하게 끝까지 함께 많은 클래스에 가득 비 응집 기능적으로,각 클래스가 있어야 하나의 목적에서 시스템입니다.내가 많은 오히려 다섯 번의 클래스로 그들의 목적은 제대로 정의되어 있습니다.

매개 변수 크리프
을 시작으로는 귀여운 및 무고한 정적 방법은 걸릴 수 있습니다 하나의 매개 변수입니다.으로 기능을 성장의 새로운 매개 변수가 추가됩니다.빨리 더 매개 변수에 추가되는 옵션이므로 우리가 만들의 오버로드 방법(또는 추가 기본값으로 지원하는 언어)에 적용합니다.오래 전에,우리는 방법이 있는 10 매개 변수입니다.첫 번째 세 가지가 정말 필요한 매개변수 4-7 은 선택사항입니다.하지만 경우 매개변수 6 을 지정하는 7-9 가득하는 데 필요한뿐만 아니라...우리는 만들어 클래스 단 하나의 목적은 무엇이 정체되는 방법았다,우리는 우리를 해결할 수 있는 이해에 필요한 매개변수에서 생성자 및 사용자가 설정한 옵션을 통해 값을 속성을 설정하는 방법에는 여러 개의 상호 의존적인 값을 동시에.또한,방법은 성장을 이 금액의 복잡성,그것은 가장 가능성이 될 필요에서 자신의 클래스입니다.

을 요구하는 소비자의 인스턴스를 만들어 클래스 이유 없
가장 일반적인 중 하나 인수,이유 수요는 소비자들이 우리의 클래스의 인스턴스를 만듭에 대한 호출이 하나의 방법을 하면서 사용하는 인스턴스에 대한 후?을 만들기 클래스의 인스턴스가 매우 매우 저렴한 작업에서 대부분의 언어,그래서 속도가 문제가 되지 않습니다.추가 코드의 라인 소비자에게는 저렴한 비용의 기초를 놓은 훨씬 더 많은 효율성 솔루션은 미래에.그리고 마지막으로,당신이 피하려는 경우 인스턴스를 만들기,단순히 작성하는 단일 랩퍼 클래스의 할 수있는 쉽게 다시 사용하지만 이것은 확인 요구 사항은 국적이 없습니다.지 않는 경우에 상태가 저장할 수 있습니다 여전히 만드는 정적 래퍼는 방법에는 모든 것을 처리하는 동안,당신은 모든 혜택을습니다.마지막으로,당신은 또한 만들 수 있다 클래스는 인스턴스화면 그것은 단일:MyWrapper.스는 반환하는 새로운 MyClass();

만 시스 거래에서의 절대성
물론,예외가 있을 내 싫어하는 정적의 방법입니다.진정한 유틸리티 클래스는 자세를 취하지 않는 모든 위험을 부풀리 우수 사례에 대한 정적 방법-시스템입니다.변환로 예입니다.프로젝트도 필요 없는 미래 유지보수,전체적인 아키텍처는 정말 아주 중요하지 않정적 또는 비 정적,정말 중요하지 않 개발 속도는,그러나입니다.

기준,표준,기준!
를 사용하여 인스턴스 방법을 억제하지 않에서 당신도를 사용하여 정적 방법,그리고 그 반대도 있습니다.로 거기에 뒤에 차별화 및 그것의 표준화되어 있습니다.아무것보다 더 찾을 통해 비즈니스 층 거대한 다른 구현 방법이 있습니다.

다른 팁

나는 정적 방식을 선호합니다. 클래스는 객체를 나타내지 않기 때문에 인스턴스를 만드는 것이 합리적이지 않습니다.

방법에만 존재하는 클래스는 정적으로 남겨 두어야합니다.

는 경우 이유가 없는 클래스의 인스턴스를 만들어 실행하기 위해 다음 함수를 사용하여 정적 구현합니다.왜 소비자로 이 클래스의 인스턴스를 만들 때 하나가 필요하지 않습니다.

저장할 필요가 없다면 상태 객체의 경우 처음에 그것을 인스턴스화 할 필요가 없습니다. 나는 당신이 매개 변수를 전달하는 단일 정적 메소드와 함께 갈 것입니다.

또한 수십 개의 관련이없는 정적 방법이있는 거대한 Utils 클래스에 대해 경고합니다. 이것은 서둘러 무질서하고 다루기 어려울 수 있습니다. 관련 방법이 거의없는 수업을 많이 갖는 것이 좋습니다.

정적 메소드 형식이 더 나은 옵션이라고 말합니다. 그리고 클래스를 정적으로 만들 것입니다. 그렇게하면 실수로 수업 인스턴스를 만드는 것에 대해 걱정할 필요가 없습니다.

나는 상황이 무엇인지 잘 모르겠지만, Arg1, Arg2 또는 Arg3이 속한 클래스 중 하나에서 방법으로 그것을 넣는 것을 보게 될 것입니다.이 클래스 중 하나가 방법.

제공된 정보에 따라 답변하기가 어렵다고 제안합니다.

내 장은 단지 하나의 방법을 가지고 있고 수업을 즉시 버리려면 모든 매개 변수를 가져 오는 정적 클래스로 만듭니다.

물론,이 하나의 방법에 대해 단일 클래스를 만들어야하는 이유를 정확히 말하기는 어렵습니다. 대부분의 가정과 같이 일반적인 "유틸리티 클래스"상황입니까? 또는 앞으로 더 많은 규칙 클래스를 구현하고 있습니까?

예를 들어, 해당 클래스를 플러그 가능하게하십시오. 그런 다음 하나의 메소드에 대한 인터페이스를 만들고 싶다면 모든 매개 변수를 생성자가 아닌 인터페이스로 전달하려고하지만 정적이되기를 원하지 않을 것입니다.

수업이 정적으로 만들 수 있습니까?

그렇다면, 나는 모든 하나의 기능 클래스를 넣을 '유틸리티'수업으로 만들 것입니다.

이 방법이 상태가없고 통과 할 필요가 없다면이를 정적으로 정의하는 것이 가장 합리적입니다. 메소드를 전달 해야하는 경우 사용을 고려할 수 있습니다. 대리자 다른 제안 된 접근법 중 하나가 아니라.

간단한 응용 프로그램 및 internal 도우미, 나는 정적 방법을 사용합니다. 구성 요소가있는 응용 프로그램의 경우 사랑합니다 관리 확장 성 프레임 워크. 다음은 API에서 찾을 수있는 패턴을 설명하기 위해 작성한 문서에서 발췌 한 내용입니다.

  • 서비스
    • an에 의해 정의되었습니다 I[ServiceName]Service 상호 작용.
    • 인터페이스 유형으로 내보내기 및 가져옵니다.
    • 단일 구현은 호스트 애플리케이션에 의해 제공되며 내부 및/또는 확장에 의해 소비됩니다.
    • 서비스 인터페이스의 메소드는 스레드 안전입니다.

고안된 예로 :

public interface ISettingsService
{
    string ReadSetting(string name);

    void WriteSetting(string name, string value);
}

[Export]
public class ObjectRequiringSettings
{
    [Import]
    private ISettingsService SettingsService
    {
        get;
        set;
    }

    private void Foo()
    {
        if (SettingsService.ReadSetting("PerformFooAction") == bool.TrueString)
        {
            // whatever
        }
    }
}

나는 단지 생성자에서 모든 것을 할 것입니다. 그렇게 :

new MyClass(arg1, arg2, arg3);// the constructor does everything.

또는

MyClass my_object(arg1, arg2, arg3);

고려해야 할 또 다른 중요한 문제는 시스템이 멀티 스레드 환경에서 실행 중인지 여부와 정적 메소드 또는 변수를 갖는 것이 스레드 안전인지 여부입니다 ...

시스템 상태에주의를 기울여야합니다.

상황을 모두 피할 수 있습니다. 당신이 얻을 수 있도록 리팩터를 시도하십시오 arg1.myMethod1(arg2, arg3). 더 의미가있는 경우 Arg2 또는 Arg3로 Arg1을 바꾸십시오.

Arg1 클래스를 통제 할 수없는 경우 장식하십시오.

class Arg1Decorator
    private final T1 arg1;
    public Arg1Decorator(T1 arg1) {
        this.arg1 = arg1;
    }
    public T myMethod(T2 arg2, T3 arg3) {
        ...
    }
 }

 arg1d = new Arg1Decorator(arg1)
 arg1d.myMethod(arg2, arg3)

추론은 OOP에서 데이터를 처리하는 데이터 및 방법 처리가 함께 속해 있다는 것입니다. 또한 Mark가 언급 한 모든 장점을 얻습니다.

클래스의 속성이나 클래스 인스턴스가 생성자 나 방법에서 사용되지 않으면 방법이 '정적'패턴과 같이 설계되지 않는 것이 좋습니다. 정적 방법은 항상 '도움말'방식으로 생각해야합니다.

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