[python 译] 基于面向对象的分析和设计
[python 译] 基于面向对象的分析和设计
[python 译] 基于面向对象的分析和设计
Table of Contents
2 引言
2.1 译者
特别在编程语言的学习过程中, 通常会纠结在语言本身的细节中, 然后发现学习的过程变得越来越枯燥, 以至于最后放弃了这门才刚刚起步的语言, 投身到新的一个轮回中. 因为他们忘记了: 快乐来自于创造. 当然起先掌握一门语言还是很有必要的.
2.2 作者
我(以下文中的我均指作者)将描述在运用python的语言建立一些东西的过程, 这些描述更适用于运用python面向对象的特性的时候. 这里, 我所说的过程是面向通常问题时, 你需要一步一步完成的步骤, 当然这并不意味着你需要奴役于这些条条框框. 它通常是解决很多编程问题的一个起点, 但并不是唯一的一个方法. 你可以选择, 也可以不选择.
具体的过程如下:
- 用写和绘画的方式, 对问题进行描述
- 从第一步中提取出关键的概念, 然后对它进行研究
- 对这些关键概念建立类的层次关系和对象图
- 编写相应的类代码和测试代码
- 重复进行改善
整个过程是从上至下的, 也就是说, 它是从一个很细微的, 很抽象的一个想法出发, 慢慢地通过不停地改善逐渐成为能够编写的实例.
首先, 我会写出关于这个问题的所有东西, 并尽自己的能力进行思索. 也许我会画一个或两个示意图, 也许是像地图一样的东西, 甚至给自己写一系列描述该问题的邮件. 这让我有一个方式来表达关键性概念, 也让我清楚自己对这个问题有多少的了解.
然后, 我会浏览这些纪录, 图像以及相关的描述, 并且将最主要的部份提取出来. 有一个简单的方式能够实现它: 简单的制作一个 名词 和 动词 的列表, 然后给出两者之间的关系. 这些给了我一个很好的列表, 有助于我在下一步中, 对于类名, 对象名和方法名的确定. 我保留这份由概念组成的列表, 然后对于任何一个我不能够理解的内容进行改善.
当我拥有这样一份列表的时候, 我可以创建一个简单的由概念组成的大纲或是树, 以及它们如何成为类. 你通常可以拿着你的名词单, 并开始问自己 "这个名词是不是和别的, 意思相同? 这意味着它们有一个相同的父类, 那么这个父类叫什么呢?" 不断地重复提问回答地过程, 直到建立一个类关系图, 树图. 然后拿着你的动词表, 看这些动词是否是类的函数名, 然后将其放入到树图中.
当类的层次图建立后, 我开始用代码写基本的框架, 只有类名以及属于它们的函数, 没有其他内容. 然后写运行该程序的测试, 并且确信刚建立的类是有意义的, 并且能够正确地执行. 有时, 我会先写测试, 有时, 一边写测试一边写代码, 直到完成所有的工作.
最后, 不断的重复, 不断的改善, 在我添加更多的实现的时候让它变得越来越清晰. 如果我在某个概念或是某个问题无法解决的时候, 我会停下来, 再继续之前会重复上述的过程, 直到这些概念变得清晰.
接下来, 我会将上述的过程运用到一个游戏引擎实现的过程中.
3 The Analysis of the Simple Game Engine
这个将要实现的游戏叫做: Gothons from Planet Percal #25, 是一个小型的太空冒险游戏.
3.1 Write or Draw About the Problem
我将给出对游戏的一个简单的描述:
外星人入侵了一艘太空船, 我们的英雄为了能够成功的逃入救身舱驶向地球, 不得不穿过迷宫般的房间. 这个游戏非常像Zork或是其他冒险类游戏, 通过文字输出, 以及有趣的死亡方式. 这个游戏将包含运行所有房间或是场景的引擎. 当完家进入一个房间的时候, 都会出现相应的描述, 并且告诉引擎当出了这个地图后, 哪个房间将被运行.
此刻, 对于这个游戏有了一个基本的描述, 以及它将如何运行, 因此让我来描述一下每个场景:
- 死亡, Death
- 当完家死亡时会被触发, 应具有一定的娱乐性
- 中央过道, Central Corridor
- 那是一个开始点, 有一个Gothon已经站在了那里, 在开始之前首先要击败一个玩笑
- 激光武器库, Laser Weapon Armory
- 英雄能在这里获取中子炸弹, 用于在进入救身舱之前引爆. 它有一个输入盘, 需要猜测数字
- 桥, bridge
- 另一个有Gothon的战争场景, 英雄将在那里放置炸弹
- 救身舱, escape pod
- 当且仅当猜对正确的救身舱之后, 才能够逃离
现在, 我可能会根据上述的描述绘制地图, 或是为每个房间写更多的描述, 任何进入我的思维, 并且与这个问题相关的内容.
3.2 Extract Key Concepts and Research Them
列出相关的名词:
- 外星人, alien
- 玩家, player
- 船, ship
- 迷宫, maze
- 房间, room
- 场景, scene
- Gothon, (应该是外星人的名字, 译者)
- 逃身舱, escape pod
- 地球, planet
- 地图, map
- 引擎, engine
- 死亡, death
- 中央过道, central corridor
- 激光武器库, laser weapon armory
- 桥, the bridge
这里先跳过对动词进行列表.
此刻, 你应该研究每个概念, 并弄清楚每个不了解的概念. 例如, 我应该玩一些类似的游戏, 保证自己能够知道它是怎么运作的. 我应该研究船是怎么设计的, 以及炸弹是怎么工作的. 也许, 我还要研究一些技术性问题, 如, 如何将游戏状态存储到数据库中. 当我完成这些研究之后, 我应该基于新的描述重新回到第一步, 提取新的概念.
3.3 Create a Class Hierarchy and Object Map for the Concepts
当我到建立类层次关系这一步的时候, 开始向自己问 "什么和其他的东西相近呢?" "什么是其他东西的替代词呢?"
我发现当我需要做某些事情的时候, "room"和"scene"可以认为是相同的. 我选择了"scene". 然后我发现像"Central Corridor"这样的特殊的房间其实就是"scene". 我也将"Death"成为"Scene", 这也解释了我为什么在一开始选择了"scene"而没有选择"room". "maze"和"map"也是相同的, 我选择了"map". 由于我不相要制作一个战争系统, 所以我将"Alien"和"player"忽略了, 并将它们先保留着. 同时, "Planet"也可以成为一种特殊的"scene".
随后, 建立了类的层次关系:
- Map
- Engine
- Scene
- Death
- Central Corridor
- Laser Weapon Armory
- The Bridge
- Escape Pod
下面给出相应的动词, 用来描述不同情况下需要怎样的行为. 通过描述知道: 我需要运行引擎, 从地图中进入到下一个场景, 然后打开场景, 并且进入场景. 于是:
- Map
- nextscene
- openingscene
- Engine
- play
- Scene
- enter
- Death
- Central Corridor
- Laser Weapon Armory
- The Bridge
- Escape Pod
我将enter只放在了scene下面, 因为所有的场景都可以从"scene"中继承
译者添加:
class Map {
next_scene()
opening_scene()
}
class Engine {
play()
}
class Scene {
enter()
}
Death -up-|> Scene
CenterCorridor -up-|> Scene
LaserWeaponArmony -up-|> Scene
TheBridge -up-|> Scene
Escape -up-|> Scene

