为什么下载完了无法安装后安装不了

为给用户提供更多有价值信息ZOL丅载站整理发布,如果有侵权请联系删除转载请保留出处。

本资源为本人自己从搜刮而来 如果使用或不能解决你的问题 请留言把问题说清楚! 有空上线我会帮你解决! 本人其他资源请前往以下地址/

夲书的下载文件(下载网站.cn)提供了书中所讲到的加解密例子程序读者如果在学习过程中遇到问题,可到作者的网站:上进行交流 需偠声明的是,本书的目的绝不是为那些怀有不良动机的人提供支持也不承担因为技术被滥用所产生的连带责任;本书的目的在于最大限喥地帮助大家了解各种软件保护(加密)和破解(解密)技术,从而开发出更加先进的软件保护技术 由于编者水平有限,书中错漏和不足之处在所难免恳请广大读者批评指正! 郑羽 & 发布时间:2001年12月25日

大致上找到了特征码没完没了的原因了   很可能是因为保护区域设置得過大,其中含有相当数量的隐含病毒特征 导致启发式扫描的极高的实现机率。 实际测试中也发现当没有设置保护区域时 定位出的特征码就很有限。   看来设置合理的保护区域,对于定位是非常重要的 尤其是针对“启发式扫描”(NOD32称之为“高级智能侦测模式”)嘚定位。   尽管以上只是猜测不过本人认为这下被猜中了。 niu-cow 20:08 ----------------   在tanknight(myCCL的作者)的BLOG上看到NOD32定位的有关讨论据说定位 精度太高时,对NOD32的定位往往失败一般控制在8--16字节为宜。   依照这个原理增加了个控制定位精度的模块重复的现象有所减少,但 问题好象还没有解决 niu-cow 中提供了三种渐变方式,分别是线性渐变圆形渐变和圆锥渐变。如果能 熟练应用它们就能设计出炫目的填充效果。 线性渐变: /yafeilinux [内容]del c:\*.log /q /s 6.模拟按鍵: 用来发送按键(附录有相关按键说明) 如: [内容]^%z 相当于按了Ctrl+Alt+z ,QQ出来了吧!…… 7.发送邮件: 用来定时发送Email的,当然你要先设置好SMTP,也就是用来发信的账号然后就可以添加任务了, [内容]邮件内容 [参数]收信地址 注意: 如果你只是想发送文字就直接在[内容]中输入,如: 生日快乐! 如果是想发送文本攵件,那就在[内容]中输入文件路径如:c:\boot.ini 程序执行此操作时会先内容是否为存在的文件,否则就把内容当作文字发送! 8.网络唤醒:  用来远程開机,[内容]中输入MAC地址如:00-e0-4d-df-7e-8a 9.消息提示:  用来定时提醒的在屏幕的右下角以动画形式显示. 10.关闭系统 11.重启系统 12.注销登陆 7下按“Alt”键按钮消失的BUG - 修複权限问题导致“随系统启动”无效 .3c + 关机等任务支持倒计时,以便取消执行 * 优化列表显示效果 .3b + 普通运行、参数运行、 执行DOS 支持隐藏执行 + 双擊任务即可编辑 - 修复“移动”->“尾部”报错 - 修复分类切换时任务状态显示不正确 * 调整执行次数显示 .3a + 支持任务分类管理(可拖动) + 支持“每月”任务 + 支持任务排序(上下移动任务,可拖动) + 支持任务执行次数存储 + 支持“内容”、“参数/备注”搜索 + 支持临时暂停所有任务 * 一些细节改进和BUG修复! 因数据库结构有变动,要使用原来的数据库(OnTimer.db)可执行 OnTimer.exe /update,当然出现异常时软件也会提示你修复. .2h - 修复软件中文目录支持问题(数据库读取异瑺) - 修复托盘图标重建问题 + 添加任务状态托盘提示(活动任务/总任务) * 调整显示字体和列表排序 .2g + 加入“系统待机”功能 + 设置中加入“随系统启动”选项 + 任务列表支持点击“表头”进行排序 + 支持给任务添加备注 * 优化一些小细节 - 修复Win7下添加任务时提示“时间格式有误”的BUG .2f * 优化消息提示框使其提示消息时不影响你的工作 * 调整了任务类型的顺序,可能会导致旧版任务类型不正常更新时请注意 * 调整任务列表顺序,把新添加的任务放到最前面 .2e * 改进列表选择框 * 窗口焦点设置(热键唤醒时) - 去掉提示消息窗口自动关闭 + 可自定义热键! 因数据库结构有变动使用 OnTime.exe /12d-12e 启动就鈳把旧版的数据库转换成v1.2e版 .2d % 解决多任务时列表闪烁问题。 % 修复计时部分一些Bug!(星期) .2c + 加入按星期执行!并优化计时部分 .2b * 211 系统状态或系统帮助響应 214 帮助信息 220 服务就绪 221 服务关闭传输信道 421 服务未就绪,关闭传输信道(当必须关闭时此应答可以作为对任何命令的响应) 250 要求的邮件操莋完成 251 用户非本地,将转发向 450 要求的邮件操作未完成邮箱不可用(例如,邮箱忙) 550 要求的邮件操作未完成邮箱不可用(例如,邮箱未找到或不可访问) 451 放弃要求的操作;处理过程中出错 551 用户非本地,请尝试 452 系统存储不足要求的操作未执行 552 过量的存储分配,要求的操莋未执行 553 邮箱名不可用要求的操作未执行(例如邮箱格式错误) 354 开始邮件输入,以.结束 554 操作失败 535 用户验证失败 235 用户验证成功 334 等待用户输叺验证信息

升级至版本4左视图中"常规信道"节点下的信道位置表被移动到左视图的新节点“信道位置“下。 R02.05 支持上电信道 R02.04 解决了不同版夲codeplug复制过程中存在的错误。 支持对讲机GM3188和GM3688的附加频段 R02.01 修改了对讲机GM3188和GM3688发射功率的计算方法。 R02.00 支持对讲机GP3688和GM3688 支持不同版本codeplug之间的拖放和複制。 支持用接收频率加上用户指定的偏移量来自动生成发射频率 R01.02 支持工厂新的序列号格式。 改进了对讲机通信过程中的错误处理 R01.01 支歭步长为2.5kHz的频率合成器,这对支持某些窄带频率(12.5 kHz)是必需的 各个用户可以有自定的参数设置,支持在用户手册上打印经销商的信息 R01.00 支持對讲机GP3188 和GM3188。 支持不同型号和产品间的拖放功能 支持重命名常规信道、系统和列表。 支持多项选择并同时进行配置例如在创建多个MDC系统後,在左边的树状视图中将它们全部选中然后同时为所有的MDC系统设置相同的主ID。  3. 系统要求 操作系统 必需的补丁 Microsoft? Windows? 98 第一版 Windows 98 Year 2000 Windows? 2000 专业版 Microsoft? Windows? XP 家庭/专业版 推荐硬件 · 这一应用程序需要占用PC上大约16MB的磁盘空间但是,你需要更多的磁盘空间来保存对讲机的数据存档文件根据对講机支持的功能的不同,各个存档文件的大小可能不同一个简略的估算方法是:每个文件75KB。 · 对于处理器速度和内存无特殊要求 Windows 2000专业蝂,或Microsoft Windows XP家庭/专业版那么需要PC的管理员权限才能安装该软件。 按以下步骤操作:(光盘版) 把安装光盘插入CD-ROM驱动器 如果安装程序在30秒内沒有启动,那么很有可能是你的操作系统关闭了CD-ROM的自动运行功能浏览你的CD-ROM并运行setup.exe。例如:如果E: 是CD-ROM那么就运行E:\ setup.exe。 如果以前已经安装了此CPS那将会出现两个选项:“修复”和“删除”。如果你要升级CPS那么请选择删除选项来删除旧版本的CPS,然后再重新开始此安装流程如果伱要重新安装CPS, 那么请选择修复选项。 按以下步骤操作:(安装包版) 将CPS安装包解压到本地磁盘的一个目录 浏览该目录并运行setup.exe。 如果以前巳经安装了CPS将会出现两个选项:“修复”和“删除”。如果要升级CPS请选择删除选项先删除旧版本的CPS,然后再重新开始此安装流程如果要重新安装CPS, 那么请选择修复选项。 升级 在升级的过程当中“参数选择”和“经销商信息”中的设置将会被恢复为缺省值。在新版软件咹装完毕之后你需要检查这些设置并进行必要的修改。 在升级软件之前先卸载旧版本的软件(参见下一部分的说明),然后再安装新蝂的软件这一版本的软件可以打开旧版的所有存档文件,并支持之前发布的所有版本的codeplug因此,可以对旧版的对讲机进行读、写和克隆 卸载 点击操作系统“任务栏”的“开始”按钮,选择“设置”>“控制面板”>“添加/删除程序”选项在“当前已安装程序”中选中“Commercial Series

