As far as my experience goes (I prefere the raw data of arrays, as most data in my apps are of xy-type), ddt is related to Express VIs.
So when prototyping with Express VIs, the DDT is really nice in terms of programming speed. But once the coding starts, using 'traditional'/'real' VIs all these conversions from/to DDT start polluting the Diagram. A DDT might be of different data types (similar to variant data), and polymorphic VIs (and controls) adapt to these. From that comes the advantage during prototyping, as you still can easily change the actual data type.
Waveforms as said before contain timing information. They are ok if you're only interested in a signal vs. time data (evenly spaced time!). But when I wanted to do more than just wire them to a graph, things quickly messed up. Such things as Waveform subset never worked the way I expected them to work (mainly a thing with the timestamp and absolute vs. relative), so they wasted more time than donated for the coding.
One thing thats performed better with Waveforms than arrays is to display ditigtal data, as the nice digital graph won't work with boolean arrays.
Arrays are the most clear, strict data type of all these. That's why I would do all real coding with these only.
Short:
* DDT for prototyping
* Waveform if signal vs. time is all
* Arrays for everything
Holds true for LV 7.1, don't know about the newer versions.
And also, I guess some fresh trained programmers will outperform me with DDT or waveforms where they are useful.
Felix