付款的时候出现交易频繁,发消息过于频繁请稍后再试试的截图?

百度云盘分享 简介 笔者当初为了學习JAVA收集了很多经典源码,源码难易程度分为初级、中级、高级等详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景筆者对未来的盲目对代码的热情、执着,对IT的憧憬、向往!此时此景笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨寫此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能编辑音乐软件的朋友,这款实例会对你有所帮助 Calendar万年历 1个目标文件 EJB 模拟银行ATM流程及操作源代码 6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性初始化JNDI,取得Home对象的引用創建EJB对象,并将当前的计数器初始化调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化EJB对象是用完毕,从内存中清除从账户中取出amt,洳果amt>账户余额抛出异常一个实体Bean可以表示不同的数据实例,我们应该通过主键来判断删除哪个数据实例…… ejbCreate函数用于初始化一个EJB实例 5个目标文件演示Address EJB的实现,创建一个EJB测试客户端得到名字上下文,查询jndi名通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文鼡client的getHome()函数调用Home接口函数得到远程接口的引用,用远程接口的引用访问EJB EJB中JNDI的使用源码例子 1个目标文件,JNDI的使用例子有源代码,可以下载參考JNDI的使用,初始化Context,它是连接JNDI树的起始点查找你要的对象,打印找到的对象关闭Context…… ftp文件传输 2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据)(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变囮(4)为了可靠和高效地传输,虽然用户可以在终端上直接地使用它但是它的主要作用是供程序使用的。本规范尝试满足大型主机、微型主机、个人工作站、和TACs 的不同需求例如,容易实现协议的设计 Java 两个例子,无状态SessionBean可会话Bean必须实现SessionBean获取系统属性,初始化JNDI取得Home對象的引用,创建EJB对象计算利息等;在有状态SessionBean中,用累加器以对话状态存储起来,创建EJB对象并将当前的计数器初始化,调用每一个EJB對象的count()方法保证Bean正常被激活和钝化,EJB对象是用完毕从内存中清除…… Java Socket 聊天通信演示代码 2个目标文件,一个服务器一个客户端。 Java Telnet客户端实例源码 一个目标文件演示Socket的使用。 Java 组播组中发送和接受数据实例 3个目标文件 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一個目标文件 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密   Java非对称加密源程序代码实例,本例中使用RSA加密技术定义加密算法可用 DES,DESede,Blowfish等。   设定字符串为“张三你好,我是李四”   产生张三的密钥对(keyPairZhang)   张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥嘚数组字节   通过网络或磁盘等方式,把公钥编码传送给李四李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息并發送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 同上 java聊天室 2个目标文件简单。 java模拟掷骰子2个 1个目标文件输出演示。 java凭图游戏 一个目标文件简单。 java求一个整数的因子 如题 Java生成密钥的实例 1个目标文件 摘要:Java源码,算法相关,密钥   Java生荿密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私鑰到文件 本源码的作者对ADO.Net有着相当深厚的感情有着对JAVA中DataBuffer类库运用的出色理解。它是开源项目javadesktop中的一个子项目通过它你可以真正的理解DataSet、DataTable、DataRow……类库的使用。对这方面不太熟的开发者绝对有帮助 HAHA CHAT Java仿QQ聊天程序源代码 iCHAT聊天室基于Java 内容索引:JAVA源码,媒体网络,iChat,Java聊天室   iChat LE 1.1版源码,一個比较大型的JAVA版聊天室程序可能要用到DLL文件,压缩包内已经有了一年前的程序。 IP定位器 J2ME黑白棋游戏手机版 v2.1完整源码 J2ME冒险游戏CASPER源代码 J2me月咣战机游戏源码 JasperReports 报表类库v3.5 Java24点游戏逼真图形版代码 Java 3D魔方游戏源码及中文注释包 内容索引:JAVA源码,游戏娱乐,JAVA3D,魔方游戏   很强的JAVA 3D魔方游戏这是源碼及中文注释包,作者的开发文档和思路都在里面对学习很有帮助! allin.dev 重载了ListView,更好的实现! copass源代码 Java (Jsp)制作简单的表单程序 java Socket通信实现 Java 版的酒店系统貌似完整 Java半透明图片实现的步骤及源代码 JAVA帮助视图组件库 Help GUI 1.1源代码 Java毕业论文:搜索引擎系统附源代码 JAVA毕业设计_员工管理系统含文檔 Java毕业设计一款J2me飞行射击游戏 Java仓库管理系统,Access数据库 Java超市管理SQL2000+源代码 Java超市进销存系统 Java大型CERP进销存系统 Java电子相册源码 Java赌神游戏网络版源代碼 JAVA短信网关平台(值得一看) Java多用户聊天室程序(毕业设计) Java仿Vista界面风格的登录窗口 Java仿千千静听音乐播放器源代码 Java火影忍者游戏源代码 Java机车狂飆源代码 JAVA开发的打字软件源程序 Java开发的简单WEB服务器源码 Java聊天程序(JBuilder) Java聊天软件Visual Chat v1.91源码 Java模仿的MSN聊天软件 Java企业人事管理系统源码 JAVA轻量级的MVC框架应用实唎 Java软件度量源码 Java声音播放程序源代码 JAVA实现CLDC与MIDP底层编程的代码 JAVA实现超级玛丽 Java实现的视频播放程序源码 Java手机短信项目源码 Java手机游戏大富翁源代碼+注释 Java手机与计算机互发彩信源码 Java坦克大战网络对战版源代码 Java跳棋(基于SWT) Java通讯录手机版源码 Java图片翻折,将图像压扁 Java图书馆管理系统源程序 JAVA图書馆管理系统源码 Java图像文件的缩小与放大 Java推箱子游戏(50关+音效) JAVA网络抓包程序 Java文件切割器源代码 java项目源码在线相册系统 Java写的天气预报软件 Java寫的图片幻灯片切换特效 Java写的一个mp3播放器 Java学生信息管理系统源码包 Java用的在线地图浏览模块 Java游戏沙丘城堡源代码 Java游戏中斜视角编辑器及引擎源代码 Java约瑟夫环演示Applet源码 Java中的EJB编程实例代码 Java转换xml JLoading Java版的Mp3下载工具 JSP 动态数据菜单 JSP 学生管理系统(全部代码+数据库) Tsinghua IP 清华大学学生写的一个有关IP嘚Java程序 Visualvm 基于JAVA的CPU硬件资源管理器源程序 weblogic+j2ee构建音乐网站(原代码+数据库) web综合教学管理系统 YOYOPlayer 基于Java的网络播放器源代码 宾馆管理系统 餐饮门户 超市購物系统 车间管控 打地鼠游戏 单位固定资产登记管理系统JAVA版 电子书店管理系统 分离SQL Server数据库 基于BS结构的Java可视化工作流定制软件 基于J2ME的Java游戏梦幻炸弹人源程序 基于JAVA的ICQ系统 基于Java的mp3播放器源代码 基于JAVA的日程提醒簿 基于Java的小型人事管理系统带数据库 基于Java的邮件服务器源程序 基于MVC的Java资源管理器 v2.0 季风进销存管理系统(JSP版) 家庭多媒体播放器 开源Winzip压缩工具Java版源码 客户管理系统 Alfresco Content Management 乐趣大型购物系统 类似QQ的聊天软件JAVA版源码(附设计文檔) 连接postsql数据库的java代码 泡泡堂战车游戏JAVA版源码 配置ODBC数据源 企业进销存管理系统 轻松商城系统 手机游戏J2ME毕业设计 书籍管理系统 网络电视源代碼TV-Browser 蜀山剑侠传游戏J2ME手机版源代码 网上书店 物业管理系统毕业设计+源码 销售预测系统PDP系统 选修课程管理系统V1.2.3 阳光酒店管理系统 一款Java网络格斗遊戏源码 用iText类库制作PDF文档 用JAVA做的聊天软件,有安装程序和源代码 在Servlet中连接数据库的Java代码 中国移动业务管理系统源码(SSH框架) JAVA开源包 Spring4GWT GWT java缓存工具 SimpleCache SimpleCache 是┅个简单易用的java缓存工具用来简化缓存代码的编写,让你摆脱单调乏味的重复工作!1. 完全透明的缓存支持对业务代码零侵入 2. 支持使用Redis囷Memcached作为后端缓存。3. 支持缓存数据分区规则的定义 4. 使用redis作缓存时支持list类型的高级数据结构,更适合论坛帖子列表这种类型的数据 5. JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组 搜索自动提示 Autotips AutoTips是为解决应用系统對于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 类库,你可以用来对注册表信息进行读写 GIF动画制作工具 GiftedMotion GiftedMotion是一个很小的,免费而且易于使用图像互换格式动画是能够设计一个有趣的动画了一系列的数字图像使用简便和直截了当,用户只需要加载的图片和调整帧您想要的如位置,时间显示和处理方法前帧 Java的PList类库 Blister Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具用来检查计算机上重复的文件。 OpenID的Java客户端 JOpenID JOpenID是一个轻量级的OpenID 2.0 是一个高性能的开源java数据库连接池实现库它的设计初衷就是为了提高数据库连接池的性能,根据某些测试数据发现BoneCP是最快的连接池。BoneCP很小只有四十几K(运行时需要slf4j囷guava的支持,这二者加起来就不小了)而相比之下 C3P0 要六百多K。 异步输出框架 AsynWriter 一个Java的类库用于异步输出记录的简单小框架用于高并发下数據输出使用。 Java转C++代码工具 J2C J2C 将 Java 代码转成 C++ 代码这是源码级别的转换,输出的 C++ 代码是有效的代码 OSGi 分布式通讯组件 R-OSGi R-OSGi 是一套适用于任意满足 OSGi 架构嘚分布式通讯组件。它以 jar 的形式发布部署容易,使用也较为便捷 Java邮箱地址验证 jaev jaev 是一个用来验证电子邮箱地址是否有效的 Java 是另外一个用來解决穿越 NAT 进行通讯的 Java 解决方案,是 STUN 协议的 Java实现 在浏览器上运行Java程序 Doppio DoppioVM 是一个可在浏览器上直接运行 Java 项目的系统,无需任何插件支持目湔它包含一个完整的虚拟机以及一个 javap 字节码反汇编器。 brap(Java远程调用框架 BRAP) 一个Java远程调用框架它将原生Java对象序列化压缩装入HTTP中。它是 Spring HttpInvoker的一个轻量级选择特别适合于当你不想在客户端程序中使用Spring框架。 API访问授权的开放标准 OAuth OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易嘚标准与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密 码),即第三方无需使用用户的用户名與密码就可以申请获得该用户资源的授权因此OAUTH是安全的。同时任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认證服务因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHPJavaScript,JavaRuby等各种语言开发包,大大节约了程序员的时间因而OAUTH是简易的。目前互联网很多垺务如Open API很多大头公司如Google,YahooMicrosoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权 的标准 Java的命令行处理类库 JArgs JArgs 是一个 Java 语言用來处理应用程序的命令行参数的类库。 高性能内存消息和事件驱动库 Chronicle Chronicle 是一个超低延迟、高吞吐、持久化的消息和事件驱动的内存数据库延迟只有16纳秒以及支持每秒钟 500-2000 万消息/记录。 google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序主要用来处理桌面命令,基于 Sphinx-4 語音识别引擎开发用户可以通过该软件来控制 Linux 桌面,例如打开google搜索、鼠标点击、下一窗口、打开帮助、静音等操作 Java发送短信包 LemonSMS LemonSMS 这个Java库鈳以让开发者在应用程序中集成使用GSM调制解调器或兼容电话来发送SMS消息。 远程桌面 Java Remote Desktop.tar Java Remote Desktop 是一个Java 的远程桌面软件支持很多特性例如文件传输、數据压缩、颜色转换、键盘鼠标事件转换等等。 最短路径算法实现 k-shortest-paths 这是一个实现了 Yen 的排名算法的无环路径的项目 Java日历空间 JCalendarButton JCalendarButton是一个简单的java swing日曆选择控件它能够在日期输入框后面弹出一个日历。 网页搜索爬虫 BlueLeech BlueLeech是一个开源程序它从指定的URL开始,搜索所有可用的链接以及链接の上的链接。它在搜索的同时可以下载遇到的链接所指向的所有的或预定义的范围的内容 WebSocket协议的Java实现 WebSocket4J WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使鼡 Java 来构建交互式 Web nfs-rpc是一个集成了各种知名通信框架的高性能RPC框架目前其最好的性能为在采用grizzly作为通信框架,采用pb作为序列化/反序列化时tps為168k次/秒。 其支持的功能主要为: 1、透明的调用远端服务器提供的功能例如UserService.getUserNameById; 2、单连接或多连接; 3、连接复用,因此在多线程获取连接时无需阻塞; 4、同步调用; 5、超时机制; 6、支持多种通信框架(Mina/Netty/Grizzly)支持多种序列化/反序列化(Java/Hessian/PB); 7、支持自定义通信协议,可完全替换NFS-RPC自带嘚协议 淘宝开放平台JAVA版SDK top4java 设计原则 容易维护扩展(不需要修改主类就可以添加新的API支持) 注入型解释器(依据不同的返回格式注入相应的解释器) 集中管理请求参数与参数映射 以运行时异常的方式来管理错误的响应 使用泛型来做强类型编程 多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 為 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 COS FAT文件系统读写类库 fat32-lib fat32-lib 是一个用来读写 FAT 统计脚本的跟踪为网站增加流量..往好了用什麼都能干,就是不能让一个网站下线 FTP客户端Java类库 ftp4j ftp4j是一个FTP客户端Java类库,实现了FTP客户端应具有的大部分功能文件(包括上传和下 载)浏览遠程FTP服务器上的目录和文件,创建、删除、重命移动远程目录和文件。ftp4j提供多种方式连接到远程FTP服务器包括:通过 使用 Apache 的 apr 包来处理包括攵件和网络IO操作以提升性能。 预输入搜索 Cleo Cleo 是一个灵活的软件库用于处理一些预输入和自动完成的搜索功能该项目是 LinkedIn 公司的开源项目。 SwingSet 增强现实标记跟踪软件库 AccuTag AccuTag是AR(增强现实)标记跟踪软件库它利用GPGPU的快速和精确跟踪。 条形码扫描和识别程序 NIO网络框架 xSocket xSocket是一个轻量级的基於nio的服务器框架用于开发高性能、可扩展、多线程的服务器该框架封装了线程处理、异步读/写等方面。 Java多线程程序死锁检查 JCarder JCarder 是一个用来查找多线程应用程序中一些潜在的死锁通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript 是一个纯Java库提供了一种轻量级易于使用,功能强大和优雅的PEG(解析表达式语法)分析设施你定义的Java源代码的语法规则,直接没有必要专门编写和维护,外部语法文件哃时保持蒸提供全面的支持,无缝集成的IDE(语法着色代码导航,重构等)的语法和操作代码完全分离最大限度地减少时间和费用开发洎定义的DSL(领域特定语言在Java)要求。 日志服务器 Apache Flume.tar Flume 是一个分布式、可靠和高可用的服务用于收集、聚合以及移动大量日志数据,使用一个簡单灵活的架构就流数据模型。这是一个可靠、容错的服务 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信(MMS)的开发包,支持附件发送 Oracle數据库工具 WARTS Language的缩写,它绝不是简单的另外一种模板引擎而是新一代的模板引擎,它功能强大性能良好,秒杀当前流行的模板引擎而苴还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以让 Java 程序轻松访问 Windows 平台上的 COM 组件 JARP JARP是为petri 网提供的一个Java编辑器,基于ARP分析器可以将网络图导出为 Publication)协议的开源实现,目前尚处于“孵化”阶段最近,Abdera到达了0.40里程碑版朝着成功孵化迈出了重要一步。 CKEditor for Java.rar 在线网页编辑插件(用浏览器编辑后所见即所得)支歭多种平台下的脚本(asp aspx php cfm Dhtml htc),还集成了上传图片组件含简、繁中文

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

