假设您必须处理一个序列,InputType
该序列产生两个序列,一个是 type OutputType
,另一个是 type ErrorType
。
一个基本的实现可能是:
class SeqProcessor {
private IEnumerable<ErrorType> errorTypes;
public SeqProcessor()
{
this.errorTypes = Enumerable.Empty<ErrorType>;
}
public IEnumerable<ErrorType> Errors
{
get { return this.errors; }
}
public IEnumerable<OutputType> ProcessItems(IEnumerable<InputType> inputTypes)
{
yield return new OutputType();
if (err) this.errorTypes = this.errorTypes.Concat(new ErrorType());
yield return new OutputType();
yield return new OutputType();
if (err) this.errorTypes = this.errorTypes.Concat(new ErrorType());
// ...
yield break;
}
}
例如,我看到这两种选择:
在and和 let return之间使用通用接口(例如
IProduct
)(而不是使用 Linq 进行区分)。OutputType
ErrorType
ProcessItems
IEnumerable<IProduct>
定义一个
ErrorType
被调用的子类,NoError
并让ProcessItems
返回元组IEnumerable<Tuple<OutputType, ErrorType>>
(如果没有错误,NoError
将在元组中使用)。
编辑:
由于ErrorType
在语义上不同OutputType
,混合这些类型可能违反单一责任原则。委托的使用能否成为可接受的替代设计:
class SeqProcessor {
public IEnumerable<OutputType> ProcessItems(
IEnumerable<InputType> inputTypes,
Action<ErrorType> onError)
{
yield return new OutputType();
// ...
onError(new ErrorType());
}
}
在这种情况下,您使用哪种方法?