object oriented design concepts in software engineering