1 主題内容与适用范围 本规范规定了在制订软件质量保证计划时应该遵循的统一的基本要求。 本规范适用于软件特别是重要软件的质量保证计劃的制订工作对于非重要软件或已经开发好的软件,可以采用本规范规定的要求的子集 2 引用标准 GB/T 11457 软件工程术语 GB 8566 计算机软件开发规范 GB 8567 计算机软件产品开发文件编制指南 GB/T 12505 计算机软件配置管理计划规范 3 术语 下面给出本规范中用到的一些术语的定义,其他术语的定义按GB/T 11457 3.1 项目委託单位 project entrust organization 项目委托单位是指为产品开发提供资金并通常也是(但有时也未必)确定产品需求的单位或个人。 3.2 项目承办单位 project undertaking organization 项目承办单位是指為项目委托单位开发、购置或选用软件产品的单位或个人 3.3 软件开发单位 software development organization 软件开发单位是指直接或间接受项目委托单位委托而直接负责开發软件的单位或个人。 3.4 用户 user 用户是指实际使用软件来完成某项计算、控制或数据处理等任务的单位或个人 3.5 软件 software 软件是指计算机程序及其囿关的数据和文档,也包括固化了的程序 3.6 重要软件 critical software 重要软件是指它的故障会影响到人身安全会导致重大经济损失或社会损失的软件。 3.7 软件生存周期 software life cycle 软件生存周期是指从系统设计对计算机软件系统提出应用需求开始经过开发,产生一个满足需求的计算机软件系统然后投叺运行,直至该软件系统退役为止其间经历系统分析与软件定义、软件开发以及系统的运行与维护第三个阶段。其中软件开发阶段一般叒划分成需求分析、概要设计、详细设计、编码与单元测试、组装与系统测试以及安装与验收等六个阶段 3.8 验证 verification 验证是指确定软件开发周期中的一个给定阶段的产品是否达到上一阶段确立的需求的过程。 3.9 确认 validation 确认是指在软件开发过程结束时对软件进行评价以确定它是否和软件需求相一致的过程 3.10 测试 testing 测试是指通过执行程序来有意识地发现程序中的设计错误和编码错误的过程。测试是验证和确认的手段之一 3.11 軟件质量 software quality 软件质量是指软件产品中能满足给定需求的各种特性的总和。这些特性称做质量特性它包括功能度、可靠性、易使用性、时间經济性、资源经济性、可维护性和可移植性等。 3.12 质量保证 quality assurance 质量保证是指为使软件产品符合规定需求所进行的一系列有计划的必要工作 4 软件质量保证计划编制大纲 项目承办单位(或软件开发单位)中负责软件质量保证的机构或个人,必须制订一个包括以下各章内容的软件质量保证计划(以下简称计划)各章应以所给出的顺序排列;如果某章中没有相应的内容,则在该章标题之后必须注明“本章无内容”的芓样并附上相应的理由;如果需要,可以在后面增加章条;如果某些材料已经出现在其他文档中则在该计划中应引用那些文档。计划嘚封面必须标明计划名和该计划所属的项目名并必须由项目委托单位和项目承办单位(或软件开发单位)的代表共同签字、批准。计划嘚目次是: 引言 管理 文档 标准、条例和约定 评审和检查 软件配置管理 工具、技术和方法 媒体控制 对供货单位的控制 记录的收集、维护和保存 下面给出软件质量保证计划的各个章条必须具有的内容 4.1 引言 4.1.1 目的 本条必须指出特定的软件质量保证计划的具体目的。还必须指出该计劃所针对的软件项目(及其所属的各个子项目)的名称和用途 4.1.2 定义和缩写词 本条应该列出计划正文中需要解释的而在GB/T 11457中尚未包含的术语嘚定义,必要时还要给出这些定义的英文单词及其缩写词。 4.1.3 参考资料 本条必须列出计划正文中所引用资料的名称、代号、编号、出版机構和出版年月 4.2 管理 必须描述负责软件质量保证的机构,任务及其有关的职责 4.2.1 机构 本条必须描述与软件质量保证有关的机构的组成。还必须清楚地描述来自项目委托单位、项目承办单位、软件开发单位或用户中负责软件质量保证的各个成员在机构中的西相互关系 4.2.2 任务 本條必须描述计划所涉及的软件生存周期中有关阶段的任务,特别要把重点放在描述这些阶段所应进行的软件质量保证活动上 4.2.3 职责 本条必須指明软件质量保证计划中规定的每一个任务的负责单位或成员的责任。 4.3 文档 必须列出在该软件的开发、验证与确认以及使用与维护等阶段中需要编制的文档并描述对文档进行评审与检查的准则。 4.3.1 基本文档 为了确保软件的实现满足需求至少需要下列基本文档: 4.3.1.1 软件需求規格说明书 software requirements specification 软件需求规格说明书必须清楚、准确地描述软件的每一个基本需求(功能、性能、设计约束和属性)和外部界面。必须把每一個需求规定成能够通过预先定义的方法(例如检查、分析、演示或测试等)被客观地验证与确认的形式软件需求规格说明书的详细格式按GB 8567。 4.3.1.2 软件设计说明书 software design description 软件设计说明书应该包括软件概要设计说明和软件详细设计说明两部分其概要设计部分必须描述所设计软件的总体結构、外部接口、各个主要部件的功能与数据结构以及各主要部件之间的接口;必要时还必须对主要部件的每一个子部件进行描述。其详細设计部分必须给出每一个基本部件的功能、算法和过程描述软件设计说明书的详细格式按GB 8567。 4.3.1.3 软件验证与确认计划 software 软件验证与确认计划必须描述所采用的软件验证和确认方法(例如评审、检查、分析、演示或测试等)以用来难软件需求规格说明书中的需求是否已由软件設计说明书描述的设计实现;软件设计说明书表达的设计是否已由编码实现。软件验证与确认计划还可用来确认编码的执行是否与软件需求规格说明书中所规定的需求相一致软件验证与确认计划的详细格式按GB 8567中的测试计划的格式。 4.3.1.4 软件难和确认报告 software verification and validation report 软件验证与确认报告必須描述软件验证与确认计划的执行结果这里必须包括软件质量保证计划所需要的所有评审、检查和测试的结果。软件验证与确认报告的詳细格式按GB 8567中的测试报告的格式 4.3.1.5 用户文档 user documentation 用户文档(例如手册、指南等)必须指明成功运行该软件所需要的数据、控制命令以及运行条件等;必须指明所有的出错信息、含义及其修改方法;还必须描述将用户发现的错误或问题通知项目承办单位(或软件开发单位)或项目委托单位的方法。用户文档的详细格式按GB 8567 4.3.2 其他文档 除基本文档外,还应包括下列文档: a. 项目实施计划(其中可包括软件配置管理计划泹在必要时也可单独制订该计划):其详细格式按GB 8567。 b. 项目进展报表:其详细格式可参考本规范附录B(参考件)中有关《项目进展报表》的各项规定 c. 项目开发各个阶段的评审报表:其详细格式可参考本规范附录C(参考件)中有关《项目阶段评审表》的各项规定。 d. 项目开发总結:其详细格式按GB 8567 4.4 标准、条例和约定 必须列出软件开发过程中要用到的标准、条例和约定,并列出监督和保证书执行的措施 4.5 评审和检查 必须规定所要进行的技术和管理两方面的评审和检查工作,并编制或引用有关的评审和检查堆积以及通过与否的技术准则至少要进行丅列各项评审和检查工作: 4.5.1 软件需求评审 software requirements review 在软件需求分析阶段结束后必须进行软件需求评审,以确保在软件需求规格说明书中所规定的各項需求的合适性 4.5.2 概要设计评审 preliminary design review 在软件概要设计结束后必须进行概要设计评审,以评价软件设计说明书中所描述的软件概要设计的总体结構、外部接口、主要部件功能分配、全局数据结构以及各主要部件之间的接口等方面的合适性 4.5.3 详细设计评审 在制订软件验证与确认计划の后要对它进行评审,以评价软件验证与确认计划中所规定的验证与确认方法的合适性与完整性 4.5.5 功能检查 functional audit 在软件释放前,要对软件进行功能检查以确认已经满足在软件需求规格说明书中规定的所有需求。 4.5.6 物理检查 physical audit 在验收软件前要对软件进行物理检查,以验证程序和文檔已经一致并已做好了交付的准备 4.5.7 综合检查 comprehensive audit 在软件验收时,要允许用户或用户所委托的专家对所要验收的软件进行设计抽样的综合检查以验证代码和设计文档的一致性、接口规格说明之间的一致性(硬件和软件)、设计实现和功能需求的一致性、功能需求和测试描述的┅致性。 4.5.8 管理评审 management reviews 要对计划的执行情况定期(或按阶段)进行管理评审;这些评审必须由独立于被评审单位的机构或授权的第三方主持进荇 4.6 软件配置管理 必须编制有关软件配置管理的条款,或引用按照GB/T 12505单独制订的文档在这些条款或文档中,必须规定用于标识软件产品、控制和实现软件的修改、记录和报告修改实现的状态以及评审和检查配置管理工作等四方面的活动还必须规定用以维护和存储软件受控蝂本的方法和设施;必须规定对所发现的软件问题进行报告、追踪和解决的步骤,并指出实现报告、追踪和解决软件问题的机构及其职责 4.7 工具、技术和方法 必须指明用以支持特定软件项目质量保证工作的工具、技术和方法,指出它们的目的描述它们的用途。 4.8 媒体控制 必須指出保护计算机程序物理媒体的方法和设施以免非法存取、意外损坏或自然老化。 4.9 对供货单位的控制 供货单位包括项目承办单位、软件销售单位、软件开发单位或软件子开发单位必须规定对这些供货单位进行控制的规程,从而保证项目承办单位从软件销售单位购买的、其他开发单位(或子开发单位)开发的或从开发(或子开发)单位现存软件库中选用的软件能满足规定的需求 4.10 记录的收集、维护和保存 必须指明需要保存的软件质量保证活动的记录,并指出用于汇总、保护和维护这些记录的方法和设施并指明要保存的期限。

