First off the question itself is flawed, you don't define classes in CSS. The class should be determined by the content, and that means the HTML, NOT what you are doing in the CSS!
To me the big question is WHAT is it, or WHY is it getting a class... and the big thing I try to never do is based it on what something looks like. I also try when possible/practical to use ACTUAL words (typically camelcased) like "top", or "mainMenu", or "content" for my ID's or classes.
It's all about maintaining that separation of presentation from content since you may reskin; you may have multiple skins; you may have multiple appearances depending on the media target...
... and that's why classes like "red" or "column-left" are to my point of view mouth-breathing halfwit nonsense. I hold the same opinion of outright ignorant asshattery like OOCSS and ignorant time-wasting bandwidth wasting crap like preprocessors like LESS and SASS. IF you actually find those to "make it easier" or "improve your workflow" or even "write less CSS" then there is most always something horrifyingly and terrifyingly WRONG with your markup!
I also avoid using classes when I don't need them; that's something about BEM that bugs the hell out of me is how just plain stupid it is by pretty much actively encouraging people to throw classes at everything instead of leveraging semantics. Even some formerly useful tools like CSSLint are hopping on this bandwagon of "Don't use complex selectors" out of some ignorant claims about "rendering speed" -- when a P133 running IE 5.5 can handle CSS2 old-school, worrying about render time from complex selectors in the age where multi-ghz runs off batteries fitting the palm of your hand is 100% grade A farm fresh BS -- particularly when in most cases it means transferring more code!
See the classic example you'll come across like this:
<div id="mainMenu">
<ul class="mainMenuUl">
<li class="mainMenuLi">
<a href="/" class="mainMenuA">Home</a>
</li>
<li class="mainMenuLi">
<a href="/forums" class="mainMenuA">Forums</a>
</li>
<li class="mainMenuLi">
<a href="/links" class="mainMenuA">Links</a>
</li>
<li class="mainMenuLi">
<a href="/about" class="mainMenuA">About Us</a>
</li>
</ul>
</div>
In 70%+ of layouts there's no reason for the wrapping DIV as there's very little you can do to a div you can't do to the UL, if all the child elements are getting the same classes, none of them need classes! That train wreck of ineptitude doing the job of:
<ul id="mainMenu">
<li><a href="/">Home</a></li>
<li><a href="/forums">Forums</a></li>
<li><a href="/links">Links</a></li>
<li><a href="/about">About Us</a></li>
</ul>
There's an old saying, CSS is only as good as the markup it's applied to -- which is why if you are slapping classes in there where you don't NEED them, you're making more code, making it harder to maintain, and making the whole mess slower.
See the outright ignorant nonsense commonly found in turdpress templates sleazed together by people not qualified to even be making websites such as:
<li class="page_item page-item-2 current_page_ancestor current_page_parent">
<a href="mysite.com/about" title="About">About</a>
<ul class='children'>
<li class="page_item page-item-5 current_page_item">
<a href="mysite.com/about/contact-us" title="Contact us">Contact us</a>
</li>
... with the endless pointless classes for nothing, absolute URI for nothing, redundant title attributes (if title is the same as the content there should be no reason to use a title) -- it shows that generally speaking the majority of people involved in making templates for wordpress have zero damned business making templates for anything! The ignorance and ineptitude shown on the part of such developers is mind-numbing.
Of course, I say the same thing about all the so called HTML/CSS "frameworks" since by their very nature they use presentational classes... quite often uselessly cryptic ones at that thanks to goofy abbreviations. It seems people dumb enough to "need" bootstrap or its kine (never has the archaic plural for cows been more appropriate) are too lazy to type out full words telling you what things are... that DESPITE this "brevity" that makes tweets look verbose, they STILL manage to double the markup AND CSS you'd have without the bloated framework garbage -- NOT counting the framework against the total -- shows just how idiotic all that garbage is.
There's a reason I tell people who get duped into using "bootcrap" to go find a stick to scrape it off with before tracking it all over the Internet's carpets... as evidenced by dumbass halfwit garbage like this:
<section id="services">
<div class="container">
<div class="row">
<div class="col-lg-12 text-center">
<h2 class="section-heading">So !!!!ing Creative</h2>
<hr class="primary">
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-lg-3 col-md-6 text-center">
<div class="service-box">
<i class="fa fa-4x fa-globe wow bounceIn text-primary"></i>
<h3>
... again a stunning example of "IF you don't know what's wrong with this, do the world a favor, back the !!!! away from the keyboard, and go take up something less detail oriented like macramé.
IF you care about efficiency, speed, separation of presentation from content, and accessibility, you're going to be leveraging selectors and elements to use less classes. You're also going to be using classes to say what things are and WHY they are receiving style, NOT what that style is.
Failing to do so isn't just bad practice, it is completely missing why HTML and CSS are (where?) separate specifications in the first place! Your result WILL be a bloated inaccessible mess lacking graceful degradation. Anyone telling you otherwise is packing you so full of sand you could change your name to Sahara.