Sto progettando una libreria basata su web scraping che tenta di fornire un'API a un sito di notizie popolare. Sto rappresentando ciascuno dei suoi articoli come una raccolta di "elementi" ( IElement
), come immagini, video, blocchi di testo, colonne sonore, ecc. Il problema è che non riesco a pensare a nulla che ogni "elemento" abbia in comune.
- Testo? No, le immagini (e i video e le colonne sonore) non hanno testo.
- Un URL per accedere al file? No; mentre visiterò un URL remoto per accedere a un'immagine oa un video (poiché non è pratico passarne quelli in giro), non ho bisogno di andare su un URL per ottenere il testo (posso solo passarlo come stringa) .
L'unica cosa che posso pensare è avere un membro che descriva il tipo di elemento, ma che potrebbe potenzialmente portare a un'API molto intuitiva. Non voglio che la mia API finisca in questo modo:
// API code
enum ElementType
{
Text, Hyperlink, Image, Video, Soundtrack
}
interface IArticle
{
IEnumerable<IElement> Contents { get; }
}
interface IElement
{
ElementType Type { get; }
}
class TextElement : IElement { /*details*/ }
class ImageElement : IElement { /*details*/ }
// .. and so on
// Usage in app code
foreach (var element in article.Contents)
{
switch (element.Type)
{
case ElementType.Text:
RenderText(((TextElement)element).Text);
break;
case ElementType.Image:
DisplayImage(GetImageFromUri(((ImageElement)element).ImageUri));
break;
// and so on
}
}
Come puoi vedere, in questo scenario viene aggiunta molta verbosità perché l'utente deve 1) attivare il tipo di elemento, 2) controllare per ogni ElementType
, e poi 3) downcast per usare l'implementazione specifica caratteristiche.
Esiste un'alternativa al controllo / downcasting del tipo di runtime disordinato in questo scenario? In che modo altre app client (ad esempio i client Facebook / Twitter) gestiscono questo tipo di problema?