designing object oriented software