UML doesn't describe the meanings of classes, objects, states, or sequences. It only provides a bunch of placeholders for words that are supposed to describe these meanings. This means that people will make their own assumptions about what a diagram means based on nothing but the 2-D proximity of your layout. And that's not enough dimensionality to express any significant meaning at all.
What's worse, UML provides no metrics to tell you when a particular diagram or a part of a diagram is well constructed or poorly constructed. And it doesn't help you visualize any such metrics that you might use yourself. There are no UML tools, for example, that will tell you when you have violated the
LawOfDemeter, or the
OpenClosedPrinciple, or even the simple
AcyclicDependenciesPrinciple.
These failings are some of the reasons that
UmlDoesntWork.
In other words UML is a modeling language without a model. Should have been called UnifiedCollectionOfSymbols. It is just about reusing commonly agreed symbols, and as long as those symbols mean different things in different contexts, the common agreement may be misleading.
May be misleading, but often isn't in practice. I don't use it as a formal modelling language. I do use it as a shared notation for explaining stuff. It's
GoodEnough for me.
Regarding the statement that there are no UML tools that will tell you when you have violated various metrics: this doesn't mean that there will never be any such tools. Take a look at the Package Structure Analysis Tool (PASTA
http://javacentral.compuware.com/pasta/) from Compuware for example. It's a, currently free beer, beta version of a tool that generates
PackageDependencyDiagrams and applies a variety of metrics including two different variations on the
AcyclicDependenciesPrinciple. It's pretty good although it's not strictly speaking a UML tool.
--