团队项目技术规格说明书v1.0
以下技术规格说明书的撰写是按照《构建之法》的“技术说明书”的相关内容,主要思路是用功能驱动设计
一.从功能流程中提取所需的对象:
在这个WBS图的基础上,对首先要实现的基本功能进行了如下设计分析:
外包软件开发功能描述:
外包开发的功能流程和细节如上图所示,从流程的分析中,我们其实可以从中提取出这么几个对象:
- 外包任务类,描述一个外包任务的类,其中包含了任务目标,任务报酬等等属性。
- 外包任务产生类,就是需求的提出方,是用来产生外包任务的
- 公司类,就是你所要经营的这个公司,接受外包任务并完成
- 职员类,外包任务的完成需要每一位员工的工作
- Date类,我们需要一个类来记录时间
- 会计类,我们需要一个类来管理收入支出,并做好相应的记录
当然这里仅仅简单的描述提取出的类,具体的属性和方法的定义后面再说。
职员雇佣和解雇功能描述:
职员雇佣和解雇的简单的功能流程如上所示,我们可以从中提取出的模型有:
- 人才市场类,即管理可雇佣人员的类
- 公司的人才管理类,我们可能需要让一个公司设置一个人事部来管理所有的职员
UI模块:
这里UI的设计需要和cocos creator的特性结合起来,cocos creator本身在属性选择器中提供了很多属性的确定,而且也提供了很多api来动态的确定属性,这里UI模块的分析我决定采用一个原型图一个原型图来分析。
1. 开始界面原型图
如图所示,这是游戏开始界面,这里不再赘述
2. 游戏界面
左上角是当前日期,右上角是当前资金,中间是场景,下面是菜单栏,分别为开发
,人事
,系统设置
,注意到有个待解锁
功能是用户一开始仅能实现接外包和人员的雇佣和解雇,更多的功能是当用户的资金和人员达到某个目标时再解锁,关于下一阶段的游戏核心功能目前还在讨论中,所以这里先这样决定。
最下面是状态栏,用于显示开发进度等信息。
3. 接受任务界面
在这里你可以看到所有任务的描述
4. 雇佣界面
你可以看到每个职员的信息,并决定是否雇佣,解雇与此类似
5. 设置界面
以上只是简单的UI原型设计,实际开发时,这些界面的用户体验才是最重要的。
二.具体功能的设计
经过我们开发组的讨论和整个组的审核,我们目前制定了如下的游戏内部功能api设计:
1. ProjectGenerator
properties:
1. Project projects_[N]
保存了上次产生的 N
个任务的信息,一开始是 null
,一旦调用一次 createProject
后更新,所以 ProjectGenerator
不仅可以产生任务还会负责监管任务,就好比自己有一个外包项目需要交给外包公司来做,那么自己需要监视外包公司是否及时完成
functions:
1. void createProject()
根据难度评价逻辑产生可选的任务并保存到projects_
数组中
2. void failProject(Project project)
设置这个project
对应的项目的state
为已接受但未完成
;
设置这个project
对应项目的完成时间;
降低对这个公司的能力的评价;
3. void finishProject(Project project)
根据这个 project
返回这个任务的报酬,并调用公司的profit
;
同时设置这个 project
对应的标志位为被接受且已完成;
设置这个project
对应项目的完成时间
同时会增加这个这个 project
对应公司的评价;
2. Project
properties:
1. 需要达到的三个标准(object require_):
UI的优劣程度(number require_.ui
),
功能的优劣程度(number require_.func
),
BUG的数量(number require_.bugnum
).
2. 目前达到的三个标准(object current_):
目前UI的优劣程度(number current_.ui
),
目前功能的优劣程度(number current_.func
),
目前BUG的数量(number current_.bugnum
).
3. 状态位(eState state_)
一个项目目前自己有这么几种状态:
- 已产生但未被接受 对应0
- 被接受且尚未完成 对应1
- 被接受已经被完成 对应2
- 被接受却失败 对应3
相应的枚举变量eState
已经定义在了相应的文件中
4. 种类(string category_)
供以后扩展,现在可以先不考虑具体逻辑
5. 种类(string category_)
属于哪一类
(可能有的种类之后会扩展)
6. 报酬(number reward_)
这个项目的酬金
7. deadline(number deadline_)
这个项目最长几天需要完成
8. 所属公司(Company company_)
这个项目被交给哪个公司完成
9. 接受时间(number receiveDay_)
现在规定时间按天为单位,所以这里需要记录下来接受时在第几天
10. 完成时间(number finishDay_)
记录下完成时在第几天,可以提供给评价公司成绩时使用,或者记录时使用
Functions:
1. void augment(string attribute, number increment)
@require:attribute 属于{"ui"
,"func"
,"bugnum"
}之一,表示要增加的属性的类型;increment >=0 表示增加的数值;
attribute对应的属性增加相应的数值
2. boolean isFinished()
根据当前的三个属性的值和目标值判断是否已经完成
3. boolean isOverdue()
根据当前时间和项目被接受时间判断是否已经逾期
4. 这里省去各种各样的set方法和get方法
3. Company
properties:
1. Account account_
自己的会计部门,负责资金的管理和记录
2. PersonControl personControl_
自己的人事部门,负责人员的雇佣,解雇,培养,工作
3. Project project_
考虑到如果你在做一个项目,那么就不能做另一个项目,所以这里我把这个属性设置为一个
多个项目以后有时间好好规划后再拓展
functions:
1. receiveProject(Project project)
@require:project!=null && project.repOK()(这个project合法)
在用户选中了一个任务,并点击了确定
按钮后,会触发这个方法;
设置project
的开始时间,改变其状态为已接受但未完成
设置project_
为project
;
调用 personControl_
的 work
方法开始工作;
3. boolean profit(number num, string cause)
调用account_
的profit方法
4. boolean expend(number num, string cause)
调用account_
的expend方法
5. boolean hire(Person person)
调用 personControl_
的hire
,如果返回 false
,那么雇佣失败,返回 false
如果雇佣成功,那么返回true
6. boolean fire(Person person)
调用 personControl
的 fire
,这里可以增加相应的提示信息,
7. showPersons()
调用personControl_
的showPersons
方法返回当前所有职员信息
4. Account
会计类负责账单的记录和资金管理
properties:
1. gold_
表示当前的资金
2. records_
表示资金流动记录(待考虑)
functions:
1. void profit(number num, string cause)
gold_+=num;
同时记录下cause
2. boolean expend(number num,string cause )
计算gold_-num
- 如果结果小于0,那么结合可能的UI提示信息,并return false
- 如果结果大于等于0,那么记录下相应的cause,并return true
3. boolean isEnough(number num)
判断当前资金gold_
是否够num
的支出
3. update(dt)
随时更新相应的label为当前的金钱
5. PersonControl
管理职员的类
propertites:
1. 职员数组 persons_[]
当前员工的数组
2. 当前员工数量 currentNum_
当前有多少员工
3. 当前最大员工数量 maxNum_
当前最多可以有多少员工
5. boolean flag_
是否在工作状态,默认值为false,表示不在工作状态
(这个状态主要用于update时的判断)
6. 要做的 Project project_
functions:
1. boolean hire(Person person)
@require:自己的列表中没这个person且这个person合法
判断是不是人员已满:
- 如果当前已满,那么可以提示一些信息,并返回false
- 如果没满,那么增加这个员工并返回true
2. fire(Person person)
@require: 自己的列表中有这个员工且在这个person合法
从数组中去掉这个员工,返回true
3. void work(Project project)
表示要开始做这个项目
更新自己要做的project_
;
调用每个员工的work
;
设置自己的flag
为true;
4. stop()
设置自己的flag
为false;
调用每个人的stop
;
5. void commit()
遍历所有员工,调用每个人的commit方法;
然后判断当前project_
是否已经完成:
- 如果当前项目已经完成了,那么先调用自己的
stop
方法,并直接调用projectGenerator
的finishProject
方法(因为projectGenerator
的全局性,这里不需要通过Company来传递了); - 如果当前项目并未完成,那么判断:
- 如果当前项目已经逾期,那么我们先调用自己的
stop
方法,并调用projectGenerator
的failProject
方法(我们的公司是个诚实的公司...原来是想着让projectGenerator
来判断,但是那样projectGenerator
需要一直检查,不如在这里让公司自己判断项目是不是逾期,逾期自动触发相应逻辑) - 如果还没有逾期,那么什么都不做
- 如果当前项目已经逾期,那么我们先调用自己的
6. showPersons()
返回所有person的信息,这里可以自己选择合适的形式
6. update()
每隔一段时间(待确定多长),判断如下逻辑;
- 如果当前状态
flag
为false,表示不工作,什么也不做(或许这里可以用于加上动画的控制) - 如果当前状态
flag
为true,那么调用自己的commit
方法;
6. Person
properties:
1. 描述一个人能力的6个属性(object ability_):
都是整数:
编程能力 ability_.coding
管理能力 ability_.management
架构能力 ability_.structure
测试能力 ability_.test
艺术能力 ability_.art
创新能力 ability_.creativity
2. 薪资 salary_
一个人每个月需要的工资
3. 状态 state_
这个人目前的状态,可能有:①闲着②工作③放假
状态与这个人物表现出的动作有关
4. 所属公司 company_
引用,这个人所属的公司
5. 正在做的任务 project_
Functions:
1. getCommit()
根据这个人的能力值,获得他在一段时间(这里还有待商榷,需要确定职员对项目每隔多长时间贡献一次)内可以对项目的属性贡献多少(这里的算法涉及到人员的能力->对项目属性的贡献 这个转化算法)
而且要根据project当前已经达到的点数来确定自己的贡献值,对于已经达到目标的属性不需要增加了
2. commit()
先通过this.getCommit() 获得自己可以做的贡献点数
然后通过project.augment()方法增加对应的点数
3. work(Project project)
表示要开始工作了;
设置当前 project_
;
设置自己的工作状态为工作状态;
4. stop()
设置自己的状态为闲着
7. Date
存储当前的日期
properties:
1. number time_
以天为单位的日期,初始为0,每隔speedPerday增加1
2. number speedPerday_
每隔多少帧增加一天,在设置游戏速度可能会用到,会设置正常和较快两个档位
3. number count_
距离上次日期更新后过了多少帧
functions:
1. void updateDate()
time_+=1
当遇到每个月第一天就发出员工工资支付事件
2. number getDate()
return time_
(经过测试,update的执行顺序是按照场景中的结点从上到下,从父到子依次执行的,所以我这里把Date组件放在最前面)
3. update()
根据count_
和speedPerday_
来更新时间
4. string getDate()
return 以某种格式的日期,供UI使用
8. PersonGenerator
人才市场吧算是
properties:
1. Person persons_[]
可供选择的人员数组
functions:
1. showPersons()
返回每个person的信息,供UI显示
2. removePerson(Person person)
在用户点击雇佣
按钮后,会触发这个函数
调用Company的hire
方法,
- 如果返回true,那么就在自己的列表中去掉这个person
- false可能有信息的提示,具体再定
3. addPerson(Person person)
在用户点击解雇
按钮后触发这个函数
调用Company的fire
方法,
- 如果返回true。那么就把这个person加入到自己的列表中
目前api文档还在更新和补充中...