I'm unclear about what you mean by:
generating the metadata of the entire program |
Before development proper starts, someone will have come up with a product concept:
- what is the app for/going to do/enable the user to do
- how will the user interact with the app
- what will the app will look like
- what technologies do we need to/can we use
- how much will it cost (time/money/...)
- ...
This might be a marketing team, after months of product research, a tutor/prof setting an assignment, or a solo developer coming up with a cool idea.
At the end of this phase there is usually at least a provisional feature set and some provisional art work for the UI.
The first thing that happens in development is to analyze the feature set to extract the requirements and produce an initial design (just for key features). At this stage it makes sense to "mock up" the GUI (prob simplified) but also to prototype any key functionality (basically, enough code to test that any functionality that the app really relies on actually works!)
But I think it's more appropriate to think in terms for modules/subsystems rather than classes. Even when they small scale.
A complicated app will be implemented in phases. So you don't have to finish the requirements to start the design, or the design to start the implementation. In the first iteration you focus on a small set of the key requirements.
So, to go back and aswer your original question, it is better to do a bit of both (to start with).
Andy