The most important lesson in software design -- form follows function. Always keep in mind that function comes first. Once function is clearly established, it will guide us toward producing the most optimal form of that function.
What does that mean in software? The first thing we do when crafting software is think about the expectations -- what is it that is missing from the product/solution we're working on? What is the capability that we'd like to have, and that is not readily available at the moment? Maybe it's the ability to evaluate if the coupon has expired? Or maybe something else that the product is missing?
Once we make the decision to work on enabling the desired capability/function, we express that expectation in the form of a test that can be executed on the computer. Of course, executing that test will not succeed, for the simple reason that we don't have that capability in our system yet. We then rush to enable the system to deliver the expected capability; that change will then make the test pass (our expectation gets fulfilled).
Now that we have satisfied the function, we let it drive the form. Our tests will assist us in making safe changes while striving to achieve elegant form.
The moral of the story is that premature optimization is the root of all evil. Don't strive to craft an elegant form before we first firmly establish the desired function.