Android编码规范 文档合集_第1页
Android编码规范 文档合集_第2页
Android编码规范 文档合集_第3页
Android编码规范 文档合集_第4页
Android编码规范 文档合集_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

1、android编码规范介绍为什么需要编码规范?编码规范对于程序员而言尤为重要,有以下几个原因: l 一个软件的生命周期中,80%的花费在于维护 l 几乎没有任何一个软件,在其整个生命周期中,均由最初的开发人员来维护 l 编码规范可以改善软件的可读性,可以让程序员尽快而彻底地理解新的代码 l 如果你将源码作为产品发布,就需要确任它是否被很好的打包并且清晰无误,一如你已构建的其它任何产品命名包命名命名规则:一个唯一包名的前缀总是全部小写的ascii 字母并且是一个顶级域名,通常是com,edu,gov,mil,net,org。包名的后续部分根据不同机构各自内部的命名规范而不尽相同。这类命名规范可能

2、以特定目录名的组成来区分部门 (department) ,项目(project),机器(machine),或注册名(login names)。例如: com.hymobile.nloc.activities规约:包命名必须以com.hymobile开始,后面跟有项目名称(或者缩写),再后面为模块名或层级名称。如:com.hymobile.项目缩写.模块名 com.hymobile.nloc.bookmark如:com.hymobile.项目缩写.层级名 com.hymobile.nloc.activities类和接口 命名命名规则:类名是个一名词,采用大小写混合的方式,每个单词的首字母大写。尽

3、量使你的类名简洁而富于描述。使用完整单词,避免缩写词(除非该缩写词被更广泛使用,像 url,html) 接口一般要使用able、ible、er 等后缀例如: class raster; class imagesprite;规约:类名必须使用驼峰规则,即首字母必须大写,如果为词组,则每个单词的首字母也必须要大写,类名必须使用名词,或名词词组。要求类名简单,不允许出现无意义的单词(如 class xxxactivity)。如:class bookmarkadd 正确如:class addbookreadplanactivity 错误! 应为 class bookreadplanadd方法的命名命名

4、规则:方法名是一个动词,采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写。例如: public void run(); public string getbookname();类中常用方法的命名:1. 类的获取方法(一般具有返回值)一般要求在被访问的字段名前加上get,如getfirstname(),getlastname()。一般来说,get前缀方法返回的是单个值,find前缀的方法返回的是列表值。2. 类的设置方法(一般返回类型为void):被访问字段名的前面加上前缀 set,如setfirstname(),setlastname().3. 类的布尔型的判断方法一般要求方

5、法名使用单词 is或has 做前缀,如ispersistent(),isstring()。或者使用具有逻辑意义的单词,例如equal 或equals。4. 类的普通方法一般采用完整的英文描述说明成员方法功能,第一个单词尽可能采用动词,首字母小写,如openfile(),addcount()。5. 构造方法应该用递增的方式写。(参数多的写在后面)。6. tostring()方法:一般情况下,每个类都应该定义tostring(),其格式为:变量命名命名规则:第一个单词的首字母小写,其后单词的首字母大写。变量名不应以下划线或美元符号开头,尽管这在语法上是允许的。变量名应简短且富于描述。变量名的选用应

6、该易于记忆,即,能够指出其用途。尽量避免单个字符的变量名,除非是一次性的临时变量。临时变量通常被取名为 i,j,k,m 和 n,它们一般用于整型;c,d,e,它们一般用于字符型。例如:string bookname; 规约:变量命名也必须使用驼峰规则,但是首字母必须小写,变量名尽可能的使用名词或名词词组。同样要求简单易懂,不允许出现无意义的单词。如:string bookname; 正确如:string booknamestring; 错误!成员变量命名同变量命名,但不要在私有变量前添加m字样!常量命名命名规则:类常量的声明,应该全部大写,单词间用下划线隔开。例如:static final i

7、nt min_width = 4; 例如:static final int max_width = 999; 例如:static final int get_the_cpu = 1; 异常命名自定义异常的命名必须以exception为结尾。已明确标示为一个异常。layout 命名规约:layout xml 的命名必须以 全部单词小写,单词间以下划线分割,并且使用名词或名词词组,即使用 模块名_功能名称 来命名。如:knowledge_gained_main.xml正确如:list_book.xml错误!id 命名规约:layout 中所使用的id必须以全部单词小写,单词间以下划线分割,并且使用

