仅仅为了让你起步,以下是面向对象设计的一些直观指导。(摘自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()