2014-10-21 1 views
0

구현하고 싶은 기능은 데이터베이스에서 일부 데이터를 검색하고 일부 매개 변수를 기반으로 데이터에서 텍스트 파일을 만드는 것입니다. 이 작업을 수행하는 FileProcessor 클래스를 만들었습니다.이 클래스는 Single Responsibility를 위반하고 있습니까

public class FileGenerator 
{ 
public FileGenerator(IDataProvider dataProvider) 
{ 
    // some constructor logic 
} 
public void Generate(string fileType) 
{ 
    var data = dataProvider.getData() 
    Logger.LogMessage("Retrieved data"); 
    var file = FileFactory.GetFileInstance(fileType).CreateFile() 
    Logger.LogMessage("File Created"); 
} 
} 

위의 코드 조각에서 생성자는 클라이언트에서 dataProvider를 가져옵니다. FileFactory는 파일 형식의 인스턴스를 만들고 인스턴스 내에서 Create 메서드는 실제로 파일을 생성합니다. 로거 구성 요소는 모든 로깅 메커니즘을 처리하며 디스크 또는 데이터베이스 등에 쓸지 여부를 구성 할 수 있습니다.

이 클래스는 FileGenerator가 SRP를 위반합니까?

+0

왜 그것이 위반하고 있다고 생각합니까? 요점을 확인하십시오. 그렇지 않으면 질문이 너무 광범위하게 보입니다. –

+0

@PetrAbdulin - 파일 생성, 데이터 가져 오기 및 메시지 기록. 그것들은 추가적인 책임으로 간주 될 수 있습니까? 이 클래스는 너무 많은 다른 클래스에 종속되어 있습니까? – Ben10

답변

0

개인적으로 저는 데이터를 별도의 자리 표시 자 클래스 인 generate (String fileType, Data data)를 사용하여 FileGenerator에서 완전히 분리합니다. toLowerCase() 또는 toLowerCase()와 같은 멋진 기능을 추가 할 수 있습니다. toString() 또는 실제로 생각할 수있는 모든 것.

대신 DataProvider를 호출하고 데이터를 가져 와서 둘 다 사용할 수있는 클래스에 넣은 다음 FileGenerator로 전달하는 관리 클래스를 사용해야합니다. FileGenerator는 절대적으로 필요하지 않으면 DataProvider에 대해 알지 못합니다. DifferentDataProvider를 만들었다 고합시다. 어떻게 FileGenerator를 재사용 할 것입니까? 당신은 할 수 없습니다. DifferentFileGenerator를 작성하여 DataProvider를 가져 오기 때문에 FileGenerator가 모르는 새로운 dataprovider에서 특정 메소드를 호출 할 수 있도록 작성해야합니다. 유연하고 유지 보수가 가능한 디자인이 아닙니다.

로깅의 경우에도 성공적인 메소드에서 이벤트를 기록하는 관리자가 처리 할 수 ​​있습니다. 그렇게하면 FileGenerator를 다른 유형의 FileGenerator로 교체 할 때 모든 로깅 메시지를 다시 작성할 필요가 없습니다.

filegenerator가 생성 할 수있는 fileTypes에 대해서도 열거 형을 사용합니다. 유지 보수가 훨씬 쉬우 며 파일을 생성 할 수있는 방법이 훨씬 명확합니다.

이 정보가 도움이되기를 바랍니다. 정보가 도움이되기를 희망한다면 명확히해야합니다. 많은 일반적인 프로그래밍 문제에 대한 표준 솔루션을 위해 Head First Design Pattern을 읽는 것이 좋습니다.

+0

감사합니다. 필자는 FileGenerator 클래스에 데이터를 직접 전달하는 방식을 선호합니다. FileGenerator는 데이터가 필요하며 데이터가 제공되는 방식이 아니기 때문입니다. IDataProvider 구현 될 수있는 경우 DifferentDataProvider의 메모에, 나는 그것이 잘되어야한다고 생각합니다. Filetype에 관해서는 열거 형으로 사용하고 있습니다. 예제에서는 여기에 그 모든 세부 사항을 언급하지 않았습니다. – Ben10

관련 문제