OOP is good, in moderation. I've found that many programmers, especially those that have only used languages without formal module systems, tend to see OOP as the only way to modularize their code, keeping data hidden and encapsulated. Many times pro-OOP arguments tend to be solely about modularization, which is of course something you can do without OOP just fine (it's just verb-noun instead of noun-verb)
The greatest downside to OOP I've seen is that some people get way too into it, succumbing to a kind of mania. They feel the need to make everything be an object, even at the expense of simplicity. The result is "ravoli programming," where everything involves long inheritance chains, and it is difficult to see exactly what the code does because it's scattered across many files. Even Stroustrup (creator of C++) cautions against using inheritance and more than lightweight classes outside of fundamental libraries.
OOP shines when you think of it as sending arbitrary messages to things without having to worry about what those things are. In a game, you can call the "rotate" method of an object without worrying about whether it's a bullet, a tree, or a rocket. Similarly you can call the "give me your current position" method. Very nice. At the same time, you need to be careful here. "Rotate" may make sense for some objects but not for others. You don't want to make dissimilar things look functionally the same if they are too different.
The greatest downside to OOP I've seen is that some people get way too into it, succumbing to a kind of mania. They feel the need to make everything be an object, even at the expense of simplicity. The result is "ravoli programming," where everything involves long inheritance chains, and it is difficult to see exactly what the code does because it's scattered across many files. Even Stroustrup (creator of C++) cautions against using inheritance and more than lightweight classes outside of fundamental libraries.
OOP shines when you think of it as sending arbitrary messages to things without having to worry about what those things are. In a game, you can call the "rotate" method of an object without worrying about whether it's a bullet, a tree, or a rocket. Similarly you can call the "give me your current position" method. Very nice. At the same time, you need to be careful here. "Rotate" may make sense for some objects but not for others. You don't want to make dissimilar things look functionally the same if they are too different.