Skip to content
Yijia Liu edited this page May 3, 2015 · 4 revisions

编程风格

该程风格是对Google 开源项目风格指南针对LTP进行的本土化。

1. 头文件

1.1 define 保护

所有头文件都应该使用 #define 防止头文件被多重包含,命名格式为: __LTP_<SUBMODULE>_<FILE>_H__。 举分词模块配置头文件为例src/segmentor/settings.h

#ifndef __LTP_SEGMENTOR_SETTINGS_H__
#define __LTP_SEGMENTOR_SETTINGS_H__
...
#endif  //  end for __LTP_SEGMENTOR_SETTINGS_H__

1.2 #include 的路径及顺序(in progress)

项目内头文件应按照项目源代码目录树结构排列, 避免使用 UNIX 特殊的快捷目录 . (当前目录) 或 .. (上级目录). 例如, ltp/src/utils/logging.hpp应该按如下方式包含:

#include "utils/logging.hpp"

2. 命名空间

2.1 ltp::submodule

各子模块的实现需要使用命名空间

namespace ltp {
namespace submodule { // 不缩进
...
} // end for namespace submodule [必须]
} // end for namespace ltp [必须]

保护。

6. 命名约定

注意:使用拼音命名是一种被厌恶的行为

6.1. 通用命名规则

推荐使用unix命名风格,例如:

int num_recall_words;

不推荐使用匈牙利命名风格中的,m_MemberFunction

7. 注释

7.2 函数相关的注释

对于函数,推荐使用如下风格的注释

/**
 * <a long description to your function>
 *
 *  @param[<in, out or in/out>]  <arg-name>  <type-name>  <argument description>
 *  ...
 *  @return <type-name> <return value description>
 */

这种注释被doxygen理解,可以便捷地产生文档。效果参考:http://oneplus.github.io/ltp-doxygen/

8. 格式

8.1 行长度

80 个字符是最大值. 这样一个考虑是22inch显示器分两屏可以同时显示两份代码或显示代码的同时进行编译测试。

8.2 非 ASCII 字符(in progress)

实际在中文文本处理程序里,非ASCII字符是难以避免的。然而这种问题通常来自于汉字的字典或表,分句模块要用到比如句子结束符字典。 对于这个问题,推荐的方法是将非ASCII字符单独存为头文件,同时将其转换为十六进制编码。

注意:不允许在项目中使用中文注释

测试

1. 静态检查

现阶段,LTP开发者使用cppcheck进行静态检查。

cppcheck --enable=all -f src/ >& cppcheck.report

请尽可能解决cppcheck.report中提到的performance相关的问题。

2. 动态检查

现阶段,LTP开发者使用valgrind进行内存检查。

在编译并部署ltp_data之后,请运行

valgrind --tool=memcheck --leak-check=full ./bin/ltp_test conf/ltp.cnf srl test_data/test_utf8.txt >& valgrind.report

获得valgrind测试结果。

由于分词、词性标注、命名实体识别以及依存句法分析模块使用了单件模式抽取特征,测试报告中会提示这部分的内存definitely lost,可以忽略。

3. Server异常返回测试

在编译并部署ltp_data之后,请运行,可以测试ltp_server是否正常工作,以及返回值是否正常。

这个脚本会向ltp_server发起不同类型(正确请求、编码错误等)。

在ltp_server运行的条件下,运行

python request_ltp.py

4. 单元测试

5. 速度测试

6. 使用boost

当前版本的LTP使用boost.regexboost.program_optionsboost.algorithm.string四个库。