C++OOAD design principles