종종 "구조를 바꾸면 피하려고합니다. 그렇다면 하위 클래스로 리팩터링합니다." 이 기능이 어떻게 작동하는지 알지 못합니다. 코드에 if/switch가 있습니다. 그리고 몇 가지 새로운 클래스를 만듭니다. 그러나 어떤 클래스를 사용할 것인지 결정하려면 패브릭 클래스에서 스위치를 구현해야합니다 (이 객체를 생성하는 곳). 내가 잘못?조건부 다형성으로 바꾸기 - 작동 원리?
P. 미안해, 내 영어로. 나는 독자 라, 작가가 아니다.
종종 "구조를 바꾸면 피하려고합니다. 그렇다면 하위 클래스로 리팩터링합니다." 이 기능이 어떻게 작동하는지 알지 못합니다. 코드에 if/switch가 있습니다. 그리고 몇 가지 새로운 클래스를 만듭니다. 그러나 어떤 클래스를 사용할 것인지 결정하려면 패브릭 클래스에서 스위치를 구현해야합니다 (이 객체를 생성하는 곳). 내가 잘못?조건부 다형성으로 바꾸기 - 작동 원리?
P. 미안해, 내 영어로. 나는 독자 라, 작가가 아니다.
그러나 사용할 클래스를 결정하려면 (이 개체를 생성하는 곳)에 스위치를 구현해야합니다. 내가 잘못?
아니요, 틀리지 않습니다. 스위치를 통한 다형성은 좋은 일이지만 예외가 있습니다. 이러한 예외 중 하나는 매개 변수화 된 공장을 가지고 있으며 절대적으로 받아 들일 수있는 경우입니다. 따라서 고객 코드 대신 조건에 따라 특수화 된 클래스를 작성하면 해당 팩토리에 대해 생성하도록 요청할 것입니다. 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가 좋다. 더 나아가 설정 파일을 사용하여 식별자 유형 매핑을 저장하거나 사용자가 새로운 유형 등을 등록 할 수 있도록 공장에서 다른 메소드를 노출하는 등 공장을 수정하는 것을 피할 수있는 방법이 있습니다.
의견을 보내 주셔서 감사합니다. 이제 나는이 개념을 완전히 이해합니다. 미안하지만 저의 명성이 낮기 때문에 답을 줄 수 있습니다. 그러나 내가 그것을 할 수있는 기쁨이 될 때, 나는 약속한다 :-) –
* 그러나 내가 그것을 할 수있는 기쁨이 될 때, 나는 약속한다 * - 그건 괜찮아. * 이제는이 개념을 완전히 이해했습니다. * - 이것이 더 중요했습니다. – niksofteng
답변을 원하는 프로그래밍 언어는 무엇입니까? 기음#? – Sweeper
모두. 나는 PHP를 선호하지만, C# 또는 Java도 문제 없다. –