The most important question to ask yourself when deciding how to structure code is "how will I *unit* test this?"
Not integration test, not system test, unit test. Make the code easy to unit test. Most other "good code" attributes will result naturally from that.