Scientific Software Design: The Object-Oriented Way