I'm using C#/XNA, and making a little "Space invaders" clone. To my surprise, it works, albeit extremely inefficiently. I want to improve that.

I don't like all the generated code I have to put up with in XNA, so I create a control class and just call it's "Initialize" "Tick" and "Draw" functions in the main class, and pass the loaded textures onto it.
I create a class for the enemy, bullet, and player. In control, I create the player and enemies. Each of these classes also have a Initialization, Tick, and Draw function.
Control: I have an "Enemy" array that has all the IDs of the enemies. I loop through them twice a tick, once for their tick function and once more for their draw. I also draw the bullet and player through their draw functions.
Enemy: Basic movement code, but has a variable for if it's alive or not. It has the control object's ID, who gets the bullet's ID from the player. I have no idea how fast reference passing like this is. It then gets the bullet's position, and checks if they intersect. If so, it's no longer alive, and won't run the collision code anymore or draw. Pretty easy, they're all rectangles.
I included everything I thought was relevant. The way I'm doing it seems like it'll get extremely cumbersome and error-prone, so was wondering what I should do different. Tutorials links specifically on OOP game design would be nice.