8、名词或名词词组,并且要求能够通过id直接理解当前组件要实现的功能。如:某textview +id/textbookname 错误 !应为 +id/book_name_show如:某edittext +id/textbookname 错误 !应为 +id/book_name_edit资源命名规约:layout中所使用的所有资源(如drawable,style等)命名必须以全部单词小写,单词间以下划线分割,并且尽可能的使用名词或名词组,即使用 模块名_用途 来命名。如果为公共资源,如分割线等,则直接用用途来命名如:menu_icon_navigate.png 正确如:某分割线:line.png 或

9、 separator.png 正确注释java 程序有两类注释:实现注释(implementation comments)和文档注释(document comments)。实现注释是使用/*.*/和/界定的注释。文档注释(被称为doc comments)由/*.*/界定。文档注释可以通过javadoc 工具转换成html 文件。文件注释所有的源文件都应该在开头有一个注释,其中列出类名、版本信息、日期和版权声明。如下: /* * 文件名 * 包含类名列表 * 版本信息,版本号 * 创建日期。 * 版权声明 */类注释每一个类都要包含如下格式的注释,以说明当前类的功能等。/* * 类名 * aut

10、hor 作者 *实现的主要功能。 *创建日期*修改者,修改日期,修改内容。*/方法注释每一个方法都要包含 如下格式的注释 包括当前方法的用途,当前方法参数的含义,当前方法返回值的内容和抛出异常的列表。/* * * 方法的一句话概述 * 方法详述(简单方法可不必详述) * param s 说明参数含义 * return 说明返回值含义 * throws ioexception 说明发生此异常的条件 * throws nullpointerexception 说明发生此异常的条件 */类成员变量和常量注释成员变量和常量需要使用java doc形式的注释,以说明当前变量或常量的含义/* xxxx含义

11、 */ 其他注释方法内部的注释 如果需要多行 使用/* */形式,如果为单行是用/形式的注释。不要再方法内部使用 java doc 形式的注释“/*/”,简单的区分方法是,java doc形式的注释在 eclipse中为蓝色,普通注释为绿色。xml注释规约:如果当前layout 或资源需要被多处调用,或为公共使用的layout(若list_item),则需要在xml写明注释。要求注释清晰易懂。代码风格缩进规约:不允许使用tab进行缩进,使用空格进行缩进,推荐缩进为2空格。空行空行将逻辑相关的代码段分隔开,以提高可读性。 下列情况应该总是使用空行: l 一个源文件的两个片段(section)之间

12、l 类声明和接口声明之间l 两个方法之间l 方法内的局部变量和方法的第一条语句之间l 一个方法内的两个逻辑段之间,用以提高可读性 规约:通常在 变量声明区域之后要用空行分隔,常量声明区域之后要有空行 分隔,方法声明之前要有空行分隔。行宽无特别规定,因为现在的显示器都比较大,所以推荐使用120进行设置。规约方法l 一个方法尽量不要超过15行,如果方法太长,说明当前方法业务逻辑已经非常复杂,那么就需要进行方法拆分,保证每个方法只作一件事。l 不要使用 try catch 处理业务逻辑!参数和返回值l 一个方法的参数尽可能的不要超过4个!l 如果一个方法返回的是一个错误码,请使用异常!l 尽可能不要

13、使用null, 替代为异常 或者使用空变量 如返回 list 则可以使用collections.emptylist()神秘的数代码中不允许出现单独的数字,字符!如果需要使用数字或字符,则将它们按照含义封装为静态常量!(for语句中除外)控制语句判断中如有常量,则应将常量置于判断式的右侧。如:if ( true = isadmin().尽量不使用三目条件的嵌套。所有if 语句必须用包括起来,即便是只有一句:if (true)/do something.if (true)i = 0; /不要使用这种对于循环:/不推荐方式_while(index products.getcount()/每此都会执行

14、一次getcount()方法,/若此方法耗时则会影响执行效率/而且可能带来同步问题,若有同步需求,请使用同步块或同步方法/推荐方式_/将操作结构保存在临时变量里,减少方法调用次数final int count = products.getcount();while(index = 0) ? x : -x21种代码的坏味道应该在编程中尽量避免这21种“坏味道”。duplicated code代码重复几乎是最常见的异味了。他也是refactoring 的主要目标之一。代码重复往往来自于copy-and-paste 的编程风格。long method它是传统结构化的“遗毒“。一个方法应当具有自我独立

15、的意图,不要把几个意图放在一起。large class大类就是你把太多的责任交给了一个类。这里的规则是one class one responsibility。divergent change一个类里面的内容变化率不同。某些状态一个小时变一次,某些则几个月一年才变一次;某些状态因为这方面的原因发生变化,而另一些则因为其他方面的原因变一次。面向对象的抽象就是把相对不变的和相对变化相隔离。把问题变化的一方面和另一方面相隔离。这使得这些相对不变的可以重用。问题变化的每个方面都可以单独重用。这种相异变化的共存使得重用非常困难。shotgun surgery这正好和上面相反。对系统一个地方的改变涉及到其

16、他许多地方的相关改变。这些变化率和变化内容相似的状态和行为通常应当放在同一个类中。feature envy对象的目的就是封装状态以及与这些状态紧密相关的行为。如果一个类的方法频繁用get 方法存取其他类的状态进行计算,那么你要考虑把行为移到涉及状态数目最多的那个类。data clumps某些数据通常像孩子一样成群玩耍:一起出现在很多类的成员变量中,一起出现在许多方法的参数中.,这些数据或许应该自己独立形成对象。primitive obsession面向对象的新手通常习惯使用几个原始类型的数据来表示一个概念。譬如对于范围,他们会使用两个数字。对于money,他们会用一个浮点数来表示。因为你没有使

17、用对象来表达问题中存在的概念,这使得代码变的难以理解,解决问题的难度大大增加。好的习惯是扩充语言所能提供原始类型,用小对象来表示范围、金额、转化率、邮政编码等等。switch statement基于常量的开关语句是oo 的大敌,你应当把他变为子类、state 或strategy。parallel inheritance hierarchies并行的继承层次是shotgun surgery 的特殊情况。因为当你改变一个层次中的某一个类时,你必须同时改变另外一个层次的并行子类。lazy class一个干活不多的类。类的维护需要额外的开销,如果一个类承担了太少的责任,应当消除它。speculativ

18、e generality一个类实现了从未用到的功能和通用性。通常这样的类或方法唯一的用户是testcase。不要犹豫,删除它。temporary field一个对象的属性可能只在某些情况下才有意义。这样的代码将难以理解。专门建立一个对象来持有这样的孤儿属性,把只和他相关的行为移到该类。最常见的是一个特定的算法需要某些只有该算法才有用的变量。message chain消息链发生于当一个客户向一个对象要求另一个对象,然后客户又向这另一对象要求另一个对象,再向这另一个对象要求另一个对象,如此如此。这时,你需要隐藏分派。middle man对象的基本特性之一就是封装,而你经常会通过分派去实现封装。但是

19、这一步不能走得太远,如果你发现一个类接口的一大半方法都在做分派,你可能需要移去这个中间人。inappropriate intimacy某些类相互之间太亲密,它们花费了太多的时间去砖研别人的私有部分。对人类而言,我们也许不应该太假正经,但我们应当让自己的类严格遵守禁欲主义。alternative classes with different interfaces做相同事情的方法有不同的函数signature,一致把它们往类层次上移,直至协议一致。incomplete library class要建立一个好的类库非常困难。我们大量的程序工作都基于类库实现。然而,如此广泛而又相异的目标对库构建者提出

20、了苛刻的要求。库构建者也不是万能的。有时候我们会发现库类无法实现我们需要的功能。而直接对库类的修改有非常困难。这时候就需要用各种手段进行refactoring。data class对象包括状态和行为。如果一个类只有状态没有行为,那么肯定有什么地方出问题了。refused bequest超类传下来很多行为和状态,而子类只是用了其中的很小一部分。这通常意味着你的类层次有问题。comments经常觉得要写很多注释表示你的代码难以理解。如果这种感觉太多,表示你需要refactoring。eclipse配置方法注释模板在eclipse 的preferences 中,选择 java code style

21、code template 1. 添加文件创建日志模板2.设置类注释模板导入方法在eclipse 的preferences 中,选择 java code style code template 中选择 import,选择附件中的文件。但是注意修改 类注释 和 文件注释 的作者名称为自己的!格式化模板在eclipse 的preferences 中,选择 java code style formatter 中选择 import,选择附件中的文件。xml格式化在eclipse 的preferences 中,选择 xml xml files xml editor 中 做如下设置android项目编码规

22、范l命名规范命名规范使程序更易读,从而更易于理解。它们也可以提供一些有关标识符功能的信息,以助于理解代码,不论它是一个常量、包、还是类。需要注意的是:1.使用完整的英文描述来命名2.避免命名超长(15 个字符以内比较好)3.避免相似的命名。例如:persistentobj 和persistentobjs 不要一起使用;ansqlstmt 和ansqlstmt 不要一起使用4.慎用缩写,如果要用到缩写,请参考下一条5.按照缩写规则使用缩写。例如:no.代表number 数字,id.代表identification标示。标识符类型命名规则例子包(packages)一个唯一包名的前缀总是全部小写的a

23、scii 字母。所有项目包名以com.chinacache 开头。后面是程序所在项目的英文名称,不含版本号(除非有特别需要与以前版本区分,如:两个版本可能同时运行),再下为子系统的名称,每个子系统内按照类别区分。com.chinacache.billingcom.chinacache.billing.nodecom.chinacache.billing.node.util类(classes)命名规则:类名是个一名词,采用大小写混合的方式,每个单词的首字母大写。尽量使你的类名简洁而富于描述。使用完整单词,避免缩写词(除非该缩写词被更广泛使用,像url,html)class raster;clas

24、s imagesprite;接口(interfaces)命名规则:大小写规则与类名相似,常以able、ible结尾。interface rasterdelegate;interface runnable;interface accessible;方法(methods)方法名是一个动词,采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写。run();runfast();getbackground();变量(variables) 参数(parameter)变量用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写。变量名不应以下划线或美元符号开头,尽管这在语法上是允许的。

25、变量名应简短且富于描述。变量名的选用应该易于记忆,即,能够指出其用途。尽量避免单个字符的变量名,除非是一次性的临时变量。临时变量通常被取名为i,j,k,m 和n,它们一般用于整型;c,d,e,它们一般用于字符型。char c;int i;float mywidth;集合(collection)数组(array)集合变量例如数组、向量,在命名的时候必须从名字上面体现出该变量为复数、数组。还可以巧妙的使用some 词头。customers,orderitems,postedmessagessomecustomers,someitems,somemessages常量(constants)常量的声明,

26、应该全部大写,单词间用下划线隔开。static final int min_width = 4;static final int max_width = 999;static final int get_the_cpu = 1;l类和接口的声明1.类和接口声明的各个部分出现的先后次序:2.类/接口javadoc 注释(/*.*/)。3.类或接口的声明。4.类/接口实现的注释(/*.*/),如果有必要的话。该注释应包含任何有关整个类或接口的信息,而这些信息又不适合作为类/接口文档注释。5.类的(静态)变量。首先是公共(public)变量,随后是保护(protected)变量,再后是包级别的变量(

27、没有访问修饰符的,默认为friendly),最后是私有(private)变量。6.实例变量。首先是公共(public)变量,随后是保护(protected)变量,再后是包级别的变量(没有访问修饰符的,默认为friendly),最后是私有(private)变量。7.构造函数8.方法,这些方法应该按功能,而非作用域或访问权限,分组。例如,一个私有的类方法可以置于两个公有的实例方法之间。其目的是为了更便于阅读和理解代码。l类/接口注释的内容(1项和作者要求写上)类、接口的文档注释包含如下信息:1.用途。开发人员使用某个类/接口之前,需要知道采用该类/接口的用途。2.如何使用。开发人员需要知道该类/接

