Cheguei à conclusão de que CreateDataFile
uma coisa é fazer uma medição rápida e, em seguida, armazenar os dados. Fazer as duas coisas no mesmo método é mais intuitivo para outra pessoa que usa esse código do que para medir e gravar em um arquivo. como chamadas de método separadas.
Eu acho que esse é seu problema, na verdade. O método não está fazendo uma coisa. Ele está executando duas operações distintas que envolvem E / S para dispositivos diferentes , sendo que ambos são descarregados para outros objetos:
- Buscar uma medida
- Salve esse resultado em um arquivo em algum lugar
Essas são duas operações de E / S diferentes. Notavelmente, o primeiro não altera o sistema de arquivos de forma alguma.
De fato, devemos observar que há um passo intermediário implícito:
- Buscar uma medida
- Serialize a medida em um formato conhecido
- Salve a medida serializada em um arquivo
Sua API deve fornecer cada um deles separadamente de alguma forma. Como você sabe que um chamador não deseja fazer uma medição sem armazená-la em qualquer lugar? Como você sabe que eles não desejam obter uma medida de outra fonte? Como você sabe que eles não querem armazená-lo em outro lugar que não seja o dispositivo? Há boas razões para desacoplar as operações. Numa nua mínimo, cada peça deve ser disponível para qualquer chamador. Não devo ser forçado a gravar a medida em um arquivo se meu caso de uso não exigir.
Como exemplo, você pode separar as operações assim.
IMeasurer
tem uma maneira de buscar a medida:
public interface IMeasurer
{
IMeasurement Measure(int someInput);
}
Seu tipo de medição pode ser apenas algo simples, como um string
ou decimal
. Não estou insistindo que você precise de uma interface ou classe para isso, mas torna o exemplo aqui mais geral.
IFileAccess
possui algum método para salvar arquivos:
interface IFileAccess
{
void SaveFile(string fileContents);
}
Então você precisa de uma maneira de serializar uma medida. Crie isso na classe ou interface que representa uma medida ou tenha um método utilitário:
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 ...
}
Não está claro se você ainda tem essa operação de serialização separada.
Esse tipo de separação melhora sua API. Permite que o chamador decida o que precisa e quando, em vez de forçar suas idéias preconcebidas sobre o que a E / S deve executar. Os chamadores devem ter o controle para executar qualquer operação válida , seja você útil ou não.
Depois de ter implementações separadas para cada operação, seu CreateDataFile
método se torna apenas um atalho para
fileAccess.SaveFile(SerializeMeasurement(measurer.Measure()));
Notavelmente, seu método agrega muito pouco valor depois de fazer tudo isso. A linha de código acima não é difícil para os chamadores usarem diretamente, e seu método é puramente por conveniência. Deve ser e é algo opcional . E essa é a maneira correta de a API se comportar.
Depois que todas as partes relevantes são fatoradas e reconhecemos que o método é apenas uma conveniência, precisamos reformular sua pergunta:
Qual seria o caso de uso mais comum para os chamadores?
Se o objetivo principal é tornar o caso de uso típico de medir e gravar no mesmo quadro um pouco mais conveniente, faz todo o sentido apenas disponibilizá-lo Board
diretamente na classe:
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()));
}
}
Se isso não melhorar a conveniência, eu não me incomodaria com o método.
Sendo este um método de conveniência, levanta uma outra questão.
A IFileAccess
interface deve saber sobre o tipo de medição e como serializá-la? Nesse caso, você pode adicionar um método para IFileAccess
:
interface IFileAccess
{
void SaveFile(string fileContents);
void SaveMeasurement(IMeasurement m);
}
Agora os chamadores apenas fazem o seguinte:
fileAccess.SaveFile(measurer.Measure());
que é tão curto e provavelmente mais claro que o seu método de conveniência, conforme concebido na pergunta.