2010-08-16 1 views
3

약간 주관적 일 수 있지만 현재 상황에 대한 귀하의 의견을 듣고 싶습니다. 개체를 serialize/deserialize하는 데 사용할 클래스가 있습니다.정적 메서드를 처리 할 때 동일한 수준의 코드 유지

public class MyClass 
{ 
    public static string ToXmlString(MyClass c) { /*...*/ } 
    public static MyClass FromXmlString(string xml) { /*...*/ } 
} 

이 접근법은 두 가지 기능을 동일한 수준으로 유지하기 때문에이 접근 방식과 같습니다. 그러나, 내 목표는 정적 방법 (가능한 경우)을 사용하지 않는 것입니다. 또한 SRP를 vilolating하는 것처럼 느껴지지만이 객체의 주요 목표는 xml 문자열에서 seriliazed/deserialize 될 수 있다는 것입니다.

이 상황에서 정적 방법 사용에 대한 의견이 있으십니까? 그냥 ToXmlString을 비 정적으로 만들지 만 FromXmlString은 정적으로 두어야합니까? MyClass의 serilization 만 처리 할 새로운 클래스를 생성해야합니까?

편집 : 나는 여기 토론 간단한 전송 객체입니다 해요

클래스입니다. Thrid 파티 도구에서 값을 저장/복원하는 데 사용됩니다.

감사합니다.

+0

정적 인 것을 방지해야하는 이유는 무엇입니까? –

+1

몇 가지 이유 때문에 정적 인 것을 피합니다. 1) 필요한 경우 IoC로 이동하기가 더 쉬움 2) 상속을 통해 객체를 확장 3) OO 관행을 사용하여 하나님 클래스에 대한 추락을 피하십시오 ... –

답변

2

FWIW 클래스가 비즈니스 유형 인 경우 직렬화가 나머지 클래스와 분리되어야한다는 것이 문제입니다.

구성 요소를 개발할 때 일반적으로 고려해야 할 사항은 단지 몇 가지 문제 만 해결하고 기술적 문제와 비즈니스 문제를 구분하는 것입니다.

나중에 데이터베이스 또는 바이너리 형식에서 직렬화를 관리해야하는 경우 어떻게해야합니까?

클래스를 복잡하게 만들고 유지 관리를 더 어렵게 만들고 그 주요 목적 (예 : 비즈니스)을 숨길 수있는 더 많은 기술 방법 (SaveToDB, LoadFromDB, ToBinaryStream, FromBinaryStream ...)으로 끝낼 수도 있습니다. 벤와의 답변에 부연

0

표준 직렬화 (XML이든 아니든)를 원하면 serialize/deserialize 메소드가 정적이 아니어야합니다.

MyClass에서 "writeObject"및 "readObject"를 다시 정의하여 사용자가 기본 직렬화 방법을 바꿔야합니다. 이 논문의 방법에 관한 내용은 Sun tutorial입니다.

"표준 직렬화"를 원하지 않으면 정적 방법을 사용하면 나에게 잘 보입니다. 정적 util 방법은 이단이 아닙니다.

추신 : 그것은 문제가되지 않지만 WML 직렬화가 필요한 경우 XStream API을 사용할 수 있습니다.

+2

"실제 직렬화"? 제드가 지금 "진짜"가 아니란 것을 의미합니까? 표준 직렬화 메커니즘을 사용하지 않는 완벽하게 유효한 이유가 많이 있습니다. –

+0

당신 말이 맞아요. "표준"세계가 "실제"보다 낫습니다.이를 수정하기 위해 내 게시물을 편집했습니다. 감사합니다. –

0

, 여기에 연재되고있는 클래스는 일련의 순차적 인 동작을 정의하는 예이다 (나는이 작성하지 않은) :

// : c12:SerialCtl.java 
// Controlling serialization by adding your own 
// writeObject() and readObject() methods. 
// From 'Thinking in Java, 3rd ed.' (c) Bruce Eckel 2002 
// www.BruceEckel.com. See copyright notice in CopyRight.txt. 

import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.Serializable; 

public class SerialCtl implements Serializable { 
    private String a; 

    private transient String b; 

    public SerialCtl(String aa, String bb) { 
    a = "Not Transient: " + aa; 
    b = "Transient: " + bb; 
    } 

    public String toString() { 
    return a + "\n" + b; 
    } 

    private void writeObject(ObjectOutputStream stream) throws IOException { 
    stream.defaultWriteObject(); 
    stream.writeObject(b); 
    } 

    private void readObject(ObjectInputStream stream) throws IOException, 
     ClassNotFoundException { 
    stream.defaultReadObject(); 
    b = (String) stream.readObject(); 
    } 

    public static void main(String[] args) throws IOException, 
     ClassNotFoundException { 
    SerialCtl sc = new SerialCtl("Test1", "Test2"); 
    System.out.println("Before:\n" + sc); 
    ByteArrayOutputStream buf = new ByteArrayOutputStream(); 
    ObjectOutputStream o = new ObjectOutputStream(buf); 
    o.writeObject(sc); 
    // Now get it back: 
    ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(
     buf.toByteArray())); 
    SerialCtl sc2 = (SerialCtl) in.readObject(); 
    System.out.println("After:\n" + sc2); 
    } 
} 

참고 과도의 사용에되지 않습니다 필드에 대해 설명합니다 연재.

0

프레임 워크가 가끔 (String.Split/Join)과 같이 보완적인 방법을 정적 또는 인스턴스와 관련하여 분리하는 것이 너무 끔찍하다고 생각하지 않습니다.

그러나 정적 방법의 사용을 최소화하려는 목표는 좋은 생각이 아니라고 생각합니다. 피할 수있는 것은 정적 메서드가 아니라 정적 정적 상태입니다.정적 변수가 아닌 매개 변수로만 작동하는 정적 메서드는 순수한 awesomeness입니다.

순수 정적 함수는 인스턴스 메서드가 변형 할 수있는 인스턴스 필드가 명백한 방식으로 통신하지 않기 때문에 인스턴스 메서드보다 유지 관리가 더 쉬울 수 있습니다. 어떤 정적 상태도 유지되지 않는다는 규칙을 따르면 정적 메서드는 매개 변수에 대해서만 작동 할 수 있으므로 응용 프로그램에서 메서드의 역할을 더 잘 예측할 수 있습니다. 이것은 멀티 스레딩 할 때 특히 중요합니다.

ToXmlString 메서드가 정의 된 클래스의 인스턴스에 적용되므로 이러한 고려 사항 중 일부는 적용되지 않습니다. 그것은 인스턴스의 모든 private 멤버에 액세스 할 수 있기 때문에 쉽게 전달되지 않는 방식으로 객체의 상태를 쉽게 변경할 수 있습니다. 그러나 나는 단지 일반적인 방법으로 정적 방법이 문제가 아니라고 말하기를 원합니다.

0

XMLReader (또는 실제로 주장하는 경우 문자열)를 사용하는 생성자를 정의 할 수 있습니다. 이것의 가장 큰 장점은 클래스에서 더 강한 불변량을 가질 수 있고 readonly을 사용하여 변경되지 않는 멤버에 대해 명시 할 수 있다는 것입니다.

1

표준 libs에서 C#과 Java 모두에 대한 규칙은 To__ 메서드가 인스턴스 메서드이고 From__ 메서드가 정적 (필요에 따라)된다는 것입니다. 예 : ToString()은 인스턴스 메소드입니다.

관련 문제