#1, "Object Oriented structure should always map to well defined mental concepts in the problem domain," is a recipe for producing excessively complex code. You end up focusing on the parts themselves, instead of their interactions, which is actually the important part.
It leads to unintuitive behavior:
whereas also: not to mention: IMO this would be better, more flexible approach: