仅仅为了让你起步,以下是面向对象设计的一些直观指导。(摘自python程序设计第三版)
(1)寻找候选对象。你的目标是定义一组有助于解决问题的对象。首先仔细考虑问题
陈述。对象通常由名词描述。你可以在问题陈述中划出所有名词,并逐一考虑。其中哪些
实际上会在程序中表示出来?哪些有“有趣”的行为?可以表示为基本数据类型(数字或
字符串)的东西可能不是重要的候选对象。似乎涉及一组相关数据项的东西可能是。
2)识别实例变量。一旦你发现了一些可能的对象,应考虑每个对象完成工作所需的
信息。实例变量有什么样的值?一些对象属性将具有基本类型的值,其他属性可能是复杂
的类型,表明需要其他有用的对象/类。努力为程序中的所有数据找到良好的“家庭”类。
(3)考虑接口。当你识别出潜在的对象/类和一些关联的数据时,请考虑该类的对象需
要哪些操作才能使用。你可以先考虑问题陈述中的动词。动词用于描述动作:必须做什么。
列出类需要的方法。请记住,对象数据的所有操作应通过你提供的方法进行。
(4)精化不简单的方法。一些方法看起来可以用几行代码来完成。其他方法则需要相
当大的努力来开发一种算法。使用自顶向下的设计和逐步求精来了解更多较难方法的细节。
随着你取得进展,可能会发现需要与其他类进行一些新的交互,这可能迫使你向其他类添
加新的方法。有时你可能会发现需要一种全新的对象,要求对另一个类进行定义。
(5)迭代式设计。在设计过程中,你会在设计新类和向已有类添加方法之间进行多次
反复。任何事情,只要似乎值得你注意,就为之投入工作。没有人以线性、系统的方式,
自顶向下来设计程序。在似乎应该取得进展的地方取得进展。
(6)尝试替代方案。不要害怕废除似乎不能工作的方法,也不要害怕探索一个想法,
看看它会把你带到哪里。良好的设计涉及大量的试错。当你查看他人的程序时,会看到完
成的作品,而不是他们实现的过程。如果程序设计良好,可能不是第一次尝试的结果。传
奇的软件工程师弗雷德·布鲁克斯(Fred Brooks)说过这样的名言:“计划扔掉一个。”通常
你用错误的方式构建了系统之后,才会真正知道如何构建系统。
(7)保持简单。在设计的每个步骤中,尝试找出解决手头问题的最简单方法。除非
需要更复杂的方法,否则不要设计出更加复杂的设计。接下来的部分将通过几个案例研
究,说明 OOD 的各个方面。一旦深入了解这些示例,你就可以处理自己的程序并提升
设计技巧。

 

# python 面向对象骰子类
# from random import *
# class MSdie:
#     def __init__(self, sides):
#         self.sides = sides
#         self.value = 1
#     def roll(self):
#         self.value = randrange(1, self.sides+1)
#     def getValue(self):
#         return self.value
#     def setValue(self, value):
#         self.value = value
# die1 = MSdie(6)
# die1.roll()
# print(die1.value)

# python 面向对象抛体类
# import math
# class Project:
#     def __init__(self, angle, velocity, height):
#         self.xpos = 0.0
#         self.ypos = height
#         theta = math.radians(angle)
#         self.xvel = velocity * math.cos(theta)
#         self.yvel = velocity * math.sin(theta)
#     def getX(self):
#         return self.xpos
#     def getY(self):
#         return self.ypos
#     def update(self, time):
#         self.xpos = self.xpos + time * self.xvel
#         yvel2 = self.yvel - time * 9.8
#         self.ypos = self.ypos + time * (self.yvel + yvel2) / 2
#         self.yvel = yvel2
#     def getInputs(self):
#         a = float(input("Enter the launch angle (in degrees): "))
#         v = float(input("Enter the initial velocity (in meters/sec): "))
#         h = float(input("Enter the initial height (in meters): "))
#         t = float(input("Enter the time interval between position calculations: "))
#         return a, v, h, t
#     def main(self):
#         angle, vel, h0, time = self.getInputs()
#         cball = Project(angle, vel, h0)
#         while(cball.getY() > 0):
#             cball.update(time)
#         print("\nDistance traveled: {0:0.1f} meters.".format(cball.getX()))
# p1 = Project(30, 3, 10)
# if __name__ == '__main__':
#     p1.main()

# 学生类
# class Student:
#     def __init__(self, name, hours, qpoints):
#         self.name = name
#         self.hours = float(hours)
#         self.qpoints = float(qpoints)
#     def getName(self):
#         return self.name
#     def getHours(self):
#         return self.hours
#     def getQpoint(self):
#         return self.qpoints
#     def gpa(self):
#         return self.qpoints / self.hours
#
# def makeStudent(infoStr):
#     name, hours, qpoints = infoStr.split()
#     return Student(name, hours, qpoints)    #返回的是一个对象
# def cmp(astudent):
#     return astudent.gpa()
# def main():
#     fileName = input("input the filename: ")
#     infile = open(fileName, 'r')
#     best = makeStudent(infile.readline())
#     for line in infile:
#         s = makeStudent(line)
#         if(s.gpa() > best.gpa()):
#             best = s
#     infile.close()
#     infile = open(fileName, 'r')
#     ls = []
#     for line in infile:
#         ls.append(makeStudent(line))
#     ls.sort(key = cmp)
#     for i in ls:
#         print(i.name, i.hours, i.gpa())
#     # print("The best student is:", best.getName())
#     # print("hours:", best.getHours())
#     # print("GPA:{:.2f}".format(best.gpa()))
#
# if __name__ == '__main__':
#     main()