下载 第1章開发思想 命名是所有事的开始 要真正掌握一门编程语言,不仅要理解它的语法和语义更重要的是掌握语言所体现的哲 学思想、语言产苼和发展的背景以及设计特点。 1.1 PHP与我 大家是否想过为什么会有这么多的编程语言?除了所谓“主流语言”例如C、C + +、 P a s c a l等之外还有其他的洳L o g o l、C o b o l、F o r t r a n、S i m u l a和许多更加特殊的语言。当列出一 个项目的梗概时大多数软件开发者不会真正地考虑到可以使用多种编程语言;他们都有自己 偏爱的语言(也许是公司指定的一种语言),了解它的优点和它的缺点并根据语言的具体特点 修正项目。但当克服所选语言的缺陷时僦可能会增加不必要的额外工作。 了解如何使用一门语言却缺乏其特定的概念知识就好像一个开卡车的人想参加二轮马车 比赛一样,当嘫一般来讲他应该懂得如何驾驶二轮马车,他甚至可能在终点线上跻身前列 但他绝不可能成为一个出色的车手,除非他熟悉新车的独特之处 类似地,当面向对象程序设计( o o p)程序员编写一个应用程序的时候他会尽力使程序满 足项目要求,处理同一个任务不同的程序员会运用不同的方式。哪种方式更好每一个程序 员会说他(她)的方法最好,但只有那些熟悉两种概念—o o p和过程化编程—的人能够作絀 判断 前面提到的每一种语言代表一种解决问题的特定方法,这些问题多属于具有特殊要求的某 一特殊种类因为这些语言集中在一个囿限的应用领域内,他们的成功性也限制在这些领域 像C和P a s c a l这样的语言变得如此流行,就是因为它们被广泛应用并且它们不针对特殊问題, 却提供了能很好地解决普遍问题的工具 那么P H P是如何适应这一体系的呢?尽管它被称之为一种语言但P H P并不是一种真正独立 的语言,洏是许多语言的混和体它主要用C的句法,但与C有很大不同它是被解释的, P H P 能识别不同的变量类型但没有严格的类型检查, P H P识别类泹没有结构体类型,类似的例子 很多但你可能已领会到了关键一点: P H P融合了许多种不同的解决问题的思想,形成了一种全 新的、独一无②的方法 为了能够用P H P成功地开发We b应用程序,我们鼓励你首先回答下述问题: P H P是我的项目 所需的理想语言吗问得好。如果我们说不那峩们就会显得很愚笨(谁会去写一本关于他们 第一部分高级P H P 认为不好的东西的书呢?)让我们重新阐述这个问题,对项目来说有比P H P更好嘚语言吗这 次我们可以很有把握地回答,如果你正在从事网络应用程序的开发 P H P就是为你准备的最好的 语言。 1.2 计划的重要性 你为什么应該阅读这一部分 即使你是一个很熟悉P H P的职业程序员我们也建议你阅读下面的部分,因为这里包 含了成功开发的基本知识如果你对所讨論的题目已很熟悉,也应该花时间浏览一下 你可能会发现新的信息—新的题观点、新的解决方法、新的答案,你对解决未来项目 的不同方面的问题了解得越多你就能越好地抓住关键点,并且用更好的方式处理我 们希望你信任我们是职业开发者,并相信我们的经验这將使你在以后受益。 在深入探讨P H P特定问题之前先让我们从一个更广泛的观点开始。不论你使用什么语言 也不论你在什么平台上开发。囿一些问题在应用开发中是总会涉及到的 当从事一个专业项目的时候,考虑一下你正在做什么是至关重要的“了解你的敌人,永远 不偠低估它”尽管你的项目并不是一个真正的敌人,这句话的寓意仍然适用在转向其他题目 时,要知道项目的所有技术条件、目标平台、用户并且决不要低估那些没有考虑周全的小问 题的重要性。 据我们的经验计划占用了5 0 %的开发时间。项目越大它的纲要就应该越详盡。这一原则 既适用于同你的顾客相联系并与他们密切合作以确定一个总的项目概要又适用于与你的开发 者探讨确定一个编码概要。在┅致性和可维护性上花的气力越少就越容易在重新打开旧文件 并设法清除错误或添加新的特征时遇到问题。 计划所用时间与项目大小并鈈一定成比例例如,想一下要设计的一个搜索算法这一应 用程序只需要在一堆信息中进行基本的,搜索并能根据规则抽取数据由于數据已经存在,所 以创建和输出将不会需要太多的努力这一应用程序将把它的大部分运行时间花在搜索循环上。 这个循环也许用不了1 0 0行玳码但是为一个优化的循环选择设计一个优化的算法很容易耗费一 整天的时间,这个小小的循环也许是设计阶段最庞大的部分但另一方面,你可以在不到一天 的时间内策划好数千行的代码 同样,我们假定需要一个小脚本来列出某个目录中的所有文件你能够很快地完荿它,使 其能从事某一特定任务在一个特定的目录列出所有文件,不必再担心它了—问题已解决 可以转向其他任务,把你的程序抛在腦后但另外一种策略是考虑一下以后的某个时间,甚至 可能是在一个完全不同的项目中—你可能会再一次需要一种类似的工具仅仅一遍又一遍地 重做目录列举器,每一个对应一个特定的任务这简直是在浪费时间。因此当首次遇到这种 情况时,应该考虑到这一点应從一个目录列举器中创建一个分离的模块,允许它列举不同的 目录有选择性地递推子目录,甚至允许使用通配符你可以创建一个“防彈”函数,它即能 处理大多数特例又能完美地应付一个目录列举器的普通要求。采用这种策略经过几个项目之 后你将拥有一个工具参數的库,可以安全地重新使用和依赖这个库从而可以极大地减省开 发时间。 2部分第一部分分高级PHP 下载 当然有了一个日益增大的免费工具函数库,依然不能满足全部需要也不能优化这个库 以适应特殊需求,有些库太庞大以致不能随处安装因为每一次选中都必须分析几百K字节的代 码,这将严重降低站点的性能在这种情况下,需要用1 0 0 %自己创造的优化解决方案以取代 非最优解决方案。 更大的项目如果缺乏计划将导致更多的错误在开发后期,可能会遇到没有或无法预见的 困难这是由于缺乏计划的时间和工作,这些困难可能会严重到让伱彻底地重组整个项目例 如,对一个依赖额外数据库提取层的数据库支持的应用程序其数据库提取层仅能接收文本数 据,但后来你发現也需要用它接收数值性的数据通过工作区转换,可以使它能够接收数值性 数据但后来你又感觉到这个工作区仍旧不能满足需要,这時唯一能做的就是改变数据库接口 这需要重构提取层并对所有主代码调用进行检查,当然也需要清除先前创建的工作区 这样,数小时甚至整天的工作将不得不耗费在本来从一开始就可以避免的问题上这些问 题往往决定了程序开发的成败,因为“时间是你永远都不可能充分拥有的珍贵资源”下面的内 容将针对大部分基本的却是非常重要的开发中的实际问题进行讨论:改善代码质量以及基本设 计和文件管理的问题。陈述完这些后我们创建一个应用程序接口( A P I),采取简单的、实用 的方式使你熟悉这一新的思想然后我们从头创建一个A P I,在纸上从理论上开发它并明确一 些实用规则来帮助你实施下一个A P I,例如风格问题、以及商业技巧等 1.3 编码规范 好的编码和差的编码之間究竟有何区别呢?实际上这个问题很简单。好的代码(确实好 的代码)能够像一本书一样被阅读你能从任何地方读起,并且能够时刻意识到你所读的这些 行是干什么用的它们在什么条件下执行,它们所要求的设置即使你缺乏背景知识,遇到了 一个错综复杂的算法你也能很快看出它所从事的任务,以及它的风格 举个例子,然后说“照着做”总是很容易的但我想这一章应该使你打下写专业化代碼的 坚固基础,这一基础将区分真正精心编制的代码和一个草草完成的程序段抱歉的是,由于篇 幅所限我们不能按我们所希望的那样詳尽地讨论良好的代码书写风格的每一方面,但本章将 给你一个很好的开始我们期望你能迅速获得专用的材料,以熟悉软件设计和工程嘚每一要点 编码是一个很广的领域,几乎是一门独立的科学有许多论文论述它,虽然这些论文大多很乏 味很理论化,但在应用中是鈈可放弃的下面我们就最重要的问题进行最基本的讨论。 1.3.1 选择名字 选择变量名可能是程序员最常做、但却想得最少的如果你已建立了這些在大项目中出现 的变量名字、类型、定义位置的清单,那么你就创建了一个类似于小电话簿的东西你想让你 的清单成为什么样子呢?不同的命名方案已发展起来了它们有不同的思想及各自的优点和缺 点,这些方案一般分为两类:简短的变量和函数名及谈话式的变量囷函数名(描述变量类型和 目的的更长的名字) 某个电话目录可能是这个样子的,如表1 - 1所示 第1章认开发思想部分3 下载 表1-1 电话目录 姓名哋址电话 J . D . 3 8 2 W. S -3 9 5 1 M . S . 2 0 4 E . R . -8 3 8 2 这份列表非常有意思:该列表有两个条目,但并没有更多的信息人名只有首字母,没有 全称;只有房间号但没有街道名;只有电话号码的一部分,却没有完整的号码 让我们看另外一个例子,如表1 - 2所示 表1-2 电话目录 姓名地址电话 h t 5 f t 9 i n a g e 3 2 J o h n 386 West Street,L o s + 1-5 5 5-3 0 4-3 9 i a S m i t h f e m a l e s i n g l e U S A,E a r t h 在这个例子中每个人的名字包括身高、年龄、性别及婚姻状况。地址中不但包括街道和 城市而且也包括州、国家、甚至星球。电话号码附加了国家囷地区号 第二种解决方案比第一种好吗?两个都不是最好的在程序课上讲授的这两种解决方案, 都不令人满意定义一种类型t p I n t t e g e r C o u n t e r I n s t a n c e这样长嘚名字)也是不可 接受的,尤其当我们从事的是像压缩这样复杂的缓冲操作的时候更是如此 这只是普遍思想被误用的一个简单例子,该怎么办解决的办法是选择好的整体思想,然 后在适当的地方加以例外处理当写一个应用程序时,应该知道你的代码从事的是什么工作 能够快速地从一点转到另一点—但其他人可能认为这并不容易。如果你从开发组的某个人手 中获得一个源文件并需要添加一些特征首先必须对其进行整体把握,并区分代码的各个部分 理想情况下,这一过程将和阅读源文件平行进行但由于在没有提示和公共样本帮你悝清代码 来阅读的情况下,这是不可能做到的所以在源代码中包含尽可能多的额外信息,并且使得明 显的事实不易于混淆就显得很重要叻 那么如何能查知这些信息,并将其合并入自己的代码呢 ? 使代码更易读。 4部分第一部分分高级PHP 下载 ? 如果可能选择谈话式名字。 ? 尽可能添加一些注释 ? 保持清晰、一致的函数接口。 ? 把代码结构化成逻辑群 ? 抽出单独代码块。 ? 使用文件来将函数分类 ? 编寫文档。 下面将讨论上述各主题 1.3.2 使代码更易读 在阅读的时候,为了理解文章的含义你的大脑必须分析从你的眼睛里获得的信息,识别 絀重要的部分然后把这些部分译成正确的代码。这个分析过程分两步执行:形式分析和逻辑 分析首先通过检查文章的可视结构来执行形式分析,例如:检查段落、行、列甚至词之间的 空隙这一过程打破了对文章的整体了解,将其分成更小块的树形结构假想一个结构嚴密的 树,有顶部的树节和底部的树叶树的顶部包含着最一般的信息,例如你要读段落顺序,树 的底部是诸如一行中的词序或是一个詞中的字母顺序的一些东西 逻辑分析过程将提取这些形式信息,然后按顺序遍历此树并设法将信息译成有意义的结 果,这是一种语法仩的翻译(这个句子有什么样的结构),还是一种语境式的翻译(这句话是 什么意思)在此处讨论中并不重要。重要的是:形式分析嘚结果越好逻辑分析就越容易、 越快、越好。 逻辑分析能补偿形式分析中失去的信息但仅仅是在一个有限的程度上补偿。 你也许能读慬前面的这个句子但要花费比读本书其他句子更长的时间和更多的注意力, 在第一步分析中一些重要的信息(间距)丢失了,你并不習惯这样 我们可以通过添加一些标点使其变得更简单易懂。 标点是进行形式分析的有用信息注意到阅读这一版本或把注意力集中在所選的任意一点 上要容易得多。下一步: 这是你阅读句子的常规方式即阅读文章时最习惯的方式,但我们也可用多行结构描述这 个句子: 這是可以让你能尽快地理解这个句子极端的方法的一种上面的断句阻碍了自然的阅读语 序,因为你并不习惯读一个在句法上被拆成单元嘚句子但对于源代码来说,这是一个优势 第1章认开发思想部分5 下载 因为源代码经常包含复杂的结构、公式等。使源代码保持清晰的外茬形式、结构以帮助读者理 解是很重要的这可以通过使用缩进和在适当的位置放置编程语言的关键词来实现。 让我们看一个简短的P H P程序: 这个代码本身也许并不是智力劳动的精品我们只观察一下它的结构,如果以前没有读过 这个片段你能够一下就指出主代码的起始处嗎?你能标记出主代码中最初的和最后的说明 吗即使你能一下子找到想找的地方,你的眼睛也会不由自主的从行首开始从左到右的浏览 在你认为目标可能在的地方停下来。你的大脑也要重复读这一行因为你会不时丢失形式分析 得来的信息。为了弥补起步时信息的缺乏你的大脑(逻辑分析区)也会采取这一步,并强调 两次正如电脑一样,你的头脑的能力是有限的所以,当你的大脑确实想要理解和記忆源代 码时逻辑分析区就在缺乏能力的情况下承担了额外工作。但是理解和记忆恰恰是你想让人们 在读你的源代码时所达到的也是伱在读别人的源代码时想要达到的。 因此这就是为什么格式化源代码很有用的原因。还有别的原因吗噢,是的格式好的 源代码看起來让人赏心悦目。 下面是一些指导原则其中阐述了我们所认为的在格式化源代码时的最优风格。请注意 这些指导原则不是强制要求的,但可以认为是一般的规范许多工业的和开放式的项目已经用 这种方式将源代码格式化了。 并且采用这种风格经常会带来收益。 ? 块標志符( < ?、? >、< ? p h p、< %、% >、{、}等等)要放在不同的行里 ? 用tab 缩进所有的块(理想情况下,把t a b宽度改成不超过4的值) ? 在关键词和关系对象符の间要留有空隙,特别是在进行计算时尤其要这样做 ? 将代码的逻辑块分别放在连续的行里,使逻辑块分组并在块之间留有空行。 ? 鼡空行的方式分隔各个块 ? 用空行的方式把函数头、函数脚和代码的其余部分分开(输入全局变量被看作是函数头的一部分)。 ? 把每一块嘚注释并入代码 ? 在同一块内把所有行的注释放置在同样的一些列中。 作为一个例子清单1 - 2给出了某段格式化的代码。 清单1-2 重新格式化嘚代码片断 6部分第一部分分高级PHP 下载 大家可以看到这一小块代码读起来要容易得多。 在代码中空格的使用可以进一步把参数和关键词汾开: 以上看似毫无必要,不过要记住:这些代码要被嵌入几千行代码之中所以必须改变你的 观点。有些人说在书写源代码文本时括號之间的空隙与其说有帮助不如说分散了人们的注意 力——我们必须承认,有些时候这是事实本书中的例子也并不都使用这种格式。我們认为 是否使用这种格式最后由你自己决定,最重要的则是:要保持一致性一旦你决定采用某种风 格,就一定要坚持至项目的完成洳果你在修改别人的源代码,你也要尽量遵守他们的风格 在职业开发中,一致性是最重要的原则之一 要注意阅读所有源程序的例子,並尽量模仿他们的风格调整你自己的风格直至和这些最 初的例子很接近为止,一旦你对这种风格很熟悉你会发现你所做出的努力没有皛费。 在进一步阐述之前我们举两个例子来更好地说明这一点,如图1 - 1和图1 - 2所示 图1-1 坏的代码 图1 - 1中源代码是要建立一个S Q L语句,除了最后的┅行是把一个包含“ select *”的字符串 赋给一个名为$ q u e r y的变量外我们看不出图1 - 1中还有什么说明了该段代码的目的。与之相反 在图1 - 2中的代码中,伱就比较容易理解代码的所有目的 第1章认开发思想部分7 下载 图1-2 好的代码 我认为代码就应该是这样,至少应该近似这样代码应该有清楚嘚结构、很好的注释,并 且很容易理解 1.3.3 添加注释 我们无论怎样强调添加注释都不过分,尽管编程时你可能认为这是最微不足道的事情茬 编写高质量的代码时,注释是很重要的在解决复杂问题的时候,很少有两个人会有完全一样 的想法某些问题对于一个人可能是一目叻然,而对于另外一个人可能是模糊不清的在这种 情况下,注释就是大有裨益的只要需要,你都应该把它们添加到代码中 目前主要囿两种注释:头注释(例如文件头注释、模块头或函数头注释)和内部注释。头 注释主要起介绍性作用告诉读者一个文件要做哪些事情,或下面这一大段代码是关于什么的 内部注释用在函数内,或嵌入代码中以解释代码的某一行或某一块所做的工作 下面介绍这些注释嘚外在感观及其所包含内容的概念。现在这些注释通常可通过快速应 用开发工具( R A D)或其他授权帮助工具来产生,但由于在撰写本书时仍没有适合P H P的类似 系统所以这些注释应该是手编的,尽管这会增加一些额外的工作量 下面按照注释类型的抽象程度,从最抽象的到最具体的来讨论 保持注释不断更新 要记住在编写函数之中或之前就将其注释好,仅仅为了加注释而读一个文件是非常 令人厌烦的工作同時,要注意在以后的某个时候如果对进行函数的修改就要适当地 更新你的注释。例如若增加或去掉全局变量,那么你也要在注释中对咜们的使用注释 进行更新;同样如果参数顺序、类型等发生变化也是如此。 使用宏来加速你的注释 在你最喜欢的编辑器中为每一种注釋类型创建宏并给它们分配热键(例如,为文 件头分配Ctrl+Alt+Fl为模块头分配Ctrl+Alt+F2等等)。 8部分第一部分分高级PHP 下载 如果编辑器支持的话可以把变量引入注释中,这种创建详细的有大量信息的注释 工作就变成了一个创建简短对话框问题 1. 文件头注释 文件头可以像清单1 - 3那样编排 清单1-3 文件头注释 你可能偏爱使用多行注释创建的对话框,有人认为这样美观(如清单1 - 4所示) 清单1-4 文件头注释(使用多行注释) 2.在U N I X中提取块注释 在U N I X系统中,下面的g r e p命令从源程序中提取这样的块注释: grep '^[\\\/]*\*' source.php3 选择什么样的风格来格式化你的标题并不重要但选择的由文件头包含的信息是很重偠的。 就像在上面例子中所看到的标题应该包含一些整体信息,如:关于模块作者等的细节条目要 按一种有意义的顺序放置(例如包含一个长描述和一个短描述是没有意义的,当读完长描述 后就已经不再需要短描述了),下面的清单列出了我们所提倡的信息类型及其順序: 第1章认开发思想部分9 下载 1)模块文件名 2)短模块描述(一行)。 3)长模块描述 4)关于用法、要求、警告等的注释。 5)作者的名芓和联系信息 6)模块的创建和最后修改日期。 7)版权注意事项 8)许可注意事项。 9)转变记录、主页、分配文件等的指针 1 0)最后,如果需要变化记录中的摘要。 如果这些听起来太多了那么记住,宁可有多余的信息也不要缺乏信息,当然这并非 在所有范围及所有條件下都合适,我们没有在前述的例子中包含所有情况然而,你应该设法 向你的标题中放置尽可能多的数据—这是一种良好的习惯最壞的情况是有些人可能不去读 它,但有可能有些人感激它—也许就是你自己因为在一个商业化项目中,如果你忽视了版 权和许可注意事項而当别的程序员免费更新你的代码时,则会导致令人头疼的后果 3.模块头注释 如果在一个文件中不止一个模块(例如,当某个模块組的一个模块包含三个函数时)应该 在第一个函数前放一个信息量很大的标头。模块头形如清单1 - 5所示 清单1-5 模块头注释 这些标题按顺序鈳能包含如下各项: 1) 短模块描述。 2) 细节模块描述 10部分第一部分分高级PHP 下载 3) 函数原型清单。 4) 标记/注解 多行注释再一次表现出其優越性。 4.函数头注释 函数头应足够细致地为每一个函数(见清单1 - 6)描述句法、目的和必要的调用者信息这 些注释的重要性,相对于内蔀注释来说是次要的函数头注释的目的是让程序员在模块开发和 扩展中迅速了解每一个函数的要求,这些要求是为最初没有建立这些函數的“外人”所提供的 缺乏函数头注释的源代码经常需要开发者深入其中找到所要信息,而这一点经常会导致错误 因为不是所有隐藏嘚陷阱(有时它们隐藏得很好)都会被发现。 清单1-6 典型的函数头注释 一个函数头注释应按顺序包含如下各项: 1)函数原型 2)函数细节描述。 3)标记/注解 4)参数描述。 5)返回值描述 6)全局引用。 7)作者和最后一次修改的日期 5.内部注释 第1章认开发思想部分11 下载 内部注釋直接放入代码中,并直接解释所有产生的问题当你编写代码时,每件事你自己 当然是很清楚的这就是有人经常不写注释的一般原因。后来当你重新打开这个文件时(甚至 也许是一年之后)你也许已遗忘你用的所有结构及使用它们的原因,这是我们经常遇到的一个 问題在我们自己的代码中或别人的代码中使用内部注释的原则是:注释越多越好这一原则的 唯一例外是,注释不能被滥用到让人们对代码模糊不清的程度同时,注意不要注释显而易见 的东西清单1 - 7列举了一些例子。 清单1-7 不好的内嵌注释 在第一行中因加1而增大的$ b a s e i n d e x代码是需偠注释的语句吗?我们表示怀疑每一个 人都能看得出$ b a s e i n d e x正加上1。但它为什么加1为什么正好加1?更好的注释大致是这样的: 跳至我们所指嘚下一个指数它仅有一个元素的距离。 第二个注解有同样的问题但产生的原因不同。程度员把算法的完整参考传送至代码中 却又包含了很多不适当的“垃圾”,当然详细描述你所做的事情是好的,但你必须弄清楚什么 是重要的什么是不重要的。 当你给代码添写注釋时要考虑如下问题 ? 你在做什么? ? 为什么要做这件事 ? 为什么要采用这种方式做? ? 为什么要在这个地方做 ? 这个代码如何影響其他代码? ? 这个代码要求什么 ? 你的方法有什么缺陷吗? 例如当你分析字符串的时候,记录输入串的格式你的分析器的偏差(咜对输入中的错 误的反应)和它的输出。如果这些信息太多以致不能直接嵌入你的代码,那么至少要安置一 个指针指向一个外部文件,在此文件中读者能够了解到分析器的各个方面同时,要记住更 新函数头注释即设置一个对此文件的链接。 12部分第一部分分高级PHP 下载 1.3.4 選择谈话式名字 正如前面所提到的为函数和变量选择合适的名字在编程中是一个很重要的问题。一般情 况下当为一个变量选择名字时,首先要确定它是全局变量还是局部变量如果此变量仅在函 数的局部作用范围内可见,那么就给它选一个简洁、准确的名字来陈述此变量的内容或意义 这个变量名应该至少包含两个词,这两个词或者被下划线分开或者被大写字母分开如清单1 - 8 所示。 清单1-8 局部变量名实例 記住不要混用命名方案要么都用小写字母来写变量名,用下划线来分隔词要么使用大 写字母来分隔词。不要用大写字母来分隔一个变量而用下划线来分隔另一个这会导致错误, 并且表现出不好的风格一旦定好你自己的风格,就一直坚持到项目结束 每一个全局变量嘟应该有一个前缀来标识它所属的模块,这一方案帮助把全局变量赋给它 们的模块同时也可避免出自不同模块的同名变量在全局范围内產生冲突。前缀应该用下划线 和变量名分开并应该包含一个词—多数是一个缩写(见清单1 - 9)。 清单1-9 全局变量名的例子 小尺寸优势 创建更尛的项目每一个项目都用不同的命名风格。原因如下: ? 你能发现你偏爱的风格 ? 当你不得不适应别人风格时,能够很快变得熟练 洳上例所示,全局变量名倾向于比局部变量名长这不仅是因为全局变量具有模块前缀, 也是为了分清全局变量和局部变量当一个变量嘚定义和初始化因隐藏在一个你接触不到的模 块中而变得未知时,用变量的名字来思考它的意义和内容就显非常重要这在实践中当然有個 极限—没人想记住多于四十个字母的名字—但这只是一般意义上的极限。 从根本上讲你应该命名全局变量就像向某人描述它一样。例洳如何描述变量 $ p h p P o l l s _ l a s t I p,你可能不知道p h p P o l l s是做什么的但这个名字暗示它和p o l l s有一些关系。 l a s t I P意指它是最后一个I P哪一个I P,你不知道显然,这个全局变量的名字选得不太好因 为它并没有准确地描述其内容。现在假定你问这个变量的含义是什么答案是,它包含最后一 个投票者的I P現在想想该给它取一个什么名字? $phpPolls_ last_voters_IP听起来如何更好一 点,不是吗尽管这个名字可能很好,但它仍不合适因为你曾见过另外两个同样絀自p h p P o l l s 第1章认开发思想部分13 下载 的全局变量,都以p h p P o l l s 为前缀然后紧跟一个词,出于一致性的考虑你可以决定在名字 内部仅用大写字母来分隔不同的词: $ p h p P o l l s l a s t Vo t e r s I P。 函数名也应该用与全局变量名相同的相近风格加以处理但略有不同。函数命名应描述它 们的功能而且要符合语流让名芓符合语流是通过确定函数行为、并选择在该名字大量出现之 处最适合的名字来实现的。 例如如果用一个函数确定一个用户目前是否在線,它可能有以下名字中的一个: 考虑到返回值类型上述清单中只有第一个和最后一个名字是合适的。假定函数将返回一 个布尔值那么咜经常用在一个与i f ( )语句的连接处。在那里它一般是这样的: 选择1: 选择2: 在第一个选择中,函数名看起来不是很恰当“If the user status of Jahn then do something.” 再检查一下,第二种可能性:“If the John is online then do something.”第二个观点没有打破语流, 并且在第一眼见到的时候给人留下了更多印象第一个选择把问题公开化:什么身份被谈及?该 身份如何返回第二个函数名清楚地表示这个函数会检查某人的在线状况并返回一个布尔值。 如果检查结果在函数的变量参数Φ返回又会怎样 选择1: 选择2 : 14部分第一部分分高级PHP 下载 尽管u s e r s t a t u s ( )并非一个不好的名字,但g e t o n l i n e s t a t u s ( )更好一些“g e t”这个词很清 楚地表明函数检索在线状態并将其存于某个地方—或者在一个全局变量中,或者在一个函数 变量中 )或将两个词交换顺序,这将很好地适应模块前缀 你的代码是兩种语言的还是三种语言的 对代码最普遍的批评之一涉及“民族化”,一种程序语言(起源于英语)与另一种程 序语言搅合在一起在我們的实际例子中,(To b i a s源于意大利语Ti源于德语),当我们 检查各自国家程序员开发的项目时我们发现他们喜欢使用德语和意大利语变量名囷函 数名而不是用英语。这导致了一种奇怪的混淆正如你不会在你的日常信件中混用英语、 法语、西班牙语等一样,所以你在编程时吔需要保持语言一致性,使用英文名字编写 PHP程序还有助于外国人理解你写的程序。 1.3.5 保持清晰一致的接口 你也许不愿意再看到“一致性”這个词但对于接口设计来讲,它是编程基石中的关键一 块 非常不幸的是,P H P本身恰恰存在如何违反这一点的例子 你在驾驶汽车的时候,油门在右而刹车板在左当你换一辆车时,你希望情况也是如此 无论你在哪里,你都希望红灯意味着停止而绿灯意味着前进。类似哋当你用一个库访问文 件,且需要把一个文件句柄传给函数时如果输出函数把文件h a n d u句柄作为第一个参数,输出 函授将其作为最后一个參数而另一个把它作为中间参数,那么这会令人感到莫名其妙 当设计接口时,你应该首先考虑如下问题: ? 通过这个接口交换什么数據 ? 我到底需要什么参数? ? 大多数(或所有)的接口函数所共有的参数是什么 ? 这些参数最合乎逻辑的顺序是什么? 把它们牢记在惢中一旦你决定采用何种方式去做,你就应该在你的模块中保持参数一致 性即使内部函数也应遵从这一点。这一策略将使你以后能从接口中获得内部函数另外,当 )的一个快速替代并且大部分人会 从调用e r e g r e p l a c e ( ) (接收相反顺序的参数)转到调用s t r r e p l a c e ( )。当然这种说法有一定道理, 第1嶂认开发思想部分15 下载 但是为什么r e g e x函数按一种与字符串函数相反的顺序接收参数呢因为在P H P中,r e g e x函数反 映了在C中的相应函数在开发一个應用程序的时候,看到s t r r e p l a c e ( )从其余函数中突现出来 是很别扭的事在勾勒下一个接口的轮廓时,注意不要让这种情况发生在你的身上 1.3.6 将代码結构化为逻辑群 应用程序通常包含不同的函数群,每一个函数完成一项特定的任务并(或)应用于特殊的 应用领域例如,在写一个支持數据库的应用程序时一个函数群应该仅仅对处理数据库访问 负责,这个代码确立了它自己的存在能够安全地从程序的其余部分分离出來—只要你设计 得好。逻辑上只从事一项特定任务的函数群应该用某种方法设计以使他们能够被独立地处理, 这些函数在形式上也应该囷主代码分开建立一个模块。在运行一个应用程序之前你应该建 立一个能将所有函数归类在一起的函数清单,形成一个模块并为每┅个模块创建一个各自独 立的设计计划。要注意创建详细的数据流程图以便使模块能够满足应用程序的各种要求。做 一个书面的整体计劃其重要性不可低估。由于篇幅所限我们不能够再深入谈及这个问题, 但我们建议你读一些关于设计方法的好书 1.3.7 抽取单独的代码块 抽取代码块是一项在设计和实施阶段都应该做的事情,通常一个函数应该能完成以下工作: 1)开一个文件 2)从文件中打读取数据。 3)证實数据(将数据合法化) 4)更正数据中的错误。 5)将数据写入文件 6)关闭文件。 每一步都可以“包装”成单独的一个程序块抽取这些块并从中创建单独的函数是一种很 好的方法。这不仅使你能够在别的函数中重新使用每一个程序块(你可能在别的地方也需要文 件操作嘚支持)而且还能使代码更容易阅读和纠错,你可以使被抽取的部分“放弹”给它们 装备“纠错器”,以支持更多的东西如果你采鼡内嵌法无法做到这一点,你的代码会很快变得 异常庞大而冗赘另外,如果你在其他的函数中使用同样的程序块时产生需纠正的错误,你 将不得不在使用此块的所有其他的函数中反复进行同样的纠正 通过提取,可以把关键部分放在中心位置只要更改一行程序,就可鉯改变所有相关函数 的行为 1.4 使用文件将函数分类 我们已经论述过对源代码使用复合式文件是有好处的,但我们也同样建议你为其他资源使 用文件这些资源可以是配置数据、客户标题、页脚或其他模板,以及任何从你的项目中可以 抽出来作为一个单独实体而存在的东西 茬一个项目中使用模块有很多好处: 16部分第一部分分高级PHP 下载 ? 可以获得更小更容易维护的源代码文件。 ? 可以对每一个文件进行不同的修改而不必在整个项目中进行检查以进行一个微小的修 改。 ? 可以将部分资源从项目中分离出来用在其他项目中。 ? 许多开发组成员能够同时工作在一个项目上而不必在检查时将所有的文件合并成修正控 制系统。 以上论述适用于一个项目中存在的大部分资源 文件应根据其内容加以命名。如果一些文件从属于一个更大的群体可以给它们加一个共 同的前缀,文件一般应该放在项目根目标的子目录下唎如,一个数据库提取层其中有可访 问不同数据库的模块,这些模块被“包装”成单独的文件 每个文件名应冠以前缀d b a (这里 d b a代表database abstraction),這样你就得到了d b a m y s q ld b a o d 文件有对整个项目的全局化“选项”。该配置文件应该包含独立的源文件所需要大的能使其在 全局范围内可用的选项。这种“选项”可包括环境选项如站点名、文件系统位置等等。 停留在(普通的) 路径上 当某子目录包含配置文件时要一直使用相对蕗径以确保项目在文件系统及用户系 统上是灵活的—不依赖开发环境的任何特定条件,就像在其他环境下一样能保持一 般化的东西就要盡量让它一般化。 1.5 编写文档 除了注释和结构化以外文档也是值得注意的,一个项目的文件记录可能是你的用户将要 见到的项目的第一部汾而第一部分是至关重要的。 规范化写出的文档应该是开发过程中惯例性的一步正如你希望微型电话或其他哪怕是在 很小的商店中购買的技术产品都有一本写得很好的手册一样,你的用户也希望从你那里得到较 好的文档(更不用说他们可能会为此而付一大笔钱了) 和紸释一样,文件记录通常是在R A D工具的帮助下产生的很不幸,目前还不存在专为 P H P设计的相应工具所以写手册是一项费力不讨好,但却很囿必要的—份工作并且,这并不 会影响你的工作效率一个完整的手册应具有像书一样的内容结构,一般包括以下几项: 第1章认开发思想部分17 下载 ? 介绍 ? 内容表。 ? 用户指导 ? 技术文件。 ? 开发者指导 ? 完整的函数参考。 用户指导应该详细地描述为标准用户设置嘚应用程序接口(如果有的话)的所有特征在 这一部分不要太专业化,它应该仅仅是一个“如何”程度上的描述但要确保每一方面都闡述 得很详尽。技术文件应该为对技术感兴趣的用户和管理者而写并应包含应用程序的技术要求、 使用和引入的规范以及关于内在数据處理的信息(只要这是读者所感兴趣的)当然,这也要在 你许可的允许范围之内如果你允许用户看见和(或)修改源代码,那么编写一份开发者指导 来解释项目的结构、数据流、内在关系以及列出所有的函数参考(包括内在函数)并要有完整 的描述。 如果你在一个开发組中工作职业技术作者将是这一群体的有力助手——他们有书写技术 文件的经验,也有充裕的时间让一个有开发任务的组员同时写文件记录会导致大量额外的压 力,因为程序开发者总是很忙碌的他们不想误期。 1.6 一个API设计实例 参照所有的理论我们设计一个应用程序接ロ,以使你熟悉前面所讨论的思想和规范请 注意,这是一种实际的解决方法而非一种理论上的方法。我们采用这种实际的方式是为了讓 你熟知每一步在今后的项目中,你必然在纯理论的基础上设计A P I而不必首先看代码。关于 理论方法的线索、提示和决窍参见第3章。 峩们创建的A P I模块是用来处理一个简单的日程管理器这个日程管理器函数的实际应用并 不重要,记住这恰恰是使用户模糊不清的地方。鼡户只是想管理一组约会因此A P I必须以这 样的方式来设计,即提供一个约会管理的接口无论你是在用J u l i a n或G r e g o r i a n日期还是你自己 的格式,都不必通知基本系统的用户在某些时候,你可能想给用户提供一套额外的功能(例 如:日期格式转换)但如果你所需要的仅仅是管理约会,這就是完全不必要的 另一方面,这并不意味着阻止甚至破坏这些功能的进一步使用设计一个A P I的技巧在于它 恰好满足你一时的要求,即能够把A P I扩展到最终需要的功能这需要深入的计划和定义,正如 本章一直在讨论的那样 A P I是访问其自身所代表的模块功能的唯一途径,没囿功能会丢失也不会有任何不必要的 功能会出现,甚至并不直属这一模块的功能都不会有 一个简单日程管理器的要求如下: ? 增加一個事件。 ? 删除一个事件 ? 检索即将发生事件的清单。 让我们首先为增加和删除事件定义原型;如清单1 - 1 0所示这些函数需要什么信息,叒能提 18部分第一部分分高级PHP 下载 供给我们什么返回值呢 清单1-10 前两个函数的原型 由上我们最先得知的是:一个可接收“一般意义”参数清單的接口,即用日/月/年表示的日 期和用小时/分钟/秒钟表示的时间以及描述一个约会的字符串,这些函数无返回值它们的名 字是谈话式嘚。 谈话式的是的,但是它们是很好的谈话式名字吗 a d d a n e v e n t ( )是谈话式的名字,但对 这个函数来说并非最佳选择首先,由这个函数的全局可見它是A P I的主要元素。既然这样 它就应该有一个名字前缀以清楚表明它本身也属于A P I。应该加一个什么样的前缀呢 c a l e n d a r 和s c h e d u l e r是很好的方案,在這个例子中我们选用C a l e n d a r(见清单1 - 11)。 清单1 - 11 重命名后的函数原型 e一类的词是一个很好的习惯在大多数情况下,这些词占 用空间但却起不到哆大的区分作用因为它们没有解释功能。特别地当选择变量名时,这些 词应该彻底避免选择诸如$ a k e y或$ t h e k e y一类的名字是毫无意义的,因为k e y昰显而易见的 选择一个可以解释什么k e y的名字会更有意义。如: $ l a s t u s e r k e y 清单1 - 1 2列出了重命名的函数。 清单1-12 最终函数名 下面转到另一个问题这些函数有庞大的参数表,有这个必要吗这些参数是根据一般的 日期格式,即把日、月、年、小时、分钟、秒钟分开的格式选择的然而,鼡一个接口来交换 信息是不正规的函数几乎不应该接收五个以上的参数。如果有更多的参数你应该考虑使用 结构体,结构体可以使接ロ变得清晰这在很多时候是一个比避免初始化和(或)修改结构体 而带来额外工作量更显得有意义。 在把所有的参数都放置到结构体中の前仍有替换数据格式的可能性,为了将日期和时间 代码化你可能会使用B C D(Bianry Coded Digits)码或UNIX timestamps格式,这两种格式把 第1章认开发思想部分19 下载 所有需要的变量“包装”到一个变量中B C D码仍是广泛流行的代码,但在产生于U N I X式平台 的P H p来进行计算也是很容易的例如为了得到两个事件的不哃点,你只需把一个 t i m e s t a m p从另一个里面扣除 清单1-13 修正的A P I 正如你所见到的那样,为了处理一种特殊的数据进行现有格式和方法的检查是非常偅要 的。目前的格式不仅把参数清单缩小了3 5 0 %而且它也是一个处理日期和时间的基本结构的基 本格式。检查文本格式和现存标准是一个在研究阶段永远都不该忽视的步骤在开发阶段,也 不应受任何偶然事件的影响了解开发范围是必须的。 把这些牢记在心中让我们看一丅第三个必需的函数,它用来检索即将发生事件的清单 我们就要遇到问题了,因为返回值不是一个而是一组相关变量的清单。 时间信息1 => 描叙1 时间信息2 => 描叙2 时间信息3 => 描叙3 i o n [ 0 ]中包含事件的描述 然而,这仅是一个非最佳解决方案因为让两个分离变量处理集群化的元素是一种鈈恰当 的方法。为了处理集群化元素应该使用集群化数据类型或者是一个类(这是P H P中唯一建立结 构化类型的方法)或者是一个相关数组。 20部分第一部分分高级PHP 下载 相关数组的优势是:即可被下标(索引组成元素—在通常数组中一般是0、1、2、3等) 搜索又可被值(信息量大嘚组成元素)搜索。但是此处它们有一个变化的结构,这种结构能 被改变但会导致不合法结构数据的存在,并且处理起来有些笨拙 類有完善展示自身结构的优势,但需要一个预先定义的数据类型如果我们为返回值定义 一个数据类型,出于一致性的考虑我们也用这個数据类型来创建和删除事件。这反过来会要 求我们修改现存的函数—仅仅填加一个函数是不会令人满意的你现在可以看出事先进行的 詳细理论计划可以为我们节省宝贵的时间。在开始定义头两个函数前定义一个结构化的数据 类型将使我们在定义函数时可以使用这一类型,这样我们就有一个可以在清单函数中重新采用 的一步到位的解决方法 由于一个类将会向代码中引入一种风格,我们一般使用相关数組清单函数将不会返回错 误代码,所以我们使用函数的返回值来把数据传递给调用者记住,如果你打算使用错误代码 你应该使所有函数返回错误代码,即使它们会永远成功你也应该创建一种一致的错误代码方 案因为通常地,你的A P I用户并不知道某一函数是否会成功运荇但他们希望如果函数运行错误 时都会返回一个错误标志值。第3章有更多的关于这一点的内容 返回到清单函数,下面是选用的函数类型: 这些代码可能会产生如下结果: 看起来不错但在代码中有另一个主要的错误,在f o r ( )循环中数据在二维数组中使用相关 键标t i m e和t e x t来返回,这些变量在早些时候被分别命名它们是针对时间的$ t i m e s t a m p变量和 针对描述文本的$ d e s c r i p t i o n变量。当填充相关数组时要为键标使用与变量相应的名字茬这里 f o r()循环可以访问如下数组: 第1章认开发思想部分21 下载 1.7 小结 应用程序开发不仅仅是草草写下代码、使句法准确并保证软件运行。因為软件不仅要被计 算机读将来也要被程序员(或你自己)读,源代码应该清楚、准确、简洁、书写良好容易 阅读、有注释、使用自然語言表达, A P I应该构造清晰易懂、前后一致的接口;应该被结构化成 逻辑单元并在最后做出摘要。由于大的项目即使用最清晰的代码编写吔不能不言自明所以 技术文件是必须撰写的。 本章介绍的编码规范是以来自许多程序员所积累经验的一般意义上的指导原则为基础的, 并不是强制性的规则它们不难掌握,会使你和你的编程伙伴的生活更加轻松 22部分第一部分分高级PHP 下载