28、口应该如何使用,如果必要的话还需要注明不应该如何使用。3.开发维护的日志。一个有关于该类/接口的维护记录:时间、作者、摘要。l方法注释的内容(1,5,6,7项正常情况下都要写上去)1.类该方法是做什么的。2.该方法如何工作。3.代码修改历史纪录。4.方法调用代码示范。5.必须传入什么样的参数给这个方法。param6.异常处理。throws7.这个方法返回什么。returnl文件命名规范1.res/layout文件夹命名规范:统一用小写和下划线_组合命名,建议xml文件加个前缀以便区分,如对话框的xml配置文 件:dlg_name.xml;2.res/drawable文件命名规范:统一用小写加下

29、划线“_”组合命名,同上,每个资源文件最好加个前缀以便区分,如:btn_01_default.png,btn_01_pressed.png,btn_01.xml;l单位使用1.在使用单位时,如果没有特殊情况,一律采用dip和sp(字体大小单位)这两个单位。因为这两个单位是与设备分辨率无关的,能够解决在不同分辨率的设备上显示效果不同的问题。另外,在编码中定义控件的margin或padding属性时,sdk里面并没有提供dip单位的api设置接口,而是提供了默认的px设置。如在下面代码中:1. button btn = new button(context);2. layoutparams lp

