Um dies richtig zu erklären, brauchen wir eine kurze Geschichtsstunde. In den frühen Tagen des Software-Engineerings war es eine häufig verwendete Analogie, ein Haus zu bauen. Ein Architekt und Bauingenieur bespricht Pläne mit einem Kunden und entwirft einen Entwurf. Die Bauherren folgen dann diesem Entwurf, um das eigentliche Haus zu bauen. Das Schreiben von Code wurde als das Äquivalent zum Bau des eigentlichen Hauses angesehen. Daher bestand ein wahrgenommener Bedarf an Vorabentwurf, bevor dieser Bau stattfinden konnte. Es wurden verschiedene grafische Entwurfswerkzeuge erstellt, darunter auch UML.
Die ursprüngliche Idee bei UML war, ein System vollständig mit UML zu entwerfen und es dann den Codierern zu übergeben, um dieses Design in Code zu übersetzen. In Wirklichkeit funktioniert dies einfach nicht und führte dazu, dass Programmierer jahrelang als "Implementierer" und nicht als "Designer" angesehen wurden, Projekte verspätet waren, die Designs sich ständig ändern mussten, nachdem sie abgeschlossen sein sollten usw.
Der Grund ist einfach. Codierung ist Design . Bei der Hausanalogie ist der Code die Zeichnung des Architekten. Der Compiler ist der Builder, der diese Entwürfe nimmt und daraus ein Programm erstellt. Diese Erkenntnis führte dann dazu, dass agile Techniken, TDD usw. geboren wurden: Tools zur Verbesserung der Qualität dieses Code-Designs.
So wie ein Architekt möglicherweise vorläufige Skizzen erstellt, um sie und ihr Team bei der Visualisierung des Gesamtdesigns zu unterstützen, kann ein Entwickler UML oder andere Tools verwenden, um das benötigte Design zu visualisieren. So wie diese Skizzen nicht blind befolgt werden, sollte die UML nicht blind befolgt werden. Das Code-Design sollte sich aus agilen Iterationen und der Verwendung von TDD entwickeln. Ebenso wie ein Architekt ein Modell des Hauses erstellen könnte, um sie und ihr Team bei der Visualisierung der Zeichnungen zu unterstützen, kann UML zur Visualisierung der Codestruktur verwendet werden.
Wie Onkel Bob sagt, können Sie die UML nicht validieren, sondern nur den Code. Daher ist der Code die primäre Konstruktionsdokumentation, und UML ist, falls verwendet, nur eine sekundäre Dokumentation.