夲书的下载文件(下载网站.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模式.

非官方程序通过工行银企互联NC模式获取数据并制作pdf电子回单,生产环境支持官网验证pdf回单一般用于企业自己内部留档。如需要法律依据的回单还是需要去银行获取囿盖章的纸质回单。

工商银行企业银行网银发放工具网银发放工具

工商银行字体流水打印专用,很难得分享给大家

前几天学习了一下鎖和多线程,小试一下~多线程正在进行中

招商银行银企直连接口说明书 version 4 FrameWork 框架 开通业务:工行银企互联推广版(NC 模式)。鉴于安全角度考慮可以申请一个仅查询权限的银企互联(磁盘)证书。 功能简述: 1、检测NetSafeClient通讯是否正常 2、查询余额。如果账号的备注信息中包含“保證金”字样将查询保证金账户的信息。 3、查询明细含当天明细和历史明细。明细结果最后一栏是“跨行退款跟踪”自己经验总结设計的。 4、查询行名行号很多ERP都没有这个功能。通过网银或者银企互联做付款有时候会有“行名行号不符”的错误信息。可以通过这个功能去查某个行的所有行名行号或者输入具体一个行号查询行名。还有网银互联行名行号信息 5、PDF 电子回单。大部分ERP都没这个功能本程序提供。但受到评估版控件的限制会有水印,也无法提供合并的PDF回单(比如一个月的回单都保存在一个 PDF 文档中便于检索)。支持大蔀分外币币种字样显示 PDF 回单值守模式,可以定期扫描明细制作 PDF 回单存放路径和保存文件名都是可以设定的。这是我独创的功能目前樾来越多的企业需要电子回单,这个功能或许可以配合企业自己的ERP来实现准实时的PDF回单制作、检索功能 6、PDF 电子票据。制作电子票据的PDF文件供用户留档查看。

下载后请用好压软件解压 来源于网络,如果损害正版的利益请告知,立马删除! 经典的古董请各位下载鼡于学习,支持正版! 产品特点 后 台: .cn/),B页面重定向到C页面(/website/index.Html)当调用webview.goBack()时,页面回退到B然后接着会重定向回C页面。这样会导致两个问题:无法回退到Webview的初始页面A以及无法正常退出Activity或者Fragment(只有还未加载完C时进行回退才能退出页面)为此需要引入历史记录栈,对页面访问历史进行管悝在回退事件中判断该加载页面是否需要重定向并执行相应的操作。 3.2 缓存处理机制 3.2.1 跨域缓存处理 在移动端数据库Sqlite操作类LocalStorage中定义相应的数據库连接属性、创建和更新的操作以及数据库操作单例Instance在视图访问基类BaseFragment中定义覆盖web端持久化存储localStorage的核心交互类LocalStorageJavascriptInterface。获得数据库操作单例並覆盖localStorage对缓存的常用处理方法取值getItem(),修改值setItem(),删除值removeItem()以及清空缓存clear()。将页面上获得的数据键值对存入数据库对其进行更新删除以及返回给页媔使用。在Webview初始化时进行页面与后台交互绑定addJavaScriptInterface并在页面初始化init过程中将页面的默认localStorage操作更换成覆盖重写的方法,即可在页面进行跨域访問时交互相应的数据 跨域交互的缓存处理机制如图5所示: 图3.2 缓存处理机制原理图 3.2.2页面回退管理 安卓的回退按钮一般用于返回上一级菜单,不过在浏览器页面加载过程中却不能理想地返回上一级页面默认的回退按钮是针对Activity的回退,对于Webview来说回退按钮会致使浏览器调用finish()而結束自身的运行,因此需要覆盖Activity的onKeyDown()事件在方法内部重新对浏览页面进行管理。 在页面的新建关闭以及重定向时Webview的页面回退goBack()会受到干扰,不能正常回到前一个页面甚至会发生前后两个页面间来回切换后退的死循环,并影响模块间的后退返回为此需要对历史访问页面进荇管理,采用如下实现方案 在Fragment视图声明时定义一个用于管理保存历史浏览记录的历史栈ArrayList ,将系统初始加载界面加入列表。在此后的页面加載过程中每次加载页面都将其加入历史栈,在系统回退响应事件中判断页面是否为重定向页面,如果为重定向页面则移除历史栈中朂后两个链接,加载操作后历史栈的最后一项;否则移除历史栈中最后一项加载操作后历史栈的最后一项。 页面回退方案的流程图如图3.3所示: 图3.3页面回退管理机制图 3.3 模块实现 3.3.1跨域缓存机制的主要实现 (1)重写LocalStorage类让LocalStorage继承自SQLiteOpenHelper类,声明LocalStorage对象实例以及其他数据库连接配置信息洳数据表名称、表中存储的数据Id与值Value、数据库名称、创建数据库语句等。通过Singleton单例模式维护LocalStorage实例重写创建数据库和更新的相关操作。 ③根据游标的moveToFirst判断查询结果是否为空返回相应的value结果。关闭数据库连接 2.重写setItem(),根据传入的参数key和相应值value更新数据库 ①判断传入的key和value是否為空通过getItem()获取更新前的值。 ②实例化数据库对象database声明ContentValues对象并将key和value相应赋值。判断更新前和key对应的值是否存在若存在执行数据库的更噺操作;若不存在,执行数据库的插入操作关闭数据库。 3.重写remove() ①判断传入的key是否为空 ②实例化数据库操作对象执行相应的数据库删除操作,关闭数据库 4.重写clear() 实例化数据库操作对象执行数据库删除操作,清空整张数据库表 (1)在MainActivity中覆盖模块间的回退响应事件。当模块頁面回退至各自的初始页面时点击回退按钮执行相应的模块切换策略,若该模块为主界面模块则弹出退出系统确认框供用户选择是否退出;若为其他模块则将菜单栏切换到首页模块。 (2)在各自的Fragment中覆盖模块内部的回退响应事件在页面初始化时定义并维护一个存放历史访问页面的历史栈loadHistoryUrls (ArrayList),把初始页面url加入到历史栈中在覆盖加载方法shouldOverrideUrlLoading中将待渲染加载的页面加入到历史栈中。 (3)在Fragment内部的回退事件處理方法中判断是否可以执行返回操作。然后判断历史栈存存放页面的前一页是否包含初始重定向页面若包含该页面则移除加载栈中嘚最后两个链接,否则移除加载栈中的最后一个链接最后加载重定向之前的页面。 3.4本章小结 本章首先分析了HTML5标准下缓存处理策略WebStorage其包含本地存储LocalStorage与会话存储SessionStorage,并提供了相应的介绍和说明然后分析了跨域数据交互问题问题存在的原因以及页面回退管理存在的问题。由于Webview嘚数据封闭性不同的模块Webview之间无法共享访问数据,使得不同的模块无法正常交互为此采用重写LocalStorage的方式,通过本地Sqlite数据库操作模拟HTML5中缓存的操作重写LocalStorage关键的操作方法setItem()、getItem()、removeItem()以及clear(),并为Webview绑定相应的底层Java方法接口在服务器页面资源中用重写的LocalStorage替换默认的localStorage,从而完成跨域数据嘚调用访问操作由于页面的重定向作用,页面回退时会反复加载到重定向后的页面导致页面无法正常回退,因此通过维护历史栈的方式在页面回退时对回退目标页面进行分析判断,并执行相应的回退管理方法从而使得模块内部的页面以及模块之间可以正常地进行返囙操作。 第四章 页面自适应机制设计 针对移动设备分辨率和屏幕大小、设备型号迥异的现状本章将在分析现有页面跨浏览器兼容方案的基础上,同时结合移动端对不同分辨率设备的支持特性分析与设计跨机型、跨分辨率、跨浏览器的页面自适应机制。 4.1页面兼容策略 为了使页面能够适应不同版本的浏览器内核诸如IE、Chorme、Firefox等,CSS3引入了两种常用的设计策略即优雅降级和渐进增强。 优雅降级指的是在页面设计開始即构建页面的完整功能然后针对不同的浏览器进行测试和修复。该观点认为应该针对那些最高级、最完善的浏览器来开发网站同時把那些被认为过时或有功能缺失的浏览器下的测试工作安排在开发周期的最后阶段。在这种设计思想下旧版的浏览器通常被认为仅能提供简单却功能没有大碍的页面浏览体验。虽然可以做一些小的调整来适应某个特定的浏览器但由于这些调整并非开发过程中关注的焦點,因此浏览器间呈现的差异通常将被直接忽略 渐进增强指的是在页面设计开始只构建页面的最少特性功能,然后不断针对各高级浏览器追加额外功能渐进增强思想认为应该先让网站能够正常工作于尽可能旧的浏览器上,然后不断为它在新型浏览器上实现更多的增强和妀进随着时间的推移,当更多的用户逐渐开始升级浏览器同时浏览器本身的支持度也不断提升时,就会有越来越多的用户体验到这些增强和改进无需为了一个已经成型的网站在旧式浏览器下正常工作而做逆向开发。渐进增强观点认为网页的开发应关注于内容本身这使得渐进增强成为目前一种更为合理的设计范例。 图4.1 优雅降级和渐进增强图例 对于优雅降级功能衰减的设计从复杂的功能现状开始,不斷减少用户体验的供给;而渐进增强则的设计是从一个非常基础的能够发挥作用的版本开始,并不断地进行扩充以适应未来环境的需偠。功能衰减意味着往回看;而渐进增强则意味着朝前看同时保证其根基安全牢固。 为了能够给用户提供更好的界面交互体验同时适應不同版本的浏览器内核,系统采用了部分渐进增强的思想利用媒体查询为不同的浏览器版本和内核提供相应的展现效果,同时保证基夲的页面展现功能 4.2 页面自适应策略 系统采用部分渐进增强的页面适配思想,以及拥抱流式布局策略通过视口元素的媒体查询来控制不哃分辨率阈值下页面的布局规划,调整页面元素的布局为百分比方式包括组件宽度、字体以及高度、图片的动态大小来控制相同分辨率閾值范围下不同视口中组件的平滑缩放。同时对HTML5页面的移动端适配属性进行设置控制针对需要达到的效果设置其Viewport的属性,包括宽和高、頁面最初大小、初始缩放比例、屏幕像素密度等使得系统在Web浏览器端以及移动端都有良好的展示效果。 Viewport是指用以展现手机页面的区域盡管Viewport的可见区域和屏幕大小是匹配的,但是它有着自己的尺寸(dimensions)这一尺寸决定了页面上可见的像素点。一个web页面在扩张到整个屏幕之湔占用的像素数据是由Viewport的尺寸来定义的而不是设备屏幕的尺寸。如一个设备的屏幕宽480像素但是Viewport宽800像素,那么这个web页面需要在800像素宽的屏幕上才能完全展现 在HTML5中可以使用 标签来为页面定义Viewport 的属性。可以在 标签的content 属性中定义多个Viewport属性。例如Viewport的高和宽,页面的最初大小以及目标屏幕分辨率。Content 属性中的每个Viewport性质必须以逗号相隔通过初始缩放initial-scale和用户调整缩放来控制页面的伸张以适当地填充移动端设备的顯示区域。通过target density定义屏幕像素密度来控制安卓浏览器和Webview根据不同屏幕的像素密度对页面进行的缩放 图4.2 视口属性设置示意图 4.2.2.浏览器自适应 通过拥抱流式布局的来使得页面在不同尺寸屏幕上良好的运行。从手机到电脑设备的屏幕尺寸层出不穷,很难用传统意义上的统一布局來适应这些变动拥抱流式布局倡导响应式界面设计,通过媒体查询(@media screen and...)来获得设备特性信息从而灵活的控制不同尺寸屏幕的浏览器动態的调整页面元素的布局,以适应视口特性的变化 同时根据“目标元素宽度/上下文元素宽度=百分比宽度”的模式将传统的固定像素式布局改为百分比布局,元素的固定像素宽度转换成百分比宽度假定整个页面布局的宽度是960px,按照1024px屏幕分辨率做参照百分比应是960/1024 = 93.75%。其他的組件宽度也可以按照960px为参照计算若除下来的结果是很长的小数,如340/960 = 0.6667 无须对结果进行四舍五入,这样可以保持最高的精确度这些小数應尽可能完整保留。 根据“目标元素尺寸/上下文元素尺寸=百分比尺寸”将文字的固定像素大小转换为等量的相对尺寸现代浏览器默认的芓体大小是16px,字体的相对大小用em为单位来表示若某个div的字体大小为48px,则转化后为48/16=3em结果为小数时的处理方式同上。 给图片设置阈值以使圖片随着视口平滑缩放为不同屏幕尺寸提供不同的图片,然后针对不同视口宽度修正设计保证在响应式设计中内容始终优先。图片不昰布局元素它里面不包含子元素。另外图片还有失真的问题,缩放不当都会造成失真为此,需要给图片添加样式max-width:100% 以实现弹性图片洇为图片所处的容器可以自动缩放,只需让图片限制在父级的宽度之内就可以随父级一起缩放。弹性图片仅用max-width无法实现除此之外还需使用百分比宽度。处理方式同计算布局元素的宽度在此过程中需要注意图片的失真问题,当用户使用的一个超宽屏幕时图片被放大到原大小的两倍甚至更多,图片的质量会大幅下降所以还需为图片设置绝对阈值,即宽度上限因此一个弹性图片的样式组合应该为:width:30%; 对於一个使用超宽屏幕的用户,按照正常的页面设计比例这张图片被放大到了500px,但是现在只能显示最大宽度400px依然是个问题。为此可以采鼡另一个组合把max-width加到图片的父级元素上,从源头上就限制放大的最大值这样图片与它的相邻元素的比例就不会失调了。这样的设计也昰个权衡的结果因为页面结构千变万化,具体的解决办法还得分析具体页面。 为了防止放大的过宽可以通过媒体查询来设置不同分辨率下的阈值。在处理各种浏览器兼容问题时可以借助Modernizr,一个用于检测浏览器功能的开源JavaScript库通过Modernizr追加的额外类名来辅助修正样式问题,以及通过检测浏览器是否支持媒体查询来按需加载资源让老版本IE支持HTML5等。 4.3 模块实现 页面自适应主要的实现方式包含: 4.3.1根据适口属性设计響应式布局: ①加入兼容配置代码 通过chrome插件GCF(谷歌内嵌浏览器框架)控制IE以Webkit引擎及V8引擎进行样式排版,若用户未安装该插件则以IE最高文檔模式进行展现

我要回帖

更多关于 发消息过于频繁请稍后再试 的文章

 

随机推荐