문제

캘리 레이트 유형을 정의하는 클래스가 있습니다. 파일에서 데이터를 읽어 여러 클래스 인스턴스를 만들 수있는 기능을 추가해야합니다.

수업 콜 레이트에 정적 메소드를 추가하여 반환합니다. List<CallRate>. 클래스가 자체 생성자 중 하나를 호출하여 새로운 인스턴스를 생성해도 괜찮습니까? 그것은 효과가 있습니다. 나는 그것이 올바른 일인지 궁금합니다.

List<CallRates> cr = CallRates.ProcessCallsFile(file);
도움이 되었습니까?

해결책

정적 방법에서 자체의 물체를 얻는 것은 완벽합니다.

예를 들어

도트 넷 라이브러리 중 하나는 당신과 같은 일을합니다.

XmlReadrer reader = XmlReader.Create(filepathString);

다른 팁

물론 괜찮습니다. 심지어 어떤 경우에는 권장됩니다. 몇 가지가 있습니다 객체 생성을 다루는 디자인 패턴, 그리고 그들 중 일부는 당신이 묘사하는 것만합니다.

매개 변수의 유효성을 확인해야 할 때 종종이 패턴을 사용합니다. 생성자로부터 예외를 던지는 것은 강력하게 낙담합니다. 공장 방법에서 나쁘지 않거나 NULL을 반환하도록 선택할 수 있습니다.

나에게 괜찮아 보인다. 다른 언어에서는 아마도 함수를 작성할 수 있지만 C#과 같은 언어에서는 정적 메소드가 그 역할을 수행합니다.

괜찮아요. 방금 만든 것은 간단한 공장 방법과 같습니다. 유효한 유형의 인스턴스를 생성하는 정적 메소드가 있습니다. 실제로 방법은 정적 일 필요조차 없으며 여전히 유효한 코드가 있습니다. 기존 객체에서 새로운 유효한 객체를 만드는 디자인 패턴 (프로토 타입)이 있습니다. 세부 사항을 참조하십시오 http://www.dofactory.com/patterns/patternprototype.aspx.

물론, 간단한 구문 분석 (또는 유사한) 시나리오의 경우 - 실제로 선호하다 그만큼 공장 방법 수업의 일부가 되십시오. 예 - 파손됩니다 SRP, 그러나 그것은 충족됩니다 키스 - 그래서 나는 그것을 순 승리라고 부릅니다. 더 큰 앱 또는 더 복잡한 구문 분석 루틴의 경우 외부 공장 클래스가되는 것이 더 합리적입니다.

당신의 특별한 경우에, 나는 아마도 ienumerable을 취한 방법을 선호 할 것입니다.u003Cstring> 파일 이름 대신에, 여전히 구문 분석 논리를 제공하지만 쉬운 단위 테스트와 "재사용"을 허용합니다. 발신자는 파일을 쉽게 ienumerable으로 랩핑 할 수 있습니다.

공장 방법은 종종 좋은 디자인입니다. C#에 글을 쓸 때, 나는 그것들을 '신규'라고 부릅니다.

new MyClass()

becomes

MyClass.New()

사소한 것은 다음과 같이 구현됩니다.

class MyClass
{
    public static MyClass New()
    {
        return new MyClass();
    }
}

대부분 수업을 생성 할 것인지 돌아올 지에 대한 추가 조건이있을 때 대부분이 작업을 수행합니다. null, 또는 돌아올지 여부 MyClass 또는 그것에서 파생 된 것.

때때로 생성자 과부하의 대안으로 공개 정적 방법을 사용합니다.

특히 매개 변수 유형에만 의존하는 것이 좋지 않은 상황에서 어떤 종류의 객체 구성이 의도 된지를 나타냅니다.

나는 위에서 많은 시간을 제안한 것처럼 정적 메소드 리턴 인스턴스를 갖는 팬입니다.

@paul : 위의 의견을 똑딱 거리는 것을 잊지 마십시오. 가장 좋은 답변입니다.

"자체 생성자 중 하나를 호출하여 새로운 인스턴스를 생성하는 것"을 지적하고 싶습니다.

그것은 생성자가 아니라 정적 방법에서 나온 것입니다.

나는 일반적으로 클래스의 즉각적인 구현이 필요할 때 이것을 사용합니다. 예를 들어

    public class Car
    {
        public static Car RedExpensiveCar = new Car("Red", 250000);

        public Car()
        {

        }

        public Car(string color, int price)
        {
            Color = color;
            Price = price;
        }

        public string Color { get; set; }
        public int Price { get; set; }
    }

이를 통해 코드에서 생성자 매개 변수를 기억하거나 작성할 필요가 없습니다.

Car car = Car.RedExpensiveCar;

이 작업을 수행하는 것은 완벽하게 수용 가능합니다. 내가 할 때, 나는 일반적으로 클래스 개인의 실제 생성자를 비공개로 만들어서 인스턴스를 구성하는 방법은 정적 메소드를 통해입니다.

이것은 "구성"이 항상 새 인스턴스를 반환하지 않을 수있는 경우에 매우 유용합니다. 예를 들어, 대신 이전에 캐시 된 객체를 반환 할 수 있습니다.

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