30、= new layoutparams(layoutparams.fill_parent, layoutparams.fill_parent);3. lp.setmargins(0, 0, 0, 0); /这里的单位为px单位4. btn.settextsize(12); /这里的单位为sp单位5. btn.setpadding(0, 0, 0, 0);/这里的单位为px单位复制代码这个时候,一般在设置margin和padding时,应该对要设置的px值转换为dip单位,而字体的大小设置中,系统默认给出了sp的单位,所以可以不用进行转换。转换的方法参考下面的代码:1. /*2. * 把dip单位

31、转成px单位3. * param context context对象4. * param dip dip数值5. * return6. */7. public static int formatdiptopx(context context, int dip) 8. displaymetrics dm = new displaymetrics(); 9. (activity)context).getwindowmanager().getdefaultdisplay().getmetrics(dm);10. return (int) math.ceil( dip * dm.density);11

32、. 复制代码该方法已在util.unitutil类中提供了实现的静态方法,可以直接调用。l源代码范例1. /*2. * (#)example.java 1.0 2007-4-113. *4. * copyright (c) 1998-2007 chinacache5. * all rights reserved.6. *7. */8. package com.chinacache.example;9. import com.chinacache.example.mylog;10. /*11. * 这里写关于这个类的一些基本功能描述。12. *13. * version 1.0 2010-10-

33、2114. * author 郑澍璋15. */16. public class example extends someclass 17. /* 本类的一些实现细节写这里 */18. /* 类变量classvar1 的javadoc 说明 */19. public static int classvar1;20. /*21. * 类变量classvar1 的javadoc 说明22. * 假设这个说明超过了一行23. */24. private static object classvar2;25. /* 实例变量instancevar1 的javadoc 说明 */26. public o

