이것은 POLA뿐만 아니라 버그의 원인으로 유효하지 않은 상태를 방지하는 것입니다.
구체적인 구현을 제공하지 않고 예제에 몇 가지 제약을 제공하는 방법을 살펴 보겠습니다.
첫 번째 단계 : 파일을 열기 전에는 아무것도 호출하지 마십시오.
CreateDataFileInterface
+ OpenFile(filename : string) : DataFileInterface
DataFileInterface
+ SetHeaderString(header : string) : void
+ WriteDataLine(data : string) : void
+ SetTrailerString(trailer : string) : void
+ Close() : void
이제 실제 데이터를 쓸 수 CreateDataFileInterface.OpenFile
있는 DataFileInterface
인스턴스 를 검색하기 위해 호출해야합니다 .
두 번째 단계 : 헤더와 트레일러가 항상 설정되어 있는지 확인하십시오.
CreateDataFileInterface
+ OpenFile(filename : string, header: string, trailer : string) : DataFileInterface
DataFileInterface
+ WriteDataLine(data : string) : void
+ Close() : void
이제 DataFileInterface
파일 이름, 헤더 및 트레일러 를 얻기 위해 모든 필수 매개 변수를 미리 제공해야합니다 . 모든 줄을 쓸 때까지 트레일러 문자열을 사용할 수없는 경우 트레일러 문자열 없이는 파일을 완료 할 수 없도록 이 매개 변수를 Close()
(메서드의 이름을 바꿀 수 있음)으로 이동할 수도 있습니다 WriteTrailerAndClose()
.
댓글에 답장하려면 :
나는 인터페이스의 분리를 좋아한다. 그러나 집행에 대한 귀하의 제안 (예 : WriteTrailerAndClose ())이 SRP 위반에 대한 판단이라고 생각합니다. (이것은 여러 차례에 걸쳐 어려움을 겪었지만, 귀하의 제안은 가능한 예인 것 같습니다.) 어떻게 대답 하시겠습니까?
진실. 내 주장을하는 데 필요한 것보다 더 많은 예에 집중하고 싶지는 않지만 좋은 질문입니다. 이 경우 나는 그것을 부르고 그것이 Finalize(trailer)
그렇게 많이하지 않는다고 주장합니다. 트레일러 작성 및 마감은 단순한 구현 세부 사항입니다. 그러나 의견이 다르거 나 다른 상황이 비슷한 경우 가능한 해결책은 다음과 같습니다.
CreateDataFileInterface
+ OpenFile(filename : string, header : string) : IncompleteDataFileInterface
IncompleteDataFileInterface
+ WriteDataLine(data : string) : void
+ FinalizeWithTrailer(trailer : string) : CompleteDataFileInterface
CompleteDataFileInterface
+ Close()
이 예제에서는 실제로는하지 않지만 결과적으로 기술을 수행하는 방법을 보여줍니다.
그건 그렇고, 많은 행을 순차적으로 쓰는 것과 같이 메소드를 실제로이 순서대로 호출해야한다고 가정했습니다. 이것이 필요하지 않은 경우 Ben Cottrel이 제안한대로 항상 빌더를 선호합니다 .