2017-05-02 2 views
0

종종 "구조를 바꾸면 피하려고합니다. 그렇다면 하위 클래스로 리팩터링합니다." 이 기능이 어떻게 작동하는지 알지 못합니다. 코드에 if/switch가 있습니다. 그리고 몇 가지 새로운 클래스를 만듭니다. 그러나 어떤 클래스를 사용할 것인지 결정하려면 패브릭 클래스에서 스위치를 구현해야합니다 (이 객체를 생성하는 곳). 내가 잘못?조건부 다형성으로 바꾸기 - 작동 원리?

P. 미안해, 내 영어로. 나는 독자 라, 작가가 아니다.

+0

답변을 원하는 프로그래밍 언어는 무엇입니까? 기음#? – Sweeper

+0

모두. 나는 PHP를 선호하지만, C# 또는 Java도 문제 없다. –

답변

1

그러나 사용할 클래스를 결정하려면 (이 개체를 생성하는 곳)에 스위치를 구현해야합니다. 내가 잘못?

아니요, 틀리지 않습니다. 스위치를 통한 다형성은 좋은 일이지만 예외가 있습니다. 이러한 예외 중 하나는 매개 변수화 된 공장을 가지고 있으며 절대적으로 받아 들일 수있는 경우입니다. 따라서 고객 코드 대신 조건에 따라 특수화 된 클래스를 작성하면 해당 팩토리에 대해 생성하도록 요청할 것입니다. Factory는 해당 클래스 인스턴스를 생성하는 데 전적으로 책임을지며 새로운 클래스가 도입되면 팩토리 만 클라이언트 코드가 아닌 수정됩니다. 그래서 그 대신이의

:

public interface ISerializer { 
    string Serialize(object instance); 
    object Deserialize(string content); 
} 

public class XMLSerializer : ISerializer { } 
public class JSONSerializer : ISerializer { } 

public class SerializerFactory() { 
    public static ISerializer CreateSerializer(string type) { 
     switch(type) { 
      case "XML": 
       return new XMLSerializer(); 
      case "JSON": 
       return new JSONSerializer(); 
     } 
    } 
} 

public class Client { 
    public string ParseAPIResponse(string contentType, string responseData) { 
     ISerializer serializer = SerializerFactory.CreateSerializer(contentType); 
     var responseObj = serializer.Deserialize(responseData); 
    } 
} 

주 공장 변경하고 새로운 시리얼의 소개에 대해 하나의 이유가 될 수있다, 그래서 우리는 다음과 같습니다

public class Client { 
    public string Serialize<T>(string contentType, T instance) where T : class { 
     switch(contentType) { 
      case "XML": 
       return new XMLSerializer().Serialize(instance); 
      case "JSON": 
       return new JSONSerializer().Serialize(instance); 
     } 
    } 
} 

당신이있을 것이다 여기에 SRP가 좋다. 더 나아가 설정 파일을 사용하여 식별자 유형 매핑을 저장하거나 사용자가 새로운 유형 등을 등록 할 수 있도록 공장에서 다른 메소드를 노출하는 등 공장을 수정하는 것을 피할 수있는 방법이 있습니다.

+0

의견을 보내 주셔서 감사합니다. 이제 나는이 개념을 완전히 이해합니다. 미안하지만 저의 명성이 낮기 때문에 답을 줄 수 있습니다. 그러나 내가 그것을 할 수있는 기쁨이 될 때, 나는 약속한다 :-) –

+0

* 그러나 내가 그것을 할 수있는 기쁨이 될 때, 나는 약속한다 * - 그건 괜찮아. * 이제는이 개념을 완전히 이해했습니다. * - 이것이 더 중요했습니다. – niksofteng