软件设计,编码规范_第1页
软件设计,编码规范_第2页
软件设计,编码规范_第3页
软件设计,编码规范_第4页
软件设计,编码规范_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

软件设计,编码规范篇一:软件开发编码规范软件开发编码规范 (C#) 1 2 3 4 5 6 目录 引言 . 3 编写目的 .3 背景 .3 定义 .3 参考资料 .3 基本要求. 3 程序结构要求 .3 可读性要求 .3 结构化要求 .4 正确性与容错性要求 . 4 可重用性要求 .5 用户界面设计原则 .5 源程序书写规范 .5 通用源代码格式规则 . 5 缩进 .5 边距 .6 “”的使用 . 6 注释 .6 语句格式与语句书写规范 . 6 括号 .6 保留字和关键字 . 7 函数 .7 变量 .7 语句 .7 命名规范. 9 函数命名 .9 形参 .9 常量和变量 .9 常量和宏定义 .(来自: 小龙文 档网:软件设计,编码规范) 9 变量 .9 函数使用说明、接口命名、NameSpace 命名 10 控件的命名 .11 类型 .11 一般类型 . 11 构造类型 . 12 类类型 .12 文件和文件夹 . 12 文件夹的命名规则 . 12 文件命名 . 13 源程序文档注释规范 .13 注释文档的一般规范 . 13 1 引言编写目的 本规范旨在用规范文件的形式,对全公司使用 C#进行的编程过程,进行有效的规范管理,使得最终的软件产品具有良好的风格和统一的结构,且使代码可读性强、易维护。 本规范预期读者是全公司所有参与编程的软件开发人员以及其他相关人员。 本标准适用于 Visual C# ,其余语言作参考。 背景 公司在上一个项目中由于代码编写风格不统一,可读性较差、较难维护,使得工作效率有所降低。 定义 无 参考资料 Pascal Standards FAQ (E) JavaDoc (E) Doc-O-matic Document (E) Artemis Alliance Delphi Coding Standards (E) C#基本书写规范 C#编码规范纲要 2 基本要求 程序结构要求 程序结构清晰,简单易懂,单个函数的程序行数一般不得超过 100行,个别特殊函数除外。 代码中打算干什么,要简单,直接了当,代码精简,避免垃圾程序。 应尽量使用.NET 库函数和公共函数(无特殊情况不要使用外部方法调用 windows的核心动态链接库)。 一般情况下,不得使用全局变量,尽量使用局部变量。可读性要求 可读性第一,效率第二。 (这仅对代码本身而言) 。 保持注释与代码完全一致。 每个源程序文件,都必须有文件头说明,说明规格见“源程序文档注释规范”一节。 每个函数,都必须有函数头说明,说明规格见“源程序文档注释规范”一节。 主要变量(结构、联合、类或对象)定义或引用时,注释必须能反映其物理含义。 处理过程的每个阶段都必须有相关注释说明。在典型算法前都必须有注释, 同时算法在满足要求的情况下应尽可能简单。 利用缩进来显示程序的逻辑结构,缩进量一致以 Tab键为单位,定义 Tab为 4 个 字节。 循环、分支层次不要超过五层。 注释可以与语句在同一行,也可以在上行。 空行和空白字符也是一种特殊注释。 一目了然的语句不加注释。 注释的作用范围可以为:定义、引用、条件分支以及一段代码。 注释行数(不包括文件头和函数头说明部份)应占总行数的 1/5 到 1/3。 常量定义(const)有相应说明。 结构化要求 禁止出现两条等价的支路。 禁止 GOTO语句。 用 IF 语句来强调只执行两组语句中的一组。禁止 ELSE GOTO 和 ELSE RETURN。 用 CASE 实现多路分支。 避免从循环引出多个出口。 函数只有一个出口。 不使用复杂的条件赋值语句。 避免不必要的分支。 不要轻易用条件分支去替换逻辑表达式。 正确性与容错性要求 程序首先是正确,其次是优美。 无法证明你的程序没有错误,因此在编写完一段程序后,应先回头检查。 改一个错误时可能产生新的错误,因此在修改前首先考虑对其它程序的影响。 所有变量在调用前必须被初始化。 对所有的用户输入,必须进行合法性检查。 不要比较浮点数的相等,如: * = , 不可靠。 程序与环境或状态发生关系时,必须主动去处理发生的意外事件,如文件能否逻辑锁定、打印机是否联机等,对于明确的错误,要有明确的容错代码提示用户。 单元测试也是编程的一部份,提交联调测试的程序必须通过单元测试。 尽量使用规范的容错语句。 例如: try catch finally 可重用性要求 重复使用的完成相对独立功能的算法或代码应抽象为服务或类。 服务或类应考虑面向对象(OO)思想,减少外界联系,考虑独立性或封装性。 3 用户界面设计原则 除标题部分外,所有显示给用户的字体(如 BUTTON和 LABEL等)使用标准字体:宋 体、九号、黑色;标题部分可用醒目的字体,如:宋体、小二号、红色。 采用Windows缺省的风格。 窗体尽量从已有的父窗体继承。 方便用户对信息的输入、修改和阅读。 验证用户输入的有效性和合理性。 具有清晰明确的用户提示信息。 使用 Tab键在输入项之间移动输入焦点(可选) 。 标准按钮大小必须相同,使用的图像和标题必须与界面风格规范一致,如果出现该规范中没有的地方,须与项目负责人和美工协商。 4 源程序书写规范 通用源代码格式规则 缩进 缩进就是每级间有一个 Tab单位。不要在源代码中放置制表符。这是因为,制表符的宽度随着不同的设置和代码管理实用程序(打印、文档及版本控制等)而不同。 沿逻辑结构行缩进代码。没有缩进,代码将变得难以理解,如:if(expression ) / /此处填写你的代码块; / if(expression ) / /此处填写你的代码块; / 篇二:软件开发编码规范软件安全开发编码规范 1. 代码编写 1) 开发人员应保证工程中不存在无用的资源(如代码、图片文件等) 。 2) 代码中每个类名上的注释必须留下创建者和修改者的名字。 3) 每个需要 import的类都应使用一行 import声明,不得使用 import xxx.*。 4) ()仅在调试时使用,正式代码里不应出现。 5) 开发人员编写代码时应遵循以下命名规则: ? ? ? ? ? Package 名称应该都是由一组小写字母组成; Class 名称中的每个单词的首字母必须大写; Static Final 变量的名称全用大写,并且名称后加注释; 参数的名称必须和变量的命名规范一致; 使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名称。 6) 代码应该用 unix的格式,而不是 windows的。 7) exit 除了在 main 中可以被调用外,其他的地方不应被调用。 8) 代码中应尽量使用 interfaces,不要使用abstract类。 9) 在需要换行的情况下,尽量使用 println 来代替在字符串中使用的“n“。 10) 涉及 HTML的文档,尽量使用 transitional文件类型,其中所有 HTML标签都应关闭。 11) 在 HTML、JavaScript、XML 代码中,缩进应为两个空格,不得使用 Tab。 12) HTML标签的 name和 id属性的命名方式应与Java变量名相同。 13) 在需要经常创建开销较大的对象时,开发人员应考虑使用对象池。 14) 在进行 log的获取时开发人员应尽量使用isXXXEnabled。 15) log 的生成环境上尽量避免输出文件名和行号。 16) 产品中不要包含后门代码,隔离系统中的后门代码,确保其不能出现在产品中。作为一种特殊的调试代码,后门访问代码是为了使开发者和测试工程师访问一部分终端用户不能访问的程序代码。但是,如果后门代码被留到产品中,对攻击者来说,它就是一条不需要通过正常安全手段来攻陷系统的通路。 2. JAVA 安全遵循下面列出的准则有利于编写更加安全的代码。但是总体来说,这些准则不能对安全性做出任何保证。遵循这些准则可能好的实践,但是即使遵循了这些准则,写出的代码仍然可能是不安全的。风险永远存在,不管在编写代码时是如何的警觉。 这些准则的目标,不是为了保证代码的安全性,而是为了消除若干特定类型攻击带来的风险。遵循这些准则,某些特定类型的攻击将无法实现;但是其它类型的攻击仍然可能成功。因此遵循这些准则仅仅是安全的第一步。当书写可能和非守信链接或混用的代码时,应当仔细的考虑如下准则: ? ? ? ? ? ? ? 静态字段 缩小作用域 公共方法和字段 保护包 尽可能使对象不可变(immutable) 序列化 清除敏感信息 1) 静态字段 避免使用非 final的公共静态变量,应尽可能地避免使用非 final公共静态变量,因为无法判断代码有无权限改变这些静态变量的值。 一般地,应谨慎使用可变的静态状态,因为这可能导致设想中应该相互独立的子系统之间发生不曾预期的交互。2) 缩小作用域 作为一个惯例,尽可能缩小成员方法和成员变量的作用域。检查包访问权限成员(package-private)能否改成私有成员(private) ,保护访问成员(protected)可否改成包访问权限成员(package-private)/私有成员(private)等等。 3) 公共方法/字段 公共变量应当避免使用,访问这些变量时应当通过getter/setter法。在这种方式下,必要时可以增加集中的安全检查。 任何能够访问或修改任何敏感内部状态的公共方法,务必包含安全检查。 参考如下代码段,该代码段中不可信任代码可能修改 TimeZone的值: 4) 保护包 有时需要整体上保护一个包以避免不可信任代码的访问,本节描述了一些防护技术: ? 防止包注入:如果不可信任代码想要访问类的包保护成员,可能通过在被攻击的包内定 义自己的新类用以获取这些成员的访问权的方式。防止这类攻击的方式有两种: a. 通过向文件中加入如下文字防止包内被注入恶意类。 当检测到代码试图在包内定义新类时,类装载器的defineClass方法会抛出异常,除非代码被赋予以下权限:b. 另一种方式是通过将包放到封闭的 JAR(sealed Jar)文件里。(参看 sdk/docs/guide/extensions/) 通过使用这种技巧,代码无法获得扩展包的权限,因此也无须修改 文件。 ? 防止包访问:可以通过限制包访问但同时仅赋予特定代码访问权限防止不可信任代码对 包成员的访问。通过向文件中加入如下文字可以达到这一目的: 当检测到代码试图访问上述包中的类时,类加载器的loadClass方法会抛出异常,除非代码被赋予以下权限:5) 尽可能使对象不可变(immutable)尽可能使对象不可变。如果对象必须改变,使得它们可以克隆并在方法调用时返回副本。如果方法调用的返回对象是数组、向量或哈希表等,牢记这些对象并非不可变,调用者可以修改这些对象的内容并导致安全漏洞。此外,不可变的对象因为不用上锁所以能够提高并发性。不要返回包含敏感数据的内部数组引用。 这个不可变惯例的变型,在这儿提出是因为是个常见错误。即使数组中包含不可变的对象比如说是字符串,也要返回一个副本,这样调用者不能修改数组中包含的到底是哪个字符串。在方法调用返回时,返回数据的拷贝而不要返回数组。 6) 不要直接在用户提供的数组里存储 这是不可变惯例的另一个变型。构造器和方法可以接受对象数组,比如说 PubicKey数组,这个数据存储到内部之前应当克隆,并保存克隆后的数据,而不是直接将数组引用赋给同样类型的内部变量。如果缺少这个步骤,在使用了有问题的构造器创建了对象后,用户对外部数组所作的任何修改都将更改对象的内部状态,尽管对象应该是不可变的。 7) 序列化 对象在序列化后、反序列化之前,都不在 Java运行时环境的控制之下,也因此不在 Java平台提供的安全控制范围内。 在实现接口 Serializable时务必将以下事宜牢记在心: ? transient 直接引用系统资源的句柄和包含了地址空间相关信息的字段应当使用关键字 transient修饰。资源,如文件句柄,如果不被声明为 transient,该对象在序列化状态下可能会被修改,从而在被反序列化后获取对资源的不当访问。? 特定类的序列化/反序列化方法 为了确保反序列化对象不包含违反一些不变量集合的状态,类应该定义自己的反序列化方法并使用接口ObjectInputValidation验证这些变量。 如果一个类定义了自己的序列化方法,它就不能向任何 DataInput/DataOuput方法传递内部数组。所有的DataInput/DataOuput方法都能被重写。注意默认序列化不会向 DataInput/DataOuput字节数组方法暴露私有字节数组字段。 如果 Serializable类直接向 DataOutput(write(byte b)方法传递了一个私有数组,那么黑客可以创建ObjectOutputStream的子类并覆盖 write(byte b)方法,这样他可以访问并修改私有数组。下面示例说明了这个问题。 示例类: private synchronized void writeObject(ObjectOutpu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论