It can only be either a single instance of T or an array of T[]
but I don't know at compile time
Quindi non è necessario avere entrambi i casi nella classe. Al contrario, astraggono il loro comportamento nell'interfaccia e hanno due implementazioni di tale interfaccia. Uno per singolo oggetto e uno per un array.
public interface IDataOf<T>
{
void Match(Action<T> match);
void Match(Action<T[]> match);
}
public class SingleOf<T>
{
private readonly T _data;
public SingleOf(T data) => _data = data;
void Match(Action<T> match)
{
match(_data);
}
void Match(Action<T[]> match)
{
// do nothing or throw an exception
}
}
public class MultipleOf<T>
{
private readonly T[] _data;
public MultipleOf(T[] data) => _data = data;
void Match(Action<T> match)
{
// do nothing or throw an exception
}
void Match(Action<T[]> match)
{
match(_data);
}
}
Esempio di utilizzo:
Action<string> singleMatch = item => { };
Action<string[]> multipleMatch = items => { };
var text = new[] { "one", "two", "three" };
IDataOf<string> lines = new MultipleOf<string>(text);
lines.Match(multipleMatch);
var anotherText = "only one";
IDataOf<string> sentence = new SingleOf<string>(anotherText);
sentence.Match(singleMatch);
I nomi delle classi dovrebbero essere basati sul loro comportamento.
I nomi delle variabili devono essere basati sul loro utilizzo, facili da leggere e comprendere nel contesto attuale.
Se vuoi ancora avere una lezione con entrambe le opzioni, il nome SingularOrArray
è abbastanza buono e non è troppo lungo .