昨天终于基础软件中心开了第一次碰头会,老师让我坐汽车电子方面的小头目。虽然不是很情愿,但是也得做啊。第一件事,要把同学的一些要用到的知识补充一下。经过昨天晚上到12点多的努力,终于把学习计划弄了个差不多。不要浪费了,Post到这里来。

学习计划(Draft)

何宗键

2004年10月21日

一、编程语言

1.1 C / C++语言基础

熟练的掌握一两门编程语言是对软件工程师的基本要求。C / C++已经被广泛的运用于系统编程和应用编程。因此,我们建议大家能够熟练的掌握C / C++语言的基本语法。在工作的时候不被小的细节困惑。

1.2 面向对象,多态,泛型

C++仅仅是一门工具,隐藏在C++背后的含义,也就是它所表现出来的思想,是面向对象(Object-Oriented)与泛型(Generic Programming)。因此在掌握这门工具的同时,希望大家能体会一下OO,Polymorphism与GP的涵义。

此外,学习语言不能仅仅停留在书本,一定要多动手实践。希望能通过一两个有一定代码量的程序,掌握这些技术。可以结合后面Windows程序设计的内容,编写一些有功能的代码(例如:扫雷,聊天程序等等)。

1.3 参考资料

基础

《C++ Primer》By Stanley Lippman

《The C++ Programming Language, Special Edition》 By Bjarne Stroustrup

可任选一本,主要讲述C++语言的语法。

提高

《深度探索C++对象模型》 By Stanley Lippman :重点论述了C++面向对象程序设计的底层机制,包括结构式语意,暂时性对象的生成、封装、继承和虚拟。

《标准程序库–自修教程与参考手册》 侯捷译:介绍如何使用STL编程的详细参考书

二、技术与工具

2.1 Windows程序设计

虽然Windows平台不会成为汽车电子的开发平台,但是Win32 API编程在软件开发中有深远的影响。Windows CE的编程接口采用与Win32 API的一个子集。和欣操作系统的编程接口中也有Win32兼容层。因此希望以前没有编写过Win 32程序的同学可以补充一下这方面的知识。包括API编程,图形界面,消息机制的等。

2.2 组件,构件,中间件技术

和欣操作系统采用CAR(Common Application Runtime)构件技术编写,其API也通过CAR接口提供,因此我们要熟悉相应的组件技术。CAR组件与微软的COM组件相当类似,但是又不完全相同。学习的时候,我们可以参考微软的COM组件,理解组件的来历,优点。以及接口,引用计数等等概念。

2.3 参考资料

基础

《Windows 程序设计(第5版)(上、下册)》 By Charles Petzold :如果对Windows开发有什么问题的话,请翻阅PetZold的著作吧。演示了基本的Win32程序设计的API核心内容。

《COM技术内幕——微软组件对象模型》:由浅入深的讲述COM组件的来龙去脉。

提高

《MFC Windows 程序设计(第2版)》 By Jeff Prosise:向读者讲述了MFC程序设计中的基本概念和主要技术。

《深入浅出MFC》 By 侯捷 :分析了MFC的具体工作原理。

《COM本质论》 By Don Box :由一流的权威撰写,揭示了COM的本质,旨在帮助开发人员真正理解COM的为什么,而不仅限于怎么使用。

http://msdn.microsoft.com :微软MSDN,包罗万象。

三、软件工程管理

3.1 代码编码规范

我们书写的程序不仅要编译器能懂,更重要的是可以团队之间进行交流。采用良好的编码规范书写的程序,不仅清晰美观,而且很容易被其他同事接受。代码规范包括源代码格式,源文件组织和命名规范等。我们可以参考科泰世纪的员工编码规范,可以参考附录1。

3.2 源代码 管理

首先,大家应该弄清楚一个概念,为什么要进行源代码管理。然后,才能在工作中自然的使用源代码管理。常见的源代码管理工具有微软的Visual SourceSafe(VSS),开放源代码的Concurrent Version System(CVS)等等。和欣操作系统的开发采用CVS对源代码进行管理。建议大家先熟悉源代码管理的一些基本概念,例如:Check in,Check out,Tag,Branch等等,然后结合CVS来进行学习。

3.3 BUG和工作管理

BUG管理主要是开发和测试人员对开发中产生的Bug的生命周期进行管理。工作管理包括员工的日报告,周报告和阶段工作总结等。

此部分内容我们可以学习科泰世纪的“和欣软件工程管理工具”。

附录1:科泰世纪编程规范

科泰世纪公司内部编程规范

源代码格式

源代码格式规范包括两部分内容:

•行格式

•操作符格式

以下为详细说明。

行格式

