我在原来的公司上班时,所有的用户手册都有一个Document Team来负责。每次添加一个新的功能或者对功能进行更改,我们都需要开一个Document Bug,然后Document Team会根据描述信息来更新文档,最终给用户提供一个全面、符合当前软件系统的用户指南。现在我们团队也正在开发一个OSGi.NET平台的产品,这种SDK类的产品如果没有一个专业的用户指南就显得很不专业了。这个产品的RC2版本还没有很好的文档,仅是提供一个基于Word的用户指南和一个API的CHM说明书。现在我们正在为这个产品编写专业的用户指南,因此我就把如何使用工具来编写用户指南的过程在这里做一个描述。
1 用户指南效果图
UIOSP是一个基于OSGi.NET的动态模块化平台,通俗一点,就是一个插件平台。目前用户指南已经编写到“如何创建主程序”这一节了。用户指南由两大部分组成:(1)平台使用指南;(2)API说明书。CHM格式的帮助文档如下所示:
当然,你还可以生成HTML的格式,如下:
接下来我将分别介绍如何来编写平台使用指南和API说明书,由于API说明书比较简单,因此,我把API说明书编写介绍放在前面。
2 如何编写用户指南
2.1 工具
这个用户指南是使用Sandcastle和SandcastleBuilder这两个工具来编写的,你可以从http://sandcastle.codeplex.com/和http://shfb.codeplex.com/站点上下载到这两个工具。安装完成后,你可以运行Sandcastle Help File Builder来创建一个帮助文档项目,我在《[产品开发经验总结] 软件产品背后的冰山一角》已经提到这2个工具了。如下图,我新建了一个UIOSP User Guide的项目,在Documentation Sources添加了UIShell.OSGi.dll和UIShell.OSGi.WebExtension.dll两个API Doc Sources。此外,我还创建了一个UserGuide.content的“平台使用指南”目录。最还,更改了一些用户手册的属性,比如HelpFileFormat我指定的是HtmlHelp1和WebSite。
2.2 API说明书编写
API说明书的编写比较简单,它可以根据我们编写的类的注释生成的XML文件自动的创建出来。API说明书编写的步骤如下:
(1)为类添加注释
为类或者方法添加注释的方式很简单,只要以“///”开头,VS IDE就自动给你生成如下格式的注释。不过,它默认的只有Summary、参数和返回值。
1
///
<summary>
2
///
3
///
</summary>
4
///
<typeparam name="ServiceInterface"></typeparam>
5
///
<param name="serviceInstance"></param>
6
public
void
AddService
<
ServiceInterface
>
(
object
serviceInstance)
7
{
8
Framework.AddSystemService(
typeof
(ServiceInterface), serviceInstance);
9
}
VS IDE的注释还提供了其它的XMl节点,比如Example、Code、Para等,以下是使用这些节点编写的一个API说明,它在说明里面除了简单注释之外,还举了一个使用API的例子。
1
///
<summary>
2
///
添加一个全局服务。
3
///
</summary>
4
///
<typeparam name="ServiceInterface">
服务接口。
</typeparam>
5
///
<param name="serviceInstance">
服务实现。
</param>
6
///
<example>
7
///
<para>
该方法可以在BundleRuntime启动之前添加一个全局服务,从而所有的插件都可以获取并使用。以下是其用法。
</para>
8
///
<code>
9
///
using(BundleRuntime bundleRuntime = new BundleRuntime(@"D:\UIOSP\MyShell\plugins"))
10
///
{
11
///
Console.WriteLine("Enter 'exit' key to exit...");
12
///
// 添加一个全局服务。
13
///
bundleRuntime.AddService
<![CDATA[<ILogService>
]]>(new MyLogService());
14
///
bundleRuntime.Start(); // 启动模块插件运行时。
15
///
Console.ReadLine();
16
///
}
17
///
</code>
18
///
</example>
19
public
void
AddService
<
ServiceInterface
>
(
object
serviceInstance)
20
{
21
Framework.AddSystemService(
typeof
(ServiceInterface), serviceInstance);
22
}
当生成API之后,其对应的内容如下图所示。它包含了方法的注释、参数的注释、使用语法、示例。
一般而言,常见的注释XML如下:
1
<
c
>
text
</
c
>
-- 文本中指定为代码
2
<
code
>
content
</
code
>
-- 多行代码
3
<
para
>
content
</
para
>
-- 段落
4
<
see
cref
="member"
/>
-- 链接
5
<
param
>
-- 参数
6
<
seealso
cref
="member"
/>
-- 显示also列表
7
<
example
>
description
</
example
>
-- 示例
8
<
exception
cref
="System.Exception"
>
Thrown when...
</
exception
>
-- Exception声明
9
<
remarks
>
description
</
remarks
>
-- 备注
10
<
list
type
="bullet"
| "number" | "table"
>
-- 列表
11
<
listheader
>
12
<
term
>
term
</
term
>
13
<
description
>
description
</
description
>
14
</
listheader
>
15
<
item
>
16
<
term
>
term
</
term
>
17
<
description
>
description
</
description
>
18
</
item
>
19
</
list
>
(2)更改项目属性生成注释XML文件
这个步骤比较简单,只需要把“XML文档文件”勾上并指定生成目录就可以了。
(3)添加Doc Sources
接着我们可以使用SandcastleBuilder添加Doc Sources,然后添加一个dll就可以了。
(4)设置需要生成的API的类集合
对于一个SDK而言,暴露过多没有意义的API会对用户造成混淆,因此,我们可以通过SandcastleBuilder来设置不需要生成API的命名空间或者类。如下图所示,你可以通过项目的ApiFilter来设置过滤。
2.3 平台使用指南编写
2.3.1 创建平台使用指南的目录
首先点击项目属性右键,添加“New Item”,选择Content Layout,即文档目录。
然后双击Layout文件,在左侧将显示给目录内容,这样,你可以为目录添加一些节点。首先点击“右键”,然后选择“Add Sibling Topic”来添加一个一级节点。
创建完成后,你可以为一级节点通过“Add Child Topic”菜单添加字节点,这样你就可以构建像UIOSP用户指南的目录了。
2.3.2 编写指南文件
在上面描述的,每一级目录都有一个aml文件,这个文件是这级目录的内容。接下来我们需要填充一些内容。以下示例建立了一个具有示例代码、图片的AML文件。
1
<?
xml version="1.0" encoding="utf-8"
?>
2
<
topic
id
="73dfeeb5-c3c9-444f-b23d-b7dc24d3cd2f"
revisionNumber
="1"
>
3
<
developerConceptualDocument
xmlns
="http://ddue.schemas.microsoft.com/authoring/2003/5"
xmlns:xlink
="http://www.w3.org/1999/xlink"
>
4
<
introduction
>
5
<
para
>
该小节向您介绍如何创建Movies插件。该插件为整个应用系统提供了“Movie List”页面——Default.aspx和“Create New Movie”页面——CreateNew.aspx。
</
para
>
6
</
introduction
>
7
<
section
address
="CreatePlugin"
>
8
<
title
>
创建插件项目
</
title
>
9
<
content
>
10
<
para
>
添加一个新建项目,项目模板为UIOSP目录下的“ASP.NET Web空白插件”,名为MoviesPlugin,项目目录位于Plugins下。
</
para
>
11
</
content
>
12
</
section
>
13
<
section
address
="CreateModel"
>
14
<
title
>
创建数据模型
</
title
>
15
<
content
>
16
<
para
>
添加一个Movie类,这个类定义了这个插件的数据模型,其定义如下。目前该类只是提供了一些模拟的数据。
</
para
>
17
<
code
language
="cs"
>
18
<![CDATA[
19
using System;
20
using System.Collections.Generic;
21
using System.Linq;
22
using System.Web;
23
namespace MoviesPlugin.Model
24
{
25
/// <summary>
26
/// Movie实体定义。
27
/// </summary>
28
public partial class Movie
29
{
30
public string Title { get; set; }
31
public DateTime ReleaseDate { get; set; }
32
public string Genre { get; set; }
33
public string Rating { get; set; }
34
public float Price { get; set; }
35
}
36
}
37
]]>
38
</
code
>
39
</
content
>
40
</
section
>
41
<
section
address
="CreateCreateNewPage"
>
42
<
title
>
创建CreateNew.aspx
</
title
>
43
<
content
>
44
<
para
>
到目前为止,MoviesPlugin已经创建完毕。接下来我们将创建一个可重用的LogsPlugin插件,并利用它提供的服务来记录Movie记录操作日志。关于目前解决方案的内容,请查看“Step2-MoviesPlugin.zip”文件,创建的MoviesPlugin插件内容如图3-17所示。
</
para
>
45
<
para
>
46
<
mediaLink
>
47
<
caption
><
legacyBold
>
图3-17 MoviesPlugin插件内容
</
legacyBold
></
caption
>
48
<
image
xlink:href
="3_17_MoviesPluginContentScreen"
/>
49
</
mediaLink
>
50
</
para
>
51
</
content
>
52
</
section
>
53
</
developerConceptualDocument
>
54
</
topic
>
图片通过以下XML来添加。
<para>
<mediaLink>
<caption><legacyBold>图3-17 MoviesPlugin插件内容</legacyBold></caption>
<image xlink:href="3_17_MoviesPluginContentScreen"/>
</mediaLink>
</para>
代码通过以下XMl来添加。
<code language="cs">
<![CDATA[
using System;
……
]]>
</code>
有关图文并茂、包括示例代码的帮助编写就先简单的介绍到这。:)