版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
使用公共开发Cocoa编程接口清晰明确,不至于让开发者产生疑惑十分重要。这种情况下,AP命名约定就可以派上用场,它可以帮助您保持编程接口一致明确。另外,框架开发领域也存在一些特定的编程技术—或者说,这些技术对框架开发更加重要—例如版本管理,二进制兼容性,错误处理以及内存管理等。本节包括Cocoa命名约定以及我们提倡的框架编程实践。本文档的组织方本的章大致成两类第一类量较多讲述编接口名约定苹公司的oca框使用了里介绍名约(只有些小的例外)“为函数命名第二类的文章(目前只有一篇)讨论了框架编程方面的内“框架开发者可以使用的技巧和技术在面向对软件库设计过中,开人员经忽视对、方法函数、量及其他编接元素名。节讨论多数ooa接通用的几一般性原清最好是既清晰又尽可能地简短,但不要为了追求简短而丧失清晰性好不清晰;插入什么?“at”表示什么好这样命名也不错,因为方法将移除通过参数的对象不清晰:要移除什么通常情况下,请不要缩写事物的名称,即使名称很长,也应该把它完全拼写出好不清好不清不过,有一些缩写确实很常见并且有很长的使用历史。因此,您可以继续使用。请参看“可以接受的缩略名称”一节以了解的信息要防止API的名称出现歧义。这里的歧义是指名称具有多种解释方式该方法是把端口发送出去还是返回发送端口呢dis该方法是显示某个名称还是返回用户界面中接收者的标题呢一致请尽可能在Cocoa编程接口中保持名称一致性。如果不太有把握做到这一点,则请浏览一下头文件和参考文档中的范例如果类方法利用多态,一致性就显得尤其重要。因为在这种情况下,不同类用于完成同样的方法必须具有相同的名称-该方法同时定义在NSView、NSCell、NSControl这三个类里面-(void)setStringValue:(NSString该方法定义于数个Cocoa类您可以参看“方法参数”一节不能自我名称不应该自我指涉该名称自我指掩码的常量(可以使用位操作进行组合)不适用这条规则,作为通告的常量也不适用前ountonctnKt框架是如此或者是框架紧相关的品,我可以利缀来区分架的功范畴。外,前可以防第发者定义的符号苹果公定义的号发生(以防止苹公司不框架之的号发生)。前缀有规定的格式。它需要由两个或者三个大写字符组成,而且不能使用下划线或者“子前缀”。下面是一些例前CocoaFoundation框ApplicationKit框AddressBook框书写约为API元素命名的时候,请遵循下面这几条简单的书写约定对于含有个单词名称,不要使标点符标志和割符(划线,折之类);大每个单的首字并且把些单词连方法的名称要以一个小写字符开头,而名称中单词的首字符应该大写。另外,请不要在方法的名称中使用前缀nSm函数或常量名称使用其关联类的前缀,并且要名称中单词的首字符要大 可能会导致名称空间。他们有可能在无意中用自己的方法覆盖了一个已经存在的私有方法,这样做将会带来性的 类和协议的名(前缀”一节)。Founton框架以及AplctonKt框架就有很多这样的例子,例如SStrng,SDte,SScr,SAplcton,SButton,SEvnt。我们应根据协议对方法的分组方式来为其命名(n”):好差(看起来像是个类名有一些协议会把一些彼此无关的方法归结在一起(不是创建几个独立的小协议)。对于这样的协议,我们倾向于把它和一个类联系起来,利用类来作为协议的主要表现。并且,我们约定让此种协议使用和类一样的名称。SOjct法有的用于查询任何对象在类层次中的位置,有的可以调用对象的特定方法,有的可以用来增加或者减少对象的计数。由于SOjct类提供了这些方法的主要表现,所以我们使用类名作为协议名称。头文头文件名方式很重要,因为通过使用合理名约定,您利用文件名称来指示文件中包含的内容一个独立的类或协议。.如果一个类或协议不属于某个群,则请将其放置在一份独立的文件,并使用其名称作为文件名头文NSApplication相关联的类或者协议:如果一群(类,类别以及协议)彼此相关,则请将它们放在一份文件,并使用主要的类或者协议名称作为文头文NSString和NSMutableString这两个包含框架头文件。每个框架都应该包含一份头文件,它的名称和框架名相同,而内容则包含了框架的全部公共头文件头文框为另一个框架里的某个类添加API。如果您在一个框架中一些方法,而这些方法属于另一个框架中某个类的范畴类,则请在原始类的名称后加上“Atons”,然后将其作为头文件的名称。例如ApctonKt框架中的头文件就是这种处理方式。相关联的函数和数据类型。如果一群函数,常量,结构以及其他数据类型彼此相互关联,则请将它们放入到合理命名的头文件,例方法可能是编程接口中最常见的元素了,因此对其命名要特别注意。本部分讨论方法命名的相关方面通用规为方法命名时,请记住下面这些通用的指导原则多信息。有两种特定的情况不适用该原则。其一,方法的名称可以使用某个众所周知的缩写开头,而该缩写可以大写(例如,TIFF或者如果方法代表一个对象执行的动作,则其名称应该以一个动词开头---正-错-错如果方法返回接收者的某个属性,则以属性名称作为方法名。如果方法没有间接地返回一个或多个-正-错-错您可以参考“存取方法”一节,以了解的信息所有参数前面都应使用关键字-(void)sendAction:(SEL)aSelectorto:(id)anObject正-(void)sendAction:(SEL)aSelector:(id)anObject错参数前面的单词应能够对参数进行描述-正-错如果您当前创建的方法比起它所继承的方法更有针对性,则您应该在已有的方法名称后面添加关键字,并将其作为新方法的名称--(id)initWithFrame:(NSRect)frameRectmode:(int)aModecellClass:(Class)factoryIdnumberOfRows:(int)rowsHighnumberOfColumns:(int)colsWide;NSMatrix-(int)runModalForDirectory:(NSString*)pathfile:(NSString*)nametypes:(NSArray正-(int)runModalForDirectory:(NSString*)pathandFile:(NSString-(int)runModalForDirectory:(NSString*)pathfile:(NSString*)nametypes:(NSArray正-(int)runModalForDirectory:(NSString*)pathandFile:(NSString*)nameandTypes:(NSArray错虽然上面的例子使用”and“这个词感觉还不错,但是随着创建的方法所带有的关键字越来越多,这种方式会引起问题-(BOOL)openFile:(NSString*)fullPathwithApplication:(NSString*)appNameandDeactivate:如果方法描述了两个独立的动作,请使用”and“把它们连接起-(BOOL)openFile:(NSString*)fullPathwithApplication:(NSString*)appNameandDeactivate:存取方存取方法用于设置或返回对象的属性(也就是对象的实例变量)。由于属性的表示方法不同,我们提倡的存取方法的格式也有差异如果某个属性使用名词来表示,则方法的格式如下:-例如(NSColor如果某个属性使用形容词表示,则方法的格式为:-例如如果某个属性使用动词表示,则方法的格式为:-例如这种情况下,动词应使用一般现在时的格式请不要使用分词形式把动词转换为形容词-正-正-错-错您可以使用情态动词(在动词前冠以“cn”"shoui"等),使得方法的名称更加明确,但是请不要使用“o”或“os”-正-正- 正-(BOOL)shouldClose正-错-错-(void)getLineDash:(float*)patterncount:(int*)countphase:(float只有当方法间接地返回对象或者数值,您才需要在方-(void)getLineDash:(float*)patterncount:(int*)countphase:(float如果方法格式和上面一样,则其实现应该能够接受NULL参数,这样调用者才能够表明他们对其中的一个或者多个返回值不感委托方委托方法指当某发时,对在委托调用的理方法如果委实了它们)委托方的格式特,但也适用在对象据源方法名称的开头应标识出发送消息的对象所属的类在此,类的名称不需要使用前缀并且首字符要小写除非方法只有一个参数,并且该参数表示消息的发送者,否则类名称后面都要加上一个冒号(参数是委托对象的)如果是因为发送了一则通告而导致某个方法被调用,则上述原则不适用。在这种情况下,方法仅有的一个参数是通如果调用某个方法是为了通知委托某个已经发生或者即将发生,则请在方法名称中使用“did”或者“will”这“”“hou”。--集合方对于管理一个对象集合的对象(每个被管理的对象称为集合的一个元素),习惯上,我们要求它具有如下格式的方法(NSArray例如(NSArray下述内容是该原则的条件和细化如果集合确实是无序的,则应返回一个NSSet类型的对象,而不是返回NSArray对象如果把元素插入到集合的指定位置这能很重要,则应使用与下面类似的方法来替换或者补充前述的某些方法使用集合方法时,您需要记住下面这两条实现细节上述方法常隐含它们对入象的所权,因,用于加或者入象的代码须增加象的计,而用移除对的代码 --(NSTextStorage正常情况下,您应该不会直接调用setTextStorage:方法,但可能需要对其进我们还有另外一个示列用于展示集合方法的上述约定,它来自于NSWindow类 (NSArray(NSWindow方法的参下面是数条和方法参数命名相关的通用规则和方法名称一样,参数的名称也是以小写的字符开头,并且后续单词的首字符要大写。例如:removeObject:(id)anObject)请不要在参数名称中使用"pointer"或者"ptr"。您应该使用参数的类型来参数是否是一个指针请不要使用一到两个字符的名称作为参数名请不要使用只剩几个字符的缩写习惯上(在Cocoa中),我们把下面的关键字和...font:(NSFont私有方大多数情况下,私有方法遵循和公共方法一样名规则。但是,有一种常见的约定是为私有方法添加一个前缀,这样我们就很容易区分它们。否在无意中覆盖了具有相同名称的私有的框架方法大部分oca(a),请不要在您的私有方法中使用下划线作为前缀,因为苹果公司保留使用这种命名约定在为某个很大的Cocoa框架类(例如SV)派生子类时,如果需要绝对保证子类私有方法名称不会和超类发生,则您可以为子类私有方法添加自己的前缀。前缀应该尽可能地具有唯一性,也许您的前缀可以基于公司或者项目名称,并且使用"_"果您的项目叫做BteFor,则前缀可以是Fadbe:这样的格式。尽管为私方法名添加前似乎和前我们类方法名要相但是因为此的目的早前不:我们么做是了避免无意Otv-C函数名称和方法名称格式相似,但是有两种情况例外大多数函数名称以动词开头,该动词描述了函数的作用用于查询属性的函数有一套更细 名规则如果函数返回其首个参数的某个属性,则请省略掉函数名称中的动词unsignedunsignedintNSEventMaskFromType(NSEventTypefloatNSHeight(NSRect如果函数如果函数返回值是类型,则它应以曲折动词开头BOOLBOOLNSDecimalIsNotANumber(constNSDecimal本节描述实例变量、常量、异常、以及通知名约定实例变在为某个类添加实例变量时,请记住下面几个因素避免创建公共实例变量。开发人员应该关心对象的接口,而不是对象的数据方式这样的细节请把实例变量显式为@private或者@protected。如果您预期所提供的类会被子类化,并且子类可能需要父类的数据,则请使@protected指令来修请确保实例变量的名称能够扼要地描述它所保存的属性如果实例变量将作为类对象的可属性,则请务必为其编写存取方法常根据常量创建方式不同,其命名规则也有所差异枚举请使用枚举类型来表示一群相互关联的整数值常量枚举常量其所属通过tf定义数据类遵循和数一样名约(查看“函数命”一)。下是一个自文件的例子 =====}enum==1<<=1<<NSMiniaturizableWindowMask=1<<=1<<请注意,在上述例子中 不是一定要具有的您也可以创 的枚举类型来表示诸如位掩码这样的事物。例如使用const创建请使用const来创建浮点值常量。如果某个整数值常量和其他的常量不相关,您也可以使用const来创建,否则,则应使用枚举类型constfloat下面 展示了const常量constfloat使用枚举类型的常量遵循和函数相同名约定。(请参考“为函数命名”一节)其他类型的常量修有些符号,预处理器需要对其进行计算,以便决定是否要对某一代码块进行处理,则它们应该使用大写字符表示。例如#ifdef#ifdef请注意,编译器定义的宏,其开头和结尾要具有两个下划线字符。例()。ooaAPPKIT_EXTERNAPPKIT_EXTERNNSString在实现文件中,NSString的实际值被指定为常量。(请注意,APPKIT_EXTERN宏经过计算之后是Objective-C中的extern关键字)异常和通异常和通告的名称遵循相似名规则,但是我们为二者推荐的使用模式并不相同异尽管您可以随意地将异常(即Nctn类和一些相关联的函数所提供的机制)用于任何目的,但是通常情况下,oa不会利用他们来处理、、Cca异常使用全局的NSString对象来标识,其名称按如下的方式进异常名称中的具有唯一性的那部分,其组成词应该拼写在一起,并且每个单词的首字符要大写。下面是一些例子如果某个类含有委托,则通过所定义的委托方法,类的委托可以收到大部分通告。通告的名称应该反映相应的委托方法。例如,一旦应用程序发送一则A Acn的通告,则全局SActon对象的委托就会自动进行,这样它就可以接收到一条a i的消息。通告使用全局的NSString对象进行标识,其名称按如下的方式组合[Name[Nameofassociatedclass]+[Did|Will]+[UniquePartOfName]+例如(“”一节标准C已使用很长时间的缩写格式—例如,“alloc”和“getc”—可以到Cocoa中缩意义和注可选应用程序。例如,NSApp表示全局的应用程序对象。但是缩意义和注可选应用程序。例如,NSApp表示全局的应用程序对象。但是在委托方法中,需要把“application”整个拼写出来计函水平信初始化(表示初始化新对象的方法整最大最小消Interface粘贴板(只能粘贴常量矩表现形式(用于诸如NSBitmapImageRep这样的类暂时垂您可以用计算机行业中很常见的缩略语来代替其所表示的单词。下面是一些知名度比较高的简写相对于其的开发而言,架开发要更加意编写码的方。因为多户应用程可能到框架而这样泛地接口,导致请注意:此处所讨论的一些技术并不局限于框架开发。将之用于应用程序开发同样卓有成效初始下述意见和建议涵盖框架初始化方面的内容类的“”一对于继承链中的每一个类,不论其是否实现ie方法,运行时都会向它发送消息。这可能导致一个类的t方法被多次调用(举个例子,如果子类没有实现z方法,则其父类的方法将被调用两次)。但通常您希望始化代码仅执行一次,为确保如此,您ifif(self==[NSFooclass])//theinitializing}您不应该显式地调用initialize方法。如果需要触发初始化[NSImage[NSImage指定初始化函数指定初始化函数是类的一个方法,它调用超类的某个方法(其他的初始化函数调用类自己定义的方法)。每个公共类都应包含一个或多个指定初始化函数。举些例子,SV的方法以及Ssonr的方法都是指定初始化函数。在某些情况下,类的方法并不想被重载,比如SStrn和其他面向类簇的抽象类,因而其子类应该实现自己的初始化方法。以及ntihoe:方法(该方法也是个指定初始化函数)中调用一个公共的例程。初始化过程中的错为确保能够恰当地检测并错误,一个设计良好的初始化方法应完成如下步骤调用super的init方法对self重新赋值检测指定初始化方法的返回值是否为nil。返回值为nil表明超类的初始化过列表1描述的方法可以完成上述步骤。-(id)init列表1初始化过程中的-(id)initifif((self=[superinit])!=nil) //calladesignatedinitializer//initializeobjectif(someError)[selfrelease];//[selfdealloc]or[superdealloc]mightself=//betterifobjectis}}return}版本化和兼容()r这种OjctvC不论如何,您可以使用数种技术以确保新版本的框架能被正确标志并尽可能地兼容早期版本框架把变更归档在一个版本号下面(例如,归档在发布记录中)设置框架的当前版本号并且提供某种方法使之全局可见。您可以把版本号保存在框架的信息属性列表(ns),基于如果框架对象需要被写入到ni“”(和e这样的方法)基于键进行归档,对象就可以使用键来或写入被归挡值。相对以往的归挡机制,该方法可以向和后向兼容性上提供的灵活性。因为老归档机制要求代码和或写入的值维持相同的顺序,而且它也没有什么好办法来改变已写到的数据。如果您需要了解基于键的归档机制,请参考Cocoa归档和序列化编程指南(ArchivesandSerializationsProgrammingGuideforCocoa)一文。OSX1.版本之前的归档机制,则它必须能从中内容并能其内容写入到。但如果您在MacOSXv.及之后的平台上为该对象添加新性,则不必,际上是应该,这些属保存到中这做可能会老更早的统中变不可),这情况下,新属性应使用键值归档机制请注意下列和基于键归档相关的事实如果中的某个键丢失,则在获取这个键对应值的时候,依据所要求的类型,其返回值可能是nil、NULL、NO、0、或者0。通过对该返回值进试,您可以减少写到中的数据。同时,还可以检测某个键是否已被写入到中。如果使用旧式归档,则tr的实现需要独自挑起兼容性的重担。但如果使用键值归档,则归档方法和解档方法都可以采取一些措施以保证兼容性。举个例子,一个新版本的类的归档方法可能使用键来写入一个新值,而依旧把早期的字段写入到中,这样类的旧版本仍然可以理解该对象。与此同时,我们还可以在解档方法中使用某种合理的方式以处理数值缺失的情况,从而为将来的版本保留一些灵活性。在命名框架类的键时,我们提倡使用和框架其他元素一样的前缀,前缀后面再使用实例变量名称。您只要确保它的名称不会和任意即可。如果您使用一个工具函数向中写入一个基本数据类型(换句话说,就是一个非对象的值),则请务必为该数值使用一个唯一键。举个例子,如果您有一个对矩形归档的“rchvct”例程,则您应该为该函数传入一个键作为参数。您可以直接把它作为键;或者,如果这个例程向写入多个值(例如,写入四个浮点数值),则它应该把每个数值自身独有的位添加到所提供的键上面。位字段对编译器比特序依赖关,按照字段现的格式行归档能有。有当有个位元要被写多时,我才会对位字段进行归档,这主要是为了提高性能。请参看“位字段”一节对象的尺寸和保留字段每个Ojcte-”“这个类被实例数千次则您可需要让留的单变量的寸一些(也是说,意对象占用节)。对于较早的类的对象,如果它们的空间已经用完(并且假定实例变量没有被导出成为公共变量),则您可以移动实例变量,或者把它们在一起余的保留槽作为指针,使它可以指向一块额外的内存,然后您在对象初始化的时候分配这块内存(并且在对象释放的时候销毁它)。又或者您可以把额外的数据放入到一张外部的哈希表(例如放入SDctonary);这种方法对于那些很少创建使用的实例变量具有很好的效果。异常和错大多数Cocoa框架的方法不会强制要求开发者捕捉处理异常,因为程序正常执行时不会产生异常,而且我们通常也不使用异常来表示可预期的行时错误或用户错误。下面这些例子属于可预期的运行时错误或者用户错误文件找不用户不存试图打开应用程序中一个错误类型的文把字符串转化为特定编码时出现错但是不管怎么样,Cocoa确实会异常以指示下面这些编程错误或者逻辑错误数组索引试图改变一个不可改变的对错误参数我们认为应用程序推向市场之前,开发者会对其进试,发现并解决这些类型的错误。因此,应用程序不需要在运行时处理上述异常。如果出错误是Cocoa框架不同于其他软件库的又一个地方。Cocoa的方法通常不返回错误码。某些情况下,一个错误具有一个合理或者可能的原因,方法通过对一个值或者对象返回值(non-)进行简单测试以判断该情况;但是返回或者值的原因则被记录文档中另外,您不应该使用错误码来指示需要在运行时处理的编程错误,相反您应该一个异常,或者在某些情况下,您也可以只记录下该错误而不异举个例子,SDctonary的方返回所找到的对象,如果对象找不到,则它会返回值。SArra的法不可能返回值(除非我们把通用的编程语言约定重载成向对象发送消息都会返回值),因为SArra对象不能保存值,并且所有的越界都被定义成编程错误,这种错误异常而并不返回对象。如果对象不能使用用户提供的参数进行初始化,许多方法都会返回值在少数情况下,一个方法需要多个不同的错误码是合理的。这时,该方法需要将错误码指定到一个传参数,然后您可以利用该参数返回一个错误码,也可以返回一个本地化的错误字符串,或者一些其他的可以描述错误的信息。举个例子,您可以把错误转换成SError对象返回(Fountn框架的头文件以获取的细节)。而除了这个SError对象,方法还能直接返回相对简单的值或者值。另外要注意,这种方法的所有传参数都是可选的。因此,如果发送者不想了解错误原因,它们可以传一个L值给错误码参数。NSError类在MacOSXv10.3之后的版本对外公开框架数框架数据的处理方式可能会对性能、跨平台兼容性、以及其他某些方面产生影响。本节讨论一些和框架数据相关的技术常量出于性能的原因,您应尽可能多地把框架数据标志为常量,因为这样可以减小Mach-O二进制文件的DATA段的尺寸。没有const标记的全局或静态的数据最终会存放在DATA段的DATA节。对于每一个使用该框架的应用程序实例,这种类型的数据都会占用内存。尽管多出500字节(举个例子)好像没那么糟糕,但是这有可能导致应用程序所需的内存页面的数量增多—即每个应用程序都需要额外的四千字节的内存您应该为所有不变的数据添加const标记。具有const标记的数据块,如果其中没有char*类型的指针,则该数据会被存放在TEXT段中(这会使数据成为真正的常量);则数据就会被存放在DATA段中,但是这些数据不可以被写入(除非预绑定未完成,如果预邦定已经完成,则您应该初始化静态变量,这样可以确保该变量被合并到DATA段的data节中而非bss节。如果没有明显的值用于初始化静态变量,则请使如果使用有符号的值来表示位字段,而代码又假定这个位字段是值,则可能会导致未定义的行为。只有一个位的位字段尤为如此。因为在这种情况下,这个位字段只能和-(取决于编译器的实现),把它和做比较,其结果总是不相等。因此,只有一个位的位字段应该是无符BOOLBOOL int和位字段关的另个问题归档。常情况,您不该按照前格式其入到磁盘者,因为我们在外的架或者编器中读内存在框架代码中,如果可以的话,最好是完全避免分配内存。如果出于某种原因,您需要一块临时的缓冲区,则通常情况下,使用栈比分配缓冲区更好。但是,栈的大小有限(栈总的大小通常为1千字节),10(或者是定义的值)字节,使用栈是合适的。YourElementTypestackBuffer[STACKBUFSIZE];YourElementType*buf=stackBuffer;intcapacity=STACKBUFSIZE;//YourElementTypestackBuffer[STACKBUFSIZE];YourElementType*buf=stackBuffer;intcapacity=STACKBUFSIZE;//IntermsofintnumElements=0;//Intermsofwhilewhile(1)if(numElements>capacity){//NeedmoreintnewCapacity=capacity*2;//Orwhateveryourgrowthalgorithmif(buf==stackBuffer){//Previouslyusingstack;switchtoallocatedbuf=malloc(newCapacity*}else{//Wasalreadyusingmalloc;simplybuf=realloc(buf,newCapacity*}capacity=}//...usebuf;incrementnumElements}//if(buf!=语言问下面的条款讨论和Objective-C语言相关的问题,包括协议、对象比较、以及向对象发送autorelease消息的向nil对象发在Objective-C中,只要消息的返回值是对象、任意的指针类型、或是其尺寸小于等于sizeof(void*)的整数型标nil对象,该消息将返回nil值。这个特性一种很有价值的编程资产,但是有一个问题需要注意。如果发送给nil对象的消息的返回值非上述类(个对象,则不要依赖这种行为,因为那是很糟糕的做法。在PorPC系统中,向i对象发送上述类型的消息不会有问题,但对于其他架构来说,这种行为行不通。对象通用的对象比较方法和与对象类型关联在一起的比较方法(诸如)有一个重要的不同。方法允许任何对象作为参数,如果用于比较的对象属于不同的类,则该方法将返回值。而诸如以及这样的方法通常都假定参数是某种特定的类型(和接收者一样的类型)。因此,这种函数不会执行类型检查,这使得它们运行速度比普通的对象比较方法快,但是安全性则不如之。对于那些从外部源获取的值,例如从应用程序的的信息属性表()或者应用程序的偏好设置获取的值,在对其进行比较时,我们倾向于使用方法,因为这种方法更安全;但如果我们已知道要进行比较的值的类型,则应使用方法。关于coDtna或者St对象)有一个基本的不变式,即如果[Asqa:B]E,则[Ahsh]Bhs也成立。因此,如果您重写了类的sqa:方产生的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 科技在前台工作中的应用计划
- 网络科技行业客服工作总结
- 2024年税务师题库带答案(典型题)
- 2024年设备监理师考试题库及答案4
- 2024年花儿朵朵教案
- 2024年电工安全总结
- 出租商铺安装电梯合同(2篇)
- 2024年福建省职业院校技能大赛中职组汽车运用与维修竞赛指南
- 自行车项目建设工程风险管理与保险分析
- 高端人工合成珠宝钻石材料产业化项目可行性研究报告模板
- 空调系统维保记录表格模板
- QC小组活动管理制度
- 市区自备井排查整治工作实施方案
- 8位半万用表大比拼
- 品牌管理部绩效考核指标
- 沥青路面施工监理工作细则
- 物业设备设施系统介绍(详细).ppt
- 公司走账合同范本
- 获奖一等奖QC课题PPT课件
- 人教版小学三年级数学上册判断题(共3页)
- 国际项目管理手册The Project Manager’s Manual
评论
0/150
提交评论