[python 译] 基于面向对象的分析和设计

 

[python 译] 基于面向对象的分析和设计

2 引言

 

2.1 译者

特别在编程语言的学习过程中, 通常会纠结在语言本身的细节中, 然后发现学习的过程变得越来越枯燥, 以至于最后放弃了这门才刚刚起步的语言, 投身到新的一个轮回中. 因为他们忘记了: 快乐来自于创造. 当然起先掌握一门语言还是很有必要的.

2.2 作者

我(以下文中的我均指作者)将描述在运用python的语言建立一些东西的过程, 这些描述更适用于运用python面向对象的特性的时候. 这里, 我所说的过程是面向通常问题时, 你需要一步一步完成的步骤, 当然这并不意味着你需要奴役于这些条条框框. 它通常是解决很多编程问题的一个起点, 但并不是唯一的一个方法. 你可以选择, 也可以不选择.

具体的过程如下:

  1. 用写和绘画的方式, 对问题进行描述
  2. 从第一步中提取出关键的概念, 然后对它进行研究
  3. 对这些关键概念建立类的层次关系和对象图
  4. 编写相应的类代码和测试代码
  5. 重复进行改善

整个过程是从上至下的, 也就是说, 它是从一个很细微的, 很抽象的一个想法出发, 慢慢地通过不停地改善逐渐成为能够编写的实例.

首先, 我会写出关于这个问题的所有东西, 并尽自己的能力进行思索. 也许我会画一个或两个示意图, 也许是像地图一样的东西, 甚至给自己写一系列描述该问题的邮件. 这让我有一个方式来表达关键性概念, 也让我清楚自己对这个问题有多少的了解.

然后, 我会浏览这些纪录, 图像以及相关的描述, 并且将最主要的部份提取出来. 有一个简单的方式能够实现它: 简单的制作一个 名词动词 的列表, 然后给出两者之间的关系. 这些给了我一个很好的列表, 有助于我在下一步中, 对于类名, 对象名和方法名的确定. 我保留这份由概念组成的列表, 然后对于任何一个我不能够理解的内容进行改善.

当我拥有这样一份列表的时候, 我可以创建一个简单的由概念组成的大纲或是树, 以及它们如何成为类. 你通常可以拿着你的名词单, 并开始问自己 "这个名词是不是和别的, 意思相同? 这意味着它们有一个相同的父类, 那么这个父类叫什么呢?" 不断地重复提问回答地过程, 直到建立一个类关系图, 树图. 然后拿着你的动词表, 看这些动词是否是类的函数名, 然后将其放入到树图中.

当类的层次图建立后, 我开始用代码写基本的框架, 只有类名以及属于它们的函数, 没有其他内容. 然后写运行该程序的测试, 并且确信刚建立的类是有意义的, 并且能够正确地执行. 有时, 我会先写测试, 有时, 一边写测试一边写代码, 直到完成所有的工作.

最后, 不断的重复, 不断的改善, 在我添加更多的实现的时候让它变得越来越清晰. 如果我在某个概念或是某个问题无法解决的时候, 我会停下来, 再继续之前会重复上述的过程, 直到这些概念变得清晰.

接下来, 我会将上述的过程运用到一个游戏引擎实现的过程中.

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

Validate XHTML 1.0