34、bject instancevar1;27. /* 实例变量instancevar2 的javadoc 说明 */28. protected int instancevar2;29. /* 实例变量instancevar3 的javadoc 说明 */30. private object instancevar3;31. /*32. * 构造方法的javadoc 说明。33. */34. public example () 35. / 实现细节36. 37. /*38. * dosomething 方法的javadoc 说明.39. */40. public void dosomething(

35、) 41. / 方法实现的细节说明42. 43. /*44. * dosomethingelse 方法的javadoc 说明.45. * param someparam 参数的描述46. */47. public void dosomethingelse(int a,_int b)_48. /注意下面和上面的下划线(下划线代表空格)49. if_(a != 0)_&_(b != 0)_50. a_=_5;51. _else_52. b_=_6;53. 54. return 0;55. 56. 复制代码文件组织方式考虑到开发效率,前期将所有代码在一个工程中开发,但同时也希望保持将代码拆分成几个工

36、程的可能性,基于这一考虑,决定在工程下面新建若干个并行的代码目录,如图所示:每个目录所对应的代码faceavatar视频通话contacts联系人apppublic公用接口、库messages消息appservice服务daemon考虑到开发效率,在ide中,可以把所有这些目录做为source folder一起开发、调试。在实际开发中,各模块的代码应保持独立,除都需要依赖公用接口public外,其余各模块应能独立编译通过。各模块的独立性可通过daily build脚本进行验证。考虑到build system的支持问题,含有中文的源文件须使用utf-8编码。包名规范工程文件夹名avatarmes

