Jak ten kod powinien wyglądać moim zdaniem [pseudo kod]:
def main() {
writer = getWriterInstance()
writer.write("""
| header
| body
| footer
""")
writer.close()
}
Jak mógłby wyglądać gdybym znał kontekst [pseudo kod]:
WriterInterface
write(writer)
HeaderWriter implements WriterInterface
write(writer) -> writer.write('header')
BodyWriter implements WriterInterface
write(writer) -> writer.write('body')
FooterWriter implements WriterInterface
write(writer) -> writer.write('footer')
WriterGroup implements WriterInterface
constructor(writers: WriterInterface[]) -> this.writers = writers
write(writer) -> writers.forEach(singleWriter -> singleWriter.write(writer))
def main() {
writer = getWriterInstance()
myDomainWriter = new WriterGroup([new HeaderWriter(), new BodyWriter(), new FooterWriter()])
myDomainWriter.write(writer)
writer.close()
}
Co zyskujesz pisząc w ten sposób? Ten myDomainWriter
możesz sobie stworzyć w formie DI
w jakimś configu i operować na nim wszędzie (bez tego musiałbyś w każdym miejscu robić te swoje getHeader
, getFooter
itp.). Jak chcesz dodać nowy writer to piszesz osobną klasę (czyli kod każdego writera ma swoje określone miejsce i nie wychodzi poza to miejsce, co nie ma nic wspólnego z single responsibility principle
), tylko w 1 miejscu rozszerzasz swój myDomainWriter
, dodatkowo dzięki temu, że implementuje on ten sam interface (dzięki Composite Design Pattern
) możesz dowolnie zagnieżdzać swoje writery np. HeaderWriter
możesz zmienić na WriterGroup
i w nim umieścić kilka Writerów.
Dodatkowo wyżej mam złe nazewnictwo, bo można wyróżnić 2 rodzaje writerów (1 jest techniczny/infrastructure) i to jest to getWriterInstance
, drugi jest domenowy WriterInterface
- ale samo słowo Writer
tak mało mówi, że nie wiem o co Ci chodziło. W IT wszystko co rzuca na output to może być Writer
, ale rzadko kiedy jest to faktycznie Writer
, to może być np. PostWriter
, HeaderWriter
ale też HTMLWriter
, XMLWriter
itd.
Poczytaj o Composite Design Pattern
https://sourcemaking.com/design_patterns/composite