CreateDataFile
빠른 측정을 한 다음 데이터를 저장하여 한 가지 작업을 수행하고 동일한 방법으로 두 작업을 수행하는 것이 다른 사람 에게이 코드를 사용하여 측정하고 파일을 작성 해야하는 것이 더 직관적 이라는 결론에 도달했습니다. 별도의 메소드 호출로.
실제로 이것이 당신의 문제라고 생각합니다. 이 방법은 한 가지 일을 하지 않습니다 . 다른 장치에 대한 I / O와 관련된 두 가지 별개의 작업을 수행하고 있습니다. 두 가지 모두 다른 객체로 오프로드됩니다.
- 측정 값 가져 오기
- 결과를 어딘가에 파일로 저장
두 가지 다른 I / O 작업입니다. 특히, 첫 번째 파일 시스템은 어떤 식 으로든 파일 시스템을 변경하지 않습니다.
실제로, 우리는 중간 단계가 내포되어 있음에 유의해야합니다.
- 측정 값 가져 오기
- 측정을 알려진 형식으로 직렬화
- 직렬화 된 측정 값을 파일로 저장
API는 이들 각각을 개별적으로 어떤 형태로 제공해야합니다. 발신자가 어디에도 저장하지 않고 측정을 원하지 않는다는 것을 어떻게 알 수 있습니까? 그들이 다른 소스로부터 측정을 받고 싶지 않다는 것을 어떻게 알 수 있습니까? 장치 이외의 다른 곳에 저장하고 싶지 않다는 것을 어떻게 알 수 있습니까? 작업을 분리해야 할 이유가 있습니다. (A)에서 맨손으로 최소, 각각의 조각은해야 가능한 모든 호출자. 사용 사례에서 요구하지 않는 경우 파일에 측정 값을 쓰도록 강요해서는 안됩니다.
예를 들어 이와 같은 작업을 분리 할 수 있습니다.
IMeasurer
측정 값을 가져 오는 방법이 있습니다.
public interface IMeasurer
{
IMeasurement Measure(int someInput);
}
측정 유형은 string
또는 과 같은 단순한 것일 수 있습니다 decimal
. 인터페이스 또는 클래스가 필요하다고 주장하지는 않지만 여기에서 예제가 더 일반적입니다.
IFileAccess
파일을 저장하는 몇 가지 방법이 있습니다.
interface IFileAccess
{
void SaveFile(string fileContents);
}
그런 다음 측정을 직렬화하는 방법이 필요합니다. 이를 측정을 나타내는 클래스 또는 인터페이스에 구축하거나 유틸리티 메소드를 사용하십시오.
interface IMeasurement
{
// As part of the type
string Serialize();
}
// Utility method. Makes more sense if the measurement is not a custom type.
public static string SerializeMeasurement(IMeasurement m)
{
return ...
}
이 직렬화 작업이 아직 분리되어 있는지 확실하지 않습니다.
이러한 분리는 API를 향상시킵니다. 이를 통해 호출자는 I / O 수행에 대한 선입견을 강요하지 않고 필요한 내용과시기를 결정할 수 있습니다 . 유용하다고 생각하든, 발신자에게는 유효한 작업 을 수행 할 수있는 제어 기능이 있어야합니다 .
각 작업에 대해 별도의 구현 CreateDataFile
이 있으면 메서드가 간단합니다.
fileAccess.SaveFile(SerializeMeasurement(measurer.Measure()));
특히,이 모든 작업을 수행하면 메서드에 거의 가치가 없습니다. 위의 코드 줄은 호출자가 직접 사용하기 어렵지 않으며 메서드는 순전히 편의를위한 것입니다. 이 옵션 은 선택 사항 입니다. 그리고 이것이 API가 작동하는 올바른 방법입니다.
모든 관련 부분이 제외되고 해당 방법이 단지 편리함을 인정한 후에는 다음과 같이 귀하의 질문을 바꾸어야합니다.
발신자에게 가장 일반적인 사용 사례는 무엇입니까?
요점은 같은 보드에서 측정하고 쓰는 것과 같은 일반적인 사용 사례를 약간 더 편리하게 만드는 것이라면 Board
수업에서 직접 사용할 수 있도록하는 것이 좋습니다 .
public class Board : IMeasurer, IFileAccess
{
// Interface methods...
/// <summary>
/// Convenience method to measure and immediate record measurement in
/// default location.
/// </summary>
public void ReadAndSaveMeasurement()
{
this.SaveFile(SerializeMeasurement(this.Measure()));
}
}
이것이 편의성을 향상시키지 못하면 방법을 전혀 신경 쓰지 않을 것입니다.
이것은 편리한 방법이기 때문에 다른 질문이 하나 있습니다.
해야 IFileAccess
인터페이스는 측정 유형 및 직렬화하는 방법에 대해 알아? 그렇다면 다음에 메소드를 추가 할 수 있습니다 IFileAccess
.
interface IFileAccess
{
void SaveFile(string fileContents);
void SaveMeasurement(IMeasurement m);
}
이제 발신자가이 작업을 수행합니다.
fileAccess.SaveFile(measurer.Measure());
질문에서 생각한 것처럼 편리한 방법보다 짧고 분명합니다.