37、senger工程包名com.tencent.avatar包名ui界面filecom.tencent.avatar.contactscom.tencent.avatar.messagescom.tencent.avatar.face服务接口com.tencent.avatar.service.aidlcom.tencent.avatar.service.data服务实现filecom.tencent.avatar.service

38、.contactscom.tencent.avatar.service.messagescom.tencent.avatar.service.face网络协议层com.tencent.im.api公用工具类com.tencent.avatar.utils编码规范项目的编码规范遵守android和java的编码规范。具体可查看/source/code-style.html建议完整阅读完此文档,此文当中包含很多有用信息。命名变量命名非公有,非静态的变量以m开头静态变量以s开头其它变量名以小写字母开头常量(public static final)的风格

39、为all_caps_with_underscores如:public class myclass public static final int some_constant = 42; public int publicfield; private static myclass ssingleton; int mpackageprivate; private int mprivate; protected int mprotected;与ndk相关的java代码因为需要与native代码对应,可不遵守此规则类、接口命名类名应当是名词,每个单词首字母大写。前面不需要增加c。接口应当象类名那样使用

40、首字母大写,但名字前面需要加上i,以表明此名字为接口。方法应当是动词,首个单词的首字母小写,随后的单词首字母大写。对于常用的技术缩写词,应把它当成一个普通单词对待,如createhttprequest、createuinode、readfromdb。回调接口命名对于实现observer模式的接口,回调接口名称以observer结尾。与android相关的接口以listener结尾,从ndk回调回java的代码函数可以callback结尾。异步方法命名对于异步调用的函数须在前面加小a,表明此函数为异步调用。对于其它类型的函数,也可适当增加前缀,如ntf。错误处理规范各层之间的接口的同步方法调用的

41、错误返回应都通过throw exception的方式实现。除在极少的情况,如需在最高层捕获generic exception之外,任何时候都不应该捕捉generic exception。若系统中提供的exception子类符合要求,应优先使用系统的exception子类,而不应创建自己的exception类。若需要创建自己的exception类,应从统一的基类继承,如mttexception(此类包含什么信息需要再讨论)。log使用规范使用项目中使用自定义的log输出函数,此函数的参数与android的log函数一致,可根据常量控制是使用标准log输出,还是写入到文件。如下所示:private

42、 static final string tag = videomanager;输出时使用:alog.d(tag, delete video index: + index);根据log的严重程度可分别使用alog.v、alog.d、alog.i、alog.w、alog.e。这样在使用ide调试的时候可以方便的过滤信息。条件编译与c/c+不同,java不支持预编译,为了使得最终编出的release版本不包含log信息,一般使用以下的做法。先定义独立的debugflags类public class debugflags public static final boolean print_vcl =

43、 true; public static final boolean print_service_mgr = true; public static final boolean assert_enabled = true;在需要输出log的时候,使用如下的方式 if (debugflags.print_vcl) log.i(tag, connection resumed); 因为所定义的常量都是final类型的,所以若把这些常量设置为false则编译器会优化,移除与输出log相关的代码。sdk版本号项目的开发基于sdk level 9(android 2.3.1),minsdk设为level

44、7(android 2.1)。注释文件头注释文件开头注释,使用以下规范/*name : printlog.javaversion : 0.0.1copyright : copyright (c) tencent inc. all rights reserved.description : provide printing log function. print log to logcat. annex the class name and function name which call it.*/用eclipse自动生成文件头注释eclipse同样可以很方便的自动生成文件注释,要使用,先需要导入相应的配置文件,步骤如下。在eclipse中,选择菜单window-preferences选择java-code style-code templates,点击import按钮,选择附带的tr-codetemplates.xml文件,按确定。当需要新增加类或接口时,使用菜单file-new-class,输入相应的信息,并选中对话框最底下的generate comments,按finish即可。生成的文件如下图所示类和方法注释对于类和方法,不要求注释。但建议

温馨提示

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

评论

0/150

提交评论