2009-06-29 9 views
1

질문을 소개하는 예제를 만들었습니다.매개 변수로 파일 전달

public class Algorithm 
{ 
    // This is the best, but circumstances prevent me from doing this. 
    /*public static void computeSomething(Data data) 
    { 
     // Compute some stuff 
    }*/ 

    public static void computeSomething(DataFileReader reader) throws IOException 
    { 
     // Compute some stuff. 
    } 

    public static void computeSomething(File file) throws IOException, DataFormatException 
    { 
     DataFileReader = DataFileReaderFactory.newDataFileReader(file); 

     // Compute some stuff. 
    } 
} 

public class DataFileReaderFactory 
{ 
    private enum FileExtension { XML, UNSUPPORTED_EXTENSION } 

    private static final String XMLExtension = ".xml"; 

    public static DataFileReader newDataFileReader(File file) throws DataFormatException 
    { 
     switch(computeFileExtension(file)) 
     { 
      case XML : return new XMLFileReader(file); 

      default : throw new DataFormatException(); 
     } 
    } 

    private static FileExtension computeFileExtension(File file) 
    { 
     if(file.getName().endsWith(XMLExtension)) 
      return FileExtension.XML; 
     else 
      return FileExtension.UNSUPPORTED_EXTENSION; 
    } 
} 

그래서, 나는 파일, 또는 데이터가 올바른 형식인지 확인 내 자신의 파일 리더를 취할 내 인터페이스를 정의해야하는지 알고 싶습니다. 분명히 데이터 자체를 데이터 개체로 사용할 수 있기를 원합니다. 그러나이 점에있어 제한적입니다. 그 이유는 데이터가 매우 크고 여러 객체에 대해 직렬화해야하기 때문입니다. 이 경우 데이터 자체가 아닌 데이터 경로를 보내는 것이 더 실용적입니다.

어쨌든 질문에 관해서는 Java의 파일 인 파일의 인스턴스를 취하는 메소드쪽으로 기울어 져 있지만 더 일반적인 것처럼 들리 겠지만 여러분의 조언을 듣고 싶습니다. 감사!

답변

4

메모리에 테스트 프로그램을 만들 수있는 무언가를 사용하십시오. 예 : File 대신 InputStream을 사용하면 파일 시스템에 파일을 만들고, 파일에 넣고, 끝내면 제거 할 필요없이 테스트를위한 간단한 InputStream 구현을 작성할 수 있습니다.

내 생각에 데이터 개체를 가져 오는 인터페이스가있는 것이 가장 좋습니다.

+0

아쉽게도 스트림은 직렬화 할 수 없으므로 알고리즘에 필요한 요구 사항입니다. 테스트와 로컬 실행을 위해 위의 예에서 주석 처리 한 것과 같은 알고리즘 버전을 만들어 데이터를 직접 전달할 수 있습니다. –

+0

귀하의 구현을 직렬화 할 수 ... –

0

나는 실제로 데이터 객체/인터페이스를 사용해야한다는 위의 답변에 동의합니다. 테스트를 수행 할 때 데이터 객체의 모의 객체를 만들어보다 쉽게 ​​테스트 할 수 있습니다. 또한 데이터베이스, 파일, 메모리 등 여러 소스에서 데이터를 읽는 경우 동일한 스트림 형식으로 가져 오는 것이 항상 쉬운 것은 아닙니다 (단, 각 소스 유형에 맞게 어댑터를 사용하여 올바른 데이터 형식).

나는 당신의 방법이 정적 인 것으로 나타났습니다. 인스턴스 메서드가 있고 알고리즘 인스턴스를 만드는 것을 고려할 수 있습니다. 인스턴스 메소드를 사용하면 필요한 경우 상태를 저장할 수 있습니다.

0

큰 질문은 전체 데이터 세트를 한꺼번에 처리해야하는지 아니면 스트리밍 된 형식으로 설정된 데이터에서 작동하는지 여부입니다.

알고리즘을 작동하기 위해 데이터 세트를 한 번에 모두 필요로하는 경우 (즉, 데이터 요소 사이를 앞뒤로 무작위로 탐색하는 경우) 으로 주석 처리 된 첫 번째 방법을 유지해야합니다. 다른 방법에서는 스트림을 가져 와서 전체 데이터 세트로 읽은 다음 전체 데이터 세트를 알고리즘 메소드로 전달합니다. 특정 인터페이스가 필요하다고해서 전체 구현을 해당 위치로 가져와야한다는 것을 의미하지는 않습니다. 반면에이 데이터 스트림에서 작동하도록 설계 알고리즘 (즉, 라우팅 알고리즘) 그 방법에 쓰레기를 유지하고 당신이 해야하는처럼 스트림에서 작동 인 경우

...

0

여러분의 제약 조건을 감안할 때 File을 사용하는 메서드와 DataFileReader를 사용하는 메서드를 모두 가지고 있으며 이전 메서드를 호출하는 메서드가 있습니다. DataFileReader를 확장하여 테스트를위한 메모리 내 판독기를 만들 수있는 경우 특히 그렇습니다.

+0

위의 방법의 본문에서 아무 지점에서 실제로 데이터를 읽을 수 있습니다. 실제로는 일련 번호가 지정된 작업을 네트워크를 통해 전달합니다.여기 내가 데이터를 읽었습니다. 불행하게도, 생성 된 모든 작업에 대해 데이터 사본을 직렬화하는 것은 실현 가능하지 않습니다. –

관련 문제