[python 译] 基于面向对象的分析和设计的更多相关文章

  1. OOAD 面向对象的分析与设计

      OOAD  面向对象的分析与设计            OOA-----分析阶段(针对业务问题清晰视图, 列出系统完成任务,  整理业务的公共词汇,  列出解决业务的解决方法)         O ...

  2. UML和模式应用1: 面向对象的分析与设计

    1.基本术语说明 items note OOA/D  面向对象的分析与设计 UML 描述.构造和文档化系统制品的可视化语言 模式 问题解决方案的公式 2. 本书的主要内容 本书的主旨是对应用了UML和 ...

  3. UML分析与设计

    考点: 掌握面向对象的分析与设计 掌握UML描述方法 用例图.类图.序列图.状态转换图 类图:类的属性.方法的识别:类间的各种关系 类图:实体.联系 各种关系图例: 泛化:取公共属性 关联分为聚合.组 ...

  4. Java 程序员应在2019年学习的10条面向对象(OOP)设计原则

    面向对象的设计原则 是 OOP 编程的核心,但是我看到大多数 Java 程序员都在追求诸如 Singleton 模式,Decorator 模式或 O​​bserver 模式之类的设计模式,而对学习面向 ...

  5. .NET应用架构设计—面向对象分析与设计四色原型模式(彩色建模、领域无关模型)(概念版)

    阅读目录: 1.背景介绍 2.问自己,UML对你来说有意义吗?它帮助过你对系统进行分析.建模吗? 3.一直以来其实我们被一个缝隙隔开了,使我们对OOAD遥不可及 4.四色原型模式填补这个历史缝隙,让我 ...

  6. 基于UML的中职班主任工作管理系统的分析与设计--文献随笔(二)

    一.基本信息 标题:基于UML的中职班主任工作管理系统的分析与设计 时间:2016 出版源:遵义航天工业学校 关键字:中职学校; 班主任工作管理; UML建模 二.研究背景 问题定义:班主任是一项特殊 ...

  7. 基于UML的毕业设计管理系统的分析与设计

    基于UML的毕业设计管理系统的分析与设计 <本段与标题无关,自行略过 最近各种忙,天气不错,导师心情不错:“我们要写一个关于UML的专著”,一句话:“一个完整的系统贯穿整个UML的知识”:我:“ ...

  8. UML和模式应用学习笔记-1(面向对象分析和设计)

    UML和模式应用学习笔记-1(面向对象分析和设计) 而只是对情节的记录:此处的用例场景为:游戏者请求掷骰子.系统展示结果:如果骰子的总点数是7,则游戏者赢得游戏,否则为输 (2)定义领域模型:在领域模 ...

  9. 《UML和模式应用》读书笔记(一)面向对象分析和设计简单示例

    在开始进行对象分析和设计之前,先通过“扔骰子”这个软件(游戏者扔两个骰子,如果总是是7,则赢,否则输),来简单分析下这个过程. 1:用例 需求分析,可能包括人们如何应用的场景或情节,这些都可以被编写成 ...

随机推荐

  1. Top ShooterHDU2863&&继续xxx定律HDU3784

    继续xxx定律 HDU3784 先看这个题目:HDU3782 #include<iostream> #include<algorithm> #include<stdio. ...

  2. cocoapods安装以及使用,安装过程中ruby版本过低

    cocoapods安装以及使用,安装过程中ruby版本过低 字数473 阅读103 评论1 喜欢2 1.打开终端 2.移除现有 Ruby 默认源 $ gem sources --remove http ...

  3. MediaWiki安装与配置(Ubuntu 10.4)

    实验室准备发布一个网站,本来是准备外包给别人做的,后来自己调研了一下,发现也没有想象的复杂和困难,于是最近一周自己吭哧吭哧地把网站搭好了. 之所以使用Mediawiki,一是考虑到是以实验室发布,不想 ...

  4. Service简介

    Service是在一段不定的时间运行在后台,不和用户交互应用组件.每个Service必须在manifest中 通过<service>来声明.可以通过contect.startservice ...

  5. 据说练就了一指禅神功的觅闻实时手机新闻网,正以每天2000+IP的用户量递增。有智能手机的可以当场进行体验,没有的就算了哈

    据说练就了一指禅神功的觅闻实时手机新闻网,正以每天2000+IP的用户量递增.有智能手机的可以当场进行体验,没有的就算了哈 觅闻实时手机新闻网  http://m.yunxunmi.com 在IOS. ...

  6. 使用Ivy管理项目中的依赖

    Ivy是什么 Ivy是一个跟踪管理项目直接以来关系的工具.Ivy具有良好的灵活性和可配置性,使其可以适应各种不同的依赖管理和构建过程要求:虽然Ivy作为依赖管理工具,其可以与Apache Ant进行紧 ...

  7. C#的函数柯里化

    前面说到了C#的泛型委托和闭包函数,在函数是程序设计里还有一个重要特征是柯里化... 柯里化就是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结 ...

  8. ENode 1.0 - Command Service设计思路

    开源地址:https://github.com/tangxuehua/enode 上一篇文章,介绍了enode框架的物理部署思路.本文我们再简单分析一下Command Service的API设计: C ...

  9. Entity Framework 5.0系列之约定配置

    Code First之所以能够让开发人员以一种更加高效.灵活的方式进行数据操作有一个重要的原因在于它的约定配置.现在软件开发越来复杂,大家也都试图将软件设计的越来越灵活,很多内容我们都希望是可配置的, ...

  10. java提高篇(十九)-----数组之二

    前面一节主要介绍了数组的基本概念,对什么是数组稍微深入了一点点,在这篇博文中主要介绍数组的其他方面. 三.性能?请优先考虑数组 在java中有很多方式来存储一系列数据,而且在操作上面比数组方便的多?但 ...