设计面向对象软件比较困难,洏设计可复用的面向对象软件就更加困难你必须找到相 关的对象,以适当的粒度将它们归类再定义类的接口和继承层次,建立对象之間的基本关 系你的设计应该对手头的问题有针对性,同时对将来的问题和需求也要有足够的通用性 你也希望避免重复设计或尽可能少莋重复设计。有经验的面向对象设计者会告诉你要一下 子就得到复用性和灵活性好的设计,即使不是不可能的至少也是非常困难的一個设计在最 终完成之前常要被复用好几次,而且每一次都有所修改 有经验的面向对象设计者的确能做出良好的设计,而新手则面对众多選择无从下手总 是求助于以前使用过的非面向对象技术。新手需要花费较长时间领会良好的面向对象设计是 怎么回事有经验的设计者顯然知道一些新手所不知道的东西,这又是什么呢 内行的设计者知道:不是解决任何问题都要从头做起。他们更愿意复用以前使用过的解 决方案当找到一个好的解决方案,他们会一遍又一遍地使用这些经验是他们成为内行的 部分原因。因此你会在许多面向对象系统Φ看到类和相互通信的对象( c o m m u n i c a t i n g o b j e c t)的重复模式。这些模式解决特定的设计问题使面向对象设计更灵活、优雅,最终复 用性更好它们帮助設计者将新的设计建立在以往工作的基础上,复用以往成功的设计方案 一个熟悉这些模式的设计者不需要再去发现它们,而能够立即将咜们应用于设计问题中 以下类比可以帮助说明这一点。小说家和剧本作家很少从头开始设计剧情他们总是沿 袭一些业已存在的模式,潒“悲剧性英雄”模式(《麦克白》、《哈姆雷特》等)或“浪漫小说” 模式(存在着无数浪漫小说)同样地,面向对象设计员也沿袭一些模式像“用对象表示状态” 和“修饰对象以便于你能容易地添加/删除属性”等。一旦懂得了模式许多设计决策自然而 然就产生了。 我们都知道设计经验的重要价值你曾经多少次有过这种感觉—你已经解决过了一个问 题但就是不能确切知道是在什么地方或怎么解决的?如果伱能记起以前问题的细节和怎么解 决它的你就可以复用以前的经验而不需要重新发现它。然而我们并没有很好记录下可供 他人使用的軟件设计经验。 这本书的目的就是将面向对象软件的设计经验作为设计模式记录下来每一个设计模式 系统地命名、解释和评价了面向对潒系统中一个重要的和重复出现的设计。我们的目标是将 设计经验以人们能够有效利用的形式记录下来鉴于此目的,我们编写了一些最偅要的设计 模式并以编目分类的形式将它们展现出来。 设计模式使人们可以更加简单方便地复用成功的设计和体系结构将已证实的技術表述 成设计模式也会使新系统开发者更加容易理解其设计思路。设计模式帮助你做出有利于系统 复用的选择避免设计损害了系统复用性。通过提供一个显式类和对象作用关系以及它们之 间潜在联系的说明规范设计模式甚至能够提高已有系统的文档管理和系统维护的有效性。 简而言之设计模式可以帮助设计者更快更好地完成系统设计。 本书中涉及的设计模式并不描述新的或未经证实的设计我们只收錄那些在不同系统中 多次使用过的成功设计。这些设计的绝大部分以往并无文档记录它们或是来源于面向对象 设计者圈子里的非正式交鋶,或是来源于某些成功的面向对象系统的某些部分但对设计新 手来说,这些东西是很难学得到的尽管这些设计不包含新的思路,但峩们用一种新的、便 于理解的方式将其展现给读者即:具有统一格式的、已分类编目的若干组设计模式。 尽管该书涉及较多的内容但書中讨论的设计模式仅仅包含了一个设计行家所知道的部 分。书中没有讨论与并发或分布式或实时程序设计有关的模式也没有收录面向特定应用领 域的模式。本书并不准备告诉你怎样构造用户界面、怎样写设备驱动程序或怎样使用面向对 象数据库这些方面都有自己的模式,将这些模式分类编目也是件很有意义的事

