views:

91

answers:

6

When starting a new application what are some ways to decide what objects you will need, what they should do, and how they should interact with each other?

Is this a job for a white board, or is it easier to just start coding and move stuff around as needed?

+2  A: 

This should fall more or less 'naturally' from the requirements.

Do you have a solid understanding of what the app is supposed to do, its scope, et al?

It really depends on what the size of the project is you're talking about: the approach and rigor one must apply is different for a team building commercial software than a personal project.

That said, some general tips are:

1) On your medium of choice (I like whiteboards) start enumerating the use cases or user stories. Keep going until you feel like you've gotten the most important/encompassing 80% covered.

2) When you're satisfied that you have the "WHAT" (use cases) succinctly and more-or-less sufficiently defined, you can start working out the "HOW" (objects, algorithms, et al). I would suggest a bias towards less complexity: you do not want a complicated and multi-layered object hierarchy unless you really, really need it (and even then, you probably don't).

3) I tend to enforce a "no-coding" rule until #1 and #2 are done, throw-away prototypes or explorations of particular approaches notwithstanding. It's very very easy to start slinging code and discover you're "trapped" by the object model you came up with before you fully understood what it is you're building.

4) Once you're done with your requirements gathering you can use any # of approaches to start breaking out functional units/objects/roles/etc. CRC cards are one approach; I've also had success with UML class & sequence diagrams.

I personally like to do lots of whiteboarding in UML; I take pictures with a digital camera frequently to archive thinking/approaches. These are much better than nothing when it comes to poor-man's documentation or answering the question "why did/didn't we..." 2 months down the road.

DarkSquid
+1  A: 

Sequence and class diagrams. These go a long way when your in design. The last thing you want to do, unless you aren't constrained in terms of time & resources, is just start coding.

Shaun
+1  A: 

Probably best to start on a whiteboard or some design overview. It all depends on what your application needs to do really. Figure out what actions your application needs to do. Associate objects accordingly with the methods you come up after breaking your application down into appropriate pieces.

Matt
+7  A: 

CRC Cards, or Class-Responsibility-Collaboration Cards, are a good way to do this - see the Wikipedia page.

They're a good way to brainstorm (as a team or just by yourself) which classes you'll needed, what each class will be responsible for, and how they'll interact with each other.

RichieHindle
Argh...beat me to it.
Justin Niessner
CRC is a very good thing to use. You can write them with somebody else and then play use cases of your app. this will help you to understand the flow better, see the classes as they are see potential problems (like one of the classes asks too much info from others or does too much).
Yaroslav Yakovlev
+3  A: 

You might want to try:

CRC Cards

The cards will help define the object, its responsibilities, and its collaborations.

There's an entire process that you go through when creating the CRC cards. That process defines the rules that help make each class concise and really only perform the operations it needs.

Justin Niessner
Wow, less than a second in it!
RichieHindle
Great minds think alike. haha
Justin Niessner
+2  A: 

I think the answer depends on a couple of factors:

  • what is the size of the project? For a small project it's fairly easy to have a good idea of the three or four objects that might be required and just start coding. For bigger projects it's important to start listing them beforehand so that you can develop good object names and hierarchy.

  • how many people are on the project? If there is more than just you, you should sit down and plan who is going to be working on what and that requires a list of the classes that are going to be needed.

For anything bigger than a small (one or two day) project, it's worth putting some time into design before you start coding. White boards are fine for this but make sure you take a picture when you're done!

TLiebe