Existuje třída HtmlNode
, od které dědí třídy HtmlElement
a HtmlTextNode
.
Takže např. následující HTML kód
<div>
First text
<strong>Foo</strong>
Second text
</div>
Bude reprezentován jako
HtmlElement(div)
HtmlTextNode(First text)
HtmlElement(strong)
HtmlTextNode(Foo)
HtmlTextNode(Second text)
Potřebuji naparsovaný a v pamětí namodelovaný kód vypsat pěkně zformátovaný. Podle Single responsibility principle by třídy HtmlElement a HtmlTextNode neměli vědět, jak se mají vypsat. Měla by tedy existovat nějaká další třída HtmlPrinter
, která by měla metodu void Print(const HtmlNode*) const
. Problém je, že uvnitř této metody by bylo nutné použít dynamic cast, což je v C++ považováno za známku špatného objektového návrhu.
Tady je problém v tom, že ta metoda
Print()
neboToString()
musí obsahovat spoustu logiky starající se o pěkné formátování. V budoucnu bych chtěl, aby se způsob formátování dal různě ponastavovat, čímž kód ještě nabobtná. Z hlediska SRP mi prostě připadá lepší, kdyby se o formátování starala jiná třída. Nicméně dynamic cast mi připadá jako ještě horší řešení, takže zatím se vydávám cestou virtuální metodyPrint
ve tříděHtmlNode
. Snad mě časem napadne lepší řešení.