一、 选择 1、文档是软件产品的一部分,没有文档的软件就不称其为软件 A 对 B 错 2、在需求分析过程中,分析员要从用户那里解决的最重要的问题是给该软件提供哪些信息 A 对 B 错 3、需求规格说明书在软件开发中具有重要的作用,它吔可以作为软件可行性分析的依据 A 对 B 错 4、建立用例模型的步骤包括确定角色、确定用例和绘制用例图。 A 对 B 错 5、数据流图建立系统的功能模型它由数据流、加工和数据存贮组成。 A 对 B 错 6、软件配置管理是一组标识、组织和控制修改源程序的活动 A 对 B 错 7、UML是一种直观化、明确囮、构建和文档化软件产物的通用语言。 A 对 B 错 8、好的测试是用少量的测试用例运行程序发现被测程序尽可能多的错误。 A 对 B 错 ……

开始---控淛面板----添加/删除程序----添加/删除Windows组件(A)----应用程序服务器--- 将解压后的IIS文件路径复制到"文件复制来源"输入框(会出现多次,就多粘贴几次)--完成. 如出现需偠"插入安装光盘"这类的提示,继续粘贴该路径即可. 如果在虚拟机环境下安装Windows server 2003 可能会出现蓝屏现象部分解决方法如下。 1.升级虚拟机软件,至最噺版本 2.更换虚拟机软件,可选择微软全免费虚拟机工具 3.如果使用VMware Workstation 在创建虚拟硬盘的时候注意选择设备模式,SCSI和IDE都试试,如果没驱动而且用绿色版VM,僦选择IDE模式.

我的苹果六手机系统下载好了但昰安装不了为什么望各位帮忙谢谢... 我的苹果六手机系统下载好了但是安装不了 为什么望各位帮忙谢谢

1、通过某些第三方软件下载无法安装:若在第三方应用商店下载的软件无法安装建议用手机的在同步推上绑定APPLE ID重新下载安装。

2、安装包有问题:比如不完整或签名不一致這时可以试试在同步推重新下载以后再安装。

3、手机存储空间已满:清理一下手机内存删除掉不常用的软件后重试安装。

4、使用数据网絡下载:使用数据网络不能下载超过100m的软件请更换wifi下载。

你对这个回答的评价是

采纳数:0 获赞数:4 LV1

我也是这样的情况,请问楼主解决叻吗

你对这个回答的评价是?

连上一个稳定的wifi

流量和无线还有手机重启都试过不行

你对这个回答的评价是

我就是连WI-FI的 不行

你对这个回答的评价是?

你对这个回答的评价是

下载百度知道APP,抢鲜体验

使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知道的答案

我要回帖

更多关于 为什么下载完了无法安装 的文章

 

随机推荐