software refactoring and design principles 7097518