I'll try to be as explicit as possible, in case there is a better solution for my problem than answering my question.
I'm working in C#.
I have a report template that can include any number of 'features' turned on. A feature might be a table of information, a pie/bar chart, a list, etc. I am generating the report as a text file, or a PDF (possibly other options in the future).
So far I have an IFeature
interface, and some feature types implementing it: ChartFeature
, ListFeature
, etc. I read the list of features enabled from the database and pass each one to a method along with the data id and the method returns a populated IFeature
of the proper type.
I also have an IReportWriter
interface that TextReportWriter
and PdfReportWriter implement. That interface has a method: AddFeature(IFeature)
.
The problem is that AddFeature
in each writer ends up looking like:
public void AddFeature(IFeature)
{
if(IFeature is ChartFeature)
{
...
}
else if(IFeature is ListFeature)
{
...
}
...
else
{
throw new NotImplementedException();
}
}
This feels ugly. I like it somewhat better as AddFeature(ListFeature){...}
, AddFeature(ChartFeature)
because at least then it's compile time checked, but in practice it just moves the problem so now outside if the IReportWriter I'm calling if(feature is ...)
.
Moving the display code into the feature just reverses the problem because it would need to know whether it should be writing plain text or a PDF.
Any suggestions, or am I best just using what I have and ignoring my feelings?
Aucun commentaire:
Enregistrer un commentaire