•每行代码的长度不能超过80个字符(注:长表达式应在低优先级操作符处拆分成新行,操作符放在新行之首,以便突出操作符。同时拆分出的新行要进行适当的缩进,使排版整齐,语句可读)。

•行尾不能带有空格(注:编辑器vi,UltraEdit,VC等通过设置保存文件时过滤行尾多余空格)。

•任何代码中都不能有Tab(注:编辑器vi,UltraEdit,VC等通过设置可将输入的Tab自动转换为4个空格)。

•程序代码层与层之间行首要相差4个空格,所以每行行首的空格都为4的整数倍。

•函数名之后不要留空格,紧跟左括号"("。

•代码分块符"{"和"}"格式说明:

1.if,else,while,for,do,switch需与其后的"{"同行,且"{"前需有一个空格。

2.struct,union,class,typedef,interface需与其后的"{"同行,且"{"前需有一个空格。

3.变量初始化时变量定义需与其后的"{"同行,且"{"前需有一个空格。

4.函数实现中函数名后的"{"需另起一行,在行首写。

5.【建议】其它情况下,代码分块符"{"和"}"应各自独占一行并且位于同一列,同时与引用它们的语句左对齐。

•if,else语句标准格式(注:第二种形式只能在没有多层if……else……嵌套时使用):

1.if (1) {

  1. some_statements;

3.}

4.

5.if (1) one_statement;

6.

7.if (1) {

  1. some_statements;

9.}

10.else {

  1. some_statements;

12.}

13.

14.if (1) {

  1. some_statements;

16.}

17.else if (1) {

  1. some_statements;

19.}

20.

操作符格式

•逗号","后需要有一个空格,前面不允许有空格。

•连续两个逗号","时,中间必须有一个空格。

•分号";"前面不允许有空格。

•以下二元运算符左右均必需包含一个空格:

1."<","<<",">>" 和 ">"。

2."=","==","+=","-=","*=","/=","|=","%="和"&="。

3."+","-", "*" ,"/","%","&","|"和"&&"。

•以下运算符左侧(或右侧)不能有空格:

1."++"和"–"("++" 和 "–" 不可以分开)的左侧(操作数在运算符左侧时)或者右侧(操作数在运算符右侧时)。

2."("号的右侧和")"号的左侧。

3.以下一元运算符的右侧:符号"+" ,"-" ,"*" ,"&"。

•"[]" ,".","->"这类操作符前后不加空格。

•【建议】不使用类似"variable == const"的逻辑表达式,应以"const == variable"来代替。例如:if (10 == iFlag) return;

•【建议】用括号"()"显式指明运算符优先级级别。

________________

科泰世纪科技有限公司 版权所有 2000年–2003年

科泰世纪公司内部编程规范

源文件组织

源文件组织规范包括三部分内容:

•目录

•文件

•注释

以下为详细说明。

目录

•【建议】按模块划分目录:每个目录对应一个模块。

•【建议】对于多个模块公用的头文件(.h),保存在与这些模块所在目录平级的inc目录中(注:可以视情况在inc目录中按照模块划分子目录)。

文件

•包含当前目录下头文件时使用#include "xxx.h",其他情况下使用#include

•不允许实现文件#include语句中包含路径。

•为了防止头文件被重复引用,应当用ifndef/define/endif结构产生预处理块(预编译宏的命名方式请参见“宏定义、枚举值”部分文档):

•#ifndef XXXXXXXXXX

•#define XXXXXXXXXX

•……

•#endif //XXXXXXXXXX

•头文件中不应进行全局变量定义和全局函数实现(注:inline函数实现除外)。

•实现文件(*.cpp或*.c)中被外部引用的所有全局变量和函数,应在该实现文件所对应的头文件中用extern进行显式声明,这样其它文件只需要包含该头文件即可。例如:

•foo.h:

•……

•extern void Foo(int, int);

•……

•foo.cpp:

•#include "foo.h"

•……

•void Foo (int nX, int nY)

•{

•……

•}

•……

•bar.cpp

•#include "foo.h"

•……