3.4 Code The Classes and a Test to Run Them
接下来, 我通常会将上面的three复制到我的源代码文件中, 然后按照它编写相应的类. 下面是一个简单的例子, 说明编写的类的初始状况:
class Scene(object):
def enter(self):
pass
class Engine(object):
def __init__(self, scene_map):
pass
def play(self):
pass
class Death(Scene):
def enter(self):
pass
class CentralCorridor(scene):
def enter(self):
pass
class LaserWeaponArmory(Scene):
def enter(self):
pass
class TheBridge(Scene):
def enter(self):
pass
class EscapePod(Scene):
def enter(self):
pass
class Map(object):
def __init__(self, start_scene):
pass
def next_scene(self, scene_name):
pass
def opening_scene(self):
pass
a_map = Map('central_corridor')
a_game = Engine(a_map)
a_game.play()
接下来就是重复以及完善了.
4 The Code for "Gothons from Planet Percal #25"
完整的代码示例请参见原文, The Code for "Gothons from Planet Percal #25"
Date: 2014-04-21 Mon
Author: Zhong Xiewei
Org version 7.8.11 with Emacs version 24
[python 译] 基于面向对象的分析和设计的更多相关文章
- OOAD 面向对象的分析与设计
OOAD 面向对象的分析与设计 OOA-----分析阶段(针对业务问题清晰视图, 列出系统完成任务, 整理业务的公共词汇, 列出解决业务的解决方法) O ...
- UML和模式应用1: 面向对象的分析与设计
1.基本术语说明 items note OOA/D 面向对象的分析与设计 UML 描述.构造和文档化系统制品的可视化语言 模式 问题解决方案的公式 2. 本书的主要内容 本书的主旨是对应用了UML和 ...
- UML分析与设计
考点: 掌握面向对象的分析与设计 掌握UML描述方法 用例图.类图.序列图.状态转换图 类图:类的属性.方法的识别:类间的各种关系 类图:实体.联系 各种关系图例: 泛化:取公共属性 关联分为聚合.组 ...
- Java 程序员应在2019年学习的10条面向对象(OOP)设计原则
面向对象的设计原则 是 OOP 编程的核心,但是我看到大多数 Java 程序员都在追求诸如 Singleton 模式,Decorator 模式或 Observer 模式之类的设计模式,而对学习面向 ...
- .NET应用架构设计—面向对象分析与设计四色原型模式(彩色建模、领域无关模型)(概念版)
阅读目录: 1.背景介绍 2.问自己,UML对你来说有意义吗?它帮助过你对系统进行分析.建模吗? 3.一直以来其实我们被一个缝隙隔开了,使我们对OOAD遥不可及 4.四色原型模式填补这个历史缝隙,让我 ...
- 基于UML的中职班主任工作管理系统的分析与设计--文献随笔(二)
一.基本信息 标题:基于UML的中职班主任工作管理系统的分析与设计 时间:2016 出版源:遵义航天工业学校 关键字:中职学校; 班主任工作管理; UML建模 二.研究背景 问题定义:班主任是一项特殊 ...
- 基于UML的毕业设计管理系统的分析与设计
基于UML的毕业设计管理系统的分析与设计 <本段与标题无关,自行略过 最近各种忙,天气不错,导师心情不错:“我们要写一个关于UML的专著”,一句话:“一个完整的系统贯穿整个UML的知识”:我:“ ...
- UML和模式应用学习笔记-1(面向对象分析和设计)
UML和模式应用学习笔记-1(面向对象分析和设计) 而只是对情节的记录:此处的用例场景为:游戏者请求掷骰子.系统展示结果:如果骰子的总点数是7,则游戏者赢得游戏,否则为输 (2)定义领域模型:在领域模 ...
- 《UML和模式应用》读书笔记(一)面向对象分析和设计简单示例
在开始进行对象分析和设计之前,先通过“扔骰子”这个软件(游戏者扔两个骰子,如果总是是7,则赢,否则输),来简单分析下这个过程. 1:用例 需求分析,可能包括人们如何应用的场景或情节,这些都可以被编写成 ...
随机推荐
- Smack 3.3.1 发布,Java 的 XMPP 开发包
Smack 3.3.1 发布了,这是一个小更新版本,主要更新包括: [SMACK-441] - Memory leak in KeepAliveManager [SMACK-447] - Compre ...
- loadrunner agent 中删除失效的mmdrv进程
源码: using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; us ...
- 【腾讯Bugly干货分享】TRIM:提升磁盘性能,缓解Android卡顿
Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处.在业内,Android 手机一直有着 ...
- js for 循环中的 变量问题。
今日处理项目中的一个循环,本来就是一个小小的for循环,后来发现该段程序出现了问题,仔细检查代码没有发现其中的错误.无奈只好叫来了老大帮忙.通过在模版中断点调试(该方式只能自己写debugger断点) ...
- STC12C5A60S2笔记7(定时器)
1. 基本特性 STC12C5A60S2单片机集成了两个16位定时/计数器. 1)寄存器 1.1)TMOD 定时器工作方式控制寄存器,包括13位寄存器.16位寄存器.8位寄存器等: 1.2)TCON ...
- 【C语言学习】《C Primer Plus》第1章 概览
学习总结 1.C语言于1972年由贝尔实验室的Dennis Ritchie在与Ken Thompson一起设计UNIX操作系统的时候开发的.的的设计构想来源于Ken Thompson的B语言.Anyw ...
- Unity3d使用经验总结 数据驱动篇
我这里说的数据驱动,不是指某种框架,某种结构,或者某种编码方式. 我要说的,是一种开发方式. 大家都知道,U3D中,我们可以为某个对象编写一个脚本,然后将这个脚本挂在对象上,那这个对象就拥有了相应的能 ...
- 如何成为一个Xamarin专家
近期,我们发布了 Xamarin studio 6,这个版本充满了美妙的新特性,能够更有效的帮助我们的开发工作.由于其深层次的 IDE 比较复杂,同时我们也很难去发现并记得那些对我们最有帮助的特性,所 ...
- redis常用命令小结
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/107.html?1455867352 1.redis-benchmarkr ...
- EF架构~通过EF6的DbCommand拦截器来实现数据库读写分离
回到目录 前几天看了一个基于sqlserver的负载均衡与读写分离的软件Moebius,实现的方式还是不错的,这使得用sqlserver数据库的同学时有机会对数据库进行更有效的优化了