•Foo( de "foo.h"

•……

•Foo(nX1, nY1);

•……

•当对象调用自己的方法Foo()时,可以使用以下两种调用形式:(【建议】使用this->Foo()形式,以便与一般函数相区别,方便阅读)

•1、Foo();

•2、this->Foo();

•不允许使用try/throw/catch。

•【建议】过程退出前进行资源资源回收时或者跳出多层循环时可使用goto语句,其它情况下不鼓励使用goto语句。

•例1:过程退出前进行资源资源回收

•if (操作1失败) {

• goto ErrorExit;

•}

•if (操作2失败) {

• goto ErrorExit;

•}

•……

•if (操作n失败) {

• goto ErrorExit;

•}

•ErrorExit:

•统一清理操作;

•例2: 跳出多层循环

•for (int i = 1; i < 100; i++) {

• for (int j = 1; j < 100; j++) {

• goto ExitLoop;

• }

•}

•ExitLoop:

•……

注释

•【建议】单行注释用双斜杠"//"进行注释,多行注释鼓励使用多行"//"进行注释;原则上尽可能的不要使用"/**/"。

•注释模版的使用规则:

1.所有文件都应该包含文件头注释。

2.所有在多个模块中被使用的类和函数都应有相应的类声明注释以及函数实现注释。

•文件头部注释模版

•//==============================================================

•// 科泰世纪科技有限公司 版权所有 2000年–2003年•// Copyright (c) 2000-2003, KoreTide Corp. All Rights Reserved.
•//==============================================================
•【建议】有代码实现的文件中(头文件除外),重要修改注释模版(放在头部,紧跟在文件头部注释模版后)
•//==============================================================
•// Date :
•// Author :
•// Description :
•//==============================================================
•【建议】函数实现注释模版
•//==============================================================
•// Description :
•// Parameters :
•// Return :
•// Supplement :
•//==============================================================
•【建议】类声明注释模版
•//==============================================================
•// Description :
•//==============================================================

__________
科泰世纪科技有限公司 版权所有 2000年–2003年

科泰世纪公司内部编程规范
命名规则
命名规则包括五部分内容:
•文件名
•宏定义、枚举值
•常量、变量
•函数、代码标签
•数据类型
以下为详细说明。
文件名
•文件名应由能够表明其自身含义的一个或多个英文单词组成,以便于使用和他人阅读。
•【建议】按照每一个文件中所实现函数集合的功能命名该文件。
•【建议】文件名尽量遵从8.3格式,并全部使用小写字母(系统工具自动生成的文件除外)。
宏定义、枚举值
•宏定义、枚举值应由能够表明其自身含义的一个或多个英文单词组成,以便于使用和他人阅读。
•【建议】宏定义全部使用大写。
•【建议】枚举值采用Type_Value格式。例如颜色枚举值为Color_Red,Color_Blue,……。
•预编译宏的命名方式(ifndef/define/endif):前后各两个下划线,文件名与后缀用一个下划线分开。例如foo.h采用__FOO_H__(也可加入前缀ELASTOS:__ELASTOS_FOO_H__)。
常量、变量
•常量名、变量名需以小写字母开头。
•【建议】尽量在函数开始位置定义所有的重要变量。
•【建议】以i,j,k,……用作循环计数变量。
•【建议】常量名、变量名应由以下两部分组成:
1.小写前缀:用于标识常量和变量的类型。
2.能够表明其自身含义且首字母大写的一个或多个英文单词:用于标识常量和变量的功能。
•常量名、变量名小写前缀组成规则(按先后顺序排列):
1.表示变量作用域的前缀:
变量作用域前缀备注
成员变量m_
静态变量s_全局、局部静态变量、类静态成员变量
全局变量g_全局非静态变量
常量c_
2.表示变量类型的前缀:
变量类型前缀备注
引用rchar& rchX = chX;
指针p智能指针除外
二重指针pp
接口指针i
函数fn, pfn【建议】
EzArrayea【建议】EzXXX类数据类型
EzVarev
EzStres
EzStrBufesb
EzByteBufebb
EzWCharBufewb
EzPointep
BOOL b【建议】基本数据类型
BYTEby
CHARch
CHAR数组sz[]
CHAR *psz
WCHARwch
WCHAR数组wsz[]
WCHAR *pwsz
INTn
UINTu
DWORDdw
LONGl
PVOIDpv
WORDw
HRESULThr
UCHARuch
SHORTs
USHORTus
ULONGul
INT64n64
UINT64u64
FLOATf
DOUBLEdf
函数、代码标签
•【建议】函数名应由能够表明其自身含义且首字母大写的一个或多个英文单词组成,以便于使用和他人阅读。
•【建议】不要为函数名加任何附加前缀。
•函数名需首字母大写(C风格标准函数除外),但不能包含下划线"_",总长度不应该超过30个字符。
•goto标签按函数名相同的规则。
数据类型
•【建议】数据类型名应由能够表明其自身含义且首字母大写的一个或多个英文单词组成,以便于使用和他人阅读。
•struct、union、enum、interface、class命名规则:
1.【建议】class数据类型以类型标志C开头,interface数据类型以类型标志I开头。
2.class CFoo {
3.……
4.};
5.struct Bar {
6.……
7.};

________________________________________
科泰世纪科技有限公司 版权所有 2000年–2003年