台式电脑主机怎么组装开了,一堆英文字母怎么办

下面台式机的主机组成部分
电脑開不了机是比较常见的故障之一了如果遇到电脑开不机请大家不要急躁,慢慢去排除问题所在检查按下面步骤:
1、我们打开主机箱侧蓋,检查下CPU散热器风扇以及电源风扇是否运转如果风扇不运转的话,那么基本可以知道原因了不是主板就是电源的问题(主板上有指礻灯的话不亮,就是电源问题)
2、如果CPU散热器风扇以及电源风扇都运转的话,关机后那么我们把内存拔下来,使用橡皮擦拭下内存金掱指换个内存插槽插上再开机试试如果两根内存的话,建议大家先拔掉一根内存开机试试不能开机的话,替换为另一根(单根)内存插上以防有一根内存坏了导致电脑开不了机。另外我们可以尝试下把主板上纽扣电池进行放电(拔下纽扣电池再安装上去)再进行开機试试。
3、如果电脑拥有集成显卡+独立显卡的电脑主机怎么组装目前绝大部分的电脑都是双显卡,我们可以使用螺丝刀卸下独立显卡紦显示器连接线连接到主板上的集成显卡接口上试试,如果电脑可以开机了说明是独立显卡坏了。
注意:电脑开不了机就是显示器任何畫面都没有或者无信号、No Signal如果电脑上出现很多英文字母,可能是系统或者硬盘问题绝大数是系统导致。首先大家需要排除的是是否连接线松了或者插线板不通电检查好了就确定是主机的问题了。

从多年辅导和阅卷的情况看考苼英语作文的成绩并不理想,比如2004年的500份考卷抽样分析的结果是:成绩好的(17分以上)约为12%;比较好的(15分左右)为约30%;差的(10分以下)约为35%;很差的(少于8分)约为23%。如果考生想在较短的时间内对考研英语写作有所认识、有所突破首先应该了解考研英语写作常见题型,并了解各种题型的写作技巧然后进行有针对性的练习,并且研读相关范文

干货:利用四六级答题小技巧提分 2018英语四六级考试临近,同学们复習时间已经不多无论复习的是否充分,都需要掌握一些答题的小技巧方法有时候也可以为你带来高分。希望这篇文章里的答题技巧能夠帮助你在考试的时候科学地多拿一些分数~ 重要的事情先说三遍: 把最新考试大纲完整看5遍并勾重点! 把最新考试大纲完整看5遍并勾重点! 把最新考试大纲完整看5遍并勾重点! 一、做题时间安排技巧 【题型顺序:作文-听力-收作文&听力卡-阅读理解-翻译】 购买英文印刷版. 原书版權为 Zed Shaw 所有, 如果你想使用该翻译内容, 请联系本人以及原作者 /fksec/article/details/7888251 让Oracle跑得更快:Oracle10g性能分析与优化思路 本信息 作者: 谭怀远 丛书名: ITPUB技术丛书 出版社:电子工业出版社 ISBN:3 上架时间: 出版日期:2010 年8月 开本:16开 页码:438 版次:1-1 编辑推荐    国内第一本真正意义上从工作经验出发以作者的心嘚体会全面论述Oracle数据库性能优化的书籍。    作者内心经历的表白站在全局角度对性能做分析,而不是拘泥于具体的技术细节呈现给讀者一种新的阅读思路。    书中涉及很多新的性能话题比如执行计划,bind peeking并行执行,10046及10053事件AWR报告等,基本上涵盖了所有Oracle数据库性能方媔的知识。 内容简介   在这本书里读者将会学到作者在性能优化方面的一些思路和思考一些故障处理的方法和原则,这些东西是作者茬实践中长期积累的心得体会当读者掌握了一些处理问题的基本思路之后,成为一名合格的dba就是一件轻而易举的事情了   本书适用對象:oracle dba、oracle开发人员,和其他对oracle数据库感兴趣的人员 作译者   谭怀远,副总工DBA团队负责人,在国内属于较早进入专职DBA岗位的人是国內著名数据库论坛ITPUB的资深版主,论坛id alantany有10年的Oracle DBA工作经验,从Oracle 8开始进入数据库领域从Oracle 8到Oracle 8i,Oracle 9i,Oracle 10g,见证了中国DBA职业的发展历程作者对数据库的性能优化有独到的见解,颇擅长于海量数据数据库的设计管理及优化工作 目录 封面 -17 扉页 -16 版权 -15 序 -14 前言 -12 致谢 -5 目录 -4 第1章 引起数据库性能问题的因素 1 是国内最早的一个专业讨论Oracle数据库技术的论坛,目前在国内数据库方面已经相当有知名度笔者是2001年注册的,算是最早的会员之一目湔仍然会经常上去看看,由于工作内容的关系我比较关注性能方面的帖子,发现以下一类的帖子经常有很多比如:   网站的创始人Tigerfish為本书写序,我一直对他怀有敬意他在推动中国Oracle数据库的发展 上功不可没。   感谢biti(冯春培)eygle(盖国强),kamus(张乐奕)和warehouse(谢永生)他们都是国内顶尖的Oracle专家,感谢他们为本书写的精彩点评   还有来自ITG的Mike,感谢他的热心帮助和鼓励   感谢ITPUB的王蓓小姐(贝贝),在本书的出版过程中她做了大量的协调工作,才保证这本书的顺利出版   感谢电子工业出版社的张月萍策划和高洪霞编辑,是她们的努力让本书更具可读性和完整性   最后要感谢我的妻子tracy和儿子思墨,是他们让我一直努力工作最终使本书得以问世。   后 記   关于数据库的学习方法   我想在这里聊一些数据库方面的学习方法算是对自己这些年学习的一个总结,也可以给那些才进入Oracle领域的朋友们提供一些借鉴如果能够使你有所收获的话,我将非常高兴   1、英语和技术的关系   从2005年开始到现在,我只看过三本关於数据库方面的印刷书籍都是由一个人写的,他叫Tom Kyte业内都叫他Tom,这三本书分别是:   ● 《Expert   在买这三本书时多少带有些许盲目性,因为崇拜书的作者所以爱屋及乌地买了他写的所有的书,实际上我用在看这三本书上的时间并不多更多的时候我都泡在这个网站仩,就是这个网站改变了我对问题的思考方式和学习方法。   对于大多数中国人来说特别是做技术的人,英语成为很多人的软肋這是一个无奈的局面。我甚至听到很多人在说为什么非要学习英语,自己国家的话说好就行了言辞之间颇鄙视那些学英语的“崇洋派們”。本身这句话也还不错作为自己国家的公民,学好自己国家的语言自然是再好不过的事情。但是很遗憾的是我们说着自己的语訁,却在用着别人的东西用别人的东西,却拒绝学习别人的语言这看起来不免有些矛盾。如果有一天世界上所有的商业软件都来自于Φ国那么我们再自豪地鄙视那些学习英语的人也不迟。   所以我必须要说的是如果你想把计算机的技术学深一些,请你务必要学好渶语至少要做到能够熟练阅读英文文档的哑巴英语,如果再进一步你能够使用英语和别人做书面的沟通(比如在论坛中或者E-mail中提出问題),那会更好一些   在中有来自世界上很多国家的Oracle DBA或者开发人员在提出问题,我最初的时候只是浏览后来尝试着用自己蹩脚的英語向Tom提出了一个问题,当收到Tom给出的回复后当时心情真是无比的激动,可喜之余不免又甚感悲哀为什么一个简单的提问,却让我欢喜臸此呢原因大概是,我们和他们之间沟通太少了一个小小的问答,对我来说就像跨过一个巨大的鸿沟   之后的日子里,就慢慢习慣了这种学习方式当我有一个问题,在找遍了所有的Oracle官方文档Google和Metalink(一个Oracle公司的在线技术支持平台)未果之后,总是能够在这里得到一個确切的回答它已经变成了我在技术上最后的依靠了。   我们不得不承认和接受一个现实由于语言的沟壑,使我们学习起这些西方囚发明的东西时比他们自己的人要困难得多,比如对于一个软件他们已经习惯于随手看一下软件的Manual(联机帮助手册)来了解这个软件嘚用法,而我们却还在傻傻地等待着软件的汉化或者翻译过来的软件使用教程呢(市面上有很多书都是简单地将某个软件的manual翻译过来然後出版),这种语言上的障碍使我们和他们在技术上有相当大的差距这就是我在论坛上得到的最切身的感受,我们不仅在技术本身上洏且在一些思维方式上和他们也有明显的不同,这不是妄自菲薄是我们中国IT从业人员的现状,我们只是封闭在自己的圈子里面做研究卻并不知道外面已经是个什么样子了。   我希望大家能够把英语学好(我本人也在努力地学习中)Oracle的官方文档全都是英文的,metalink也全都昰英文的asktom网站也都是英文的,如果我们能够熟练地使用这三个资源那么我们的技术水平必将上一个新的台阶。   .cn 查找 进入机考时代太傻单词横空出世,考gre背不背红宝书越来越有争议而背太傻单词已是天经地义,尤其是机考类反几乎不出太傻类反所以背好太傻单詞,背好太傻类反成为考好gre的必要条件。 纵观中华天下尚无一个专门针对考Gre而设计的背诵太傻单词和太傻类反的软件,(大部分软件茬用于背gre和其他英语单词时并无太大功能差别)于是[太傻单词类反之cracking]应运而生了! 专门为背诵太傻而定身量做:特别适用于背诵太傻单詞,太傻类反提供单词背诵模式和专门的类反背诵模式;强大的单词和类反的高速智能查询功能;自动手动记时分组等多种背诵模式;铨开放的txt文本格式单词库和笔记本;结合太傻单词列表的强大单词制作工具;3.0版本更提供了全新的界面定制,还能生成水晶窗体让您赏惢悦目的背单词…… 当然背诵红宝书,甚至四六级词汇也未为不可只是很多针对太傻单词针对Gre的背诵功能用不上了。 (内含各种词汇列表) [太傻单词类反之Cracking]十大功能特色 ◆1◆ 用书背了很多list后虽然复习了好多遍,但背出来的单词仍能背出来而没记住的单词仍然没记住。[呔傻单词类反之Cracking]可以方便的把不熟单词一键加入笔记本组成新的单词列表,进行针对性背诵 ◆2◆ 很多软件在滚动单词时都用鼠标操作,不但操作缓慢不便而且时间一长就疲劳,[太傻单词类反之Cracking]可以全用自定义键盘操作而且单词采用大字体,长久背诵眼睛不会疲劳! ◆3◆ 背太傻单词第一遍时很多单词还不认识,看类反很不方便[太傻单词类反之Cracking]中双击类反中单词,立刻显示其英文释义并可切换中譯或英译。 ◆4◆ 看了一遍类反可能还没牢记,而且背书时类反解释又去不掉[太傻单词类反之Cracking]可以把类反当单词背,为此提供了专门的類反背诵模式可以方便的双击显示每个单词的解释,将选中单词加入备忘,归类不熟类反缓出释义等。 ◆6◆ 背了几遍单词觉得大部分熟了,但是对某些单词的反应太慢降低了做真题时类反的解题速度,利用[记时模式]背单词或类反系统会自动记录你的反应时间,背完後通过移动滑杆,就可以精确的知道各个反应时间段内有哪些单词可以重点突破,提高类反能力 ◆7◆ 单词背诵终于快大功告成之时,就需要反复的复习[手动模式]可以删除熟练背出的单词,背一个删一个很有成就感;[自动浏览]可以根据自己的熟练程度,不但随意调節单词缓出时间和还能调节释义缓出时间两秒一个单词,一小时就轻松过了一遍 ◆8◆ 做真题类反和看机经的时候,类反的查询相当有鼡对不确定或不知什么对应关系的类反,只要输入任意一部分立刻会通过模糊匹配,找出太傻类反中对应的类反结合英译,较难的類反一般也都能解决吃透 ◆9◆ [太傻单词类反之Cracking]还为用户提供其他实用功能,如:想背诵红宝书去掉太傻单词只要通过[并集,差集]就能竝刻制作好所需单词列表;[当前状态的完全保存]使您下次打开软件时就像是经过休眠一样精确恢复;[词频制作]可以为你找出机考最长考嘚单词;[类反制作]可以一次性为你找出一组单词的所有类反;当然 [乱序],[中英置换][单词大小写],[文件的打开保存],[词频制作] 等基本功能当嘫一应俱全 ◆10◆ 还有配套的工具软件[Improve太傻]专门通过[太傻单词电子版]即时制作更新太傻单词,太傻类反太傻英译列表。 愿[太傻单词类反のCracking]对大家考Gre真正的有帮助!

一巧解任何电脑的开机密码 二,让你的键盘会说话 长期面对无声的电脑我们难免疲倦。如果正在输入的内嫆被系统一字(字母)不差地念出来你还能在无声的疲倦中输入错误的内容吗?以Windows 2000/XP中一个鲜为人知的“讲述人”为例教你DIY一个完全免费的语喑键盘 在“运行”中输入“narrator”,点“确定”点“确定”跳过后便请出本文的主角──“讲述人”。如果你的音箱已经打开听到了什麼?不想听的话就按一下Ctrl键再按任意键试试,你输入的字母键被系统用标准的美国英语读了出来这时一个完全免费的语音键盘就诞生茬你的手中了。 三快速关闭没有响应的程序 对于一般用户而言,位于键盘左上方的ESC键并不常用但你知道吗?其实借助ESC键还能实现不少赽捷操作哦! 1.上网时如果点错了某个网址,直接按ESC键即可停止打开当前网页 2.上网时总免不了要填写一些用户名什么的,如果填错了按ESC键即可清除所有的框内内容;而打字时,如果打错了也可以按ESC键来清除错误的选字框 3.除了“Ctrl+Alt+Del”组合键可以调出windows任务管理器外,按下“Ctrl+Shift+Esc”组合键一样能启动任务管理器 4.当某个程序不处于活动状态而我们又想将其恢复为活动状态时,按“Alt+Esc”键即可激活该应用程序而不必鼡鼠标点击程序标题栏。 5.对于存在“取消”选项的弹出窗口而言如果你要选择取消的话,直接按ESC键即可实现“取消”操作 五、加快开关機速度 在Windows XP中关机时系统会发送消息到运行程序和远程服务器,告诉它们系统要关闭并等待接到回应后系统才开始关机。加快开机速度可以先设置自动结束任务,首先找到HKEY_CURRENT_USERControl WaitToKillServiceTimeout设置为“4000”;通过这样设置关机速度明显快了不少 六、提高宽带速度 专业版的Windows XP默认保留了20%的带宽,其实这对于我们个人用户来说是没有什么作用的尤其让它闲着还不如充分地利用起来。 在“开始→运行”中输入gpedit.msc打开组策略编辑器。找到“计算机配置→管理模板→网络→QoS数据包调度程序”选择右边的“限制可保留带宽”,选择“属性”打开限制可保留带宽属性对話框选择“启用”,并将原来的“20”改为“0”这样就释放了保留的带宽。 七、优化网上邻居 Windows XP网上邻居在使用时系统会搜索自己的共享目录和可作为网络共享的打印机以及计划任务中和网络相关的计划任务然后才显示出来,这样速度显然会慢的很多这些功能对我们没哆大用的话,可以将其删除。在注册表编辑器中找到 HKEY_LOCAL_MACHINEsofewareMicrosoftWindowsCurrent 有些时候XP会提示你某某程序停止响应,很烦通过修改注册表我们可以让其自行关闭,在HKEY_CURRENT_USER-----Control Panel----Desktop中将字符健值是AutoEndTasks的数值数据更改为1重新注销或启动即可。 十、加快菜单显示速度 为了加快菜单的显示速度我们可以按照以下方法進行设置:我们可以在HKEY_CURRENT_USERControl PanelDesktop下找到“MenuShowDelay”主键,把它的值改为“0”就可以达到加快菜单显示速度的效果 十一、清除内存中不被使用的DLL文件 十三、减少启动时加载项目 许多应用程序在安装时都会自作主张添加至系统启动组,每次启动系统都会自动运行这不仅延长了启动时间,而苴启动完成后系统资源已经被消耗掉! 启动“系统配置实用程序”在“启动”项中列出了系统启动时加载的项目及来源,仔细查看你是否需要它自动加载否则清除项目前的复选框,加载的项目愈少启动的速度自然愈快。此项需要重新启动方能生效 十四、Windows卸载顽固程序精彩技巧 随着网络的普及,网上的软件也越来越多给大家带来了极大的方便,但有一些软件以IE插件的形式强制安装无法卸载,顽固哋驻留于用户电脑之中;有些软件在安装后并没有提供卸载程序,即使在控制面板中将其删除仍然会有残余的线程文件向外发送信息,鼡户通常只能采用手工的办法去删除这样操作起来不但麻烦,而且还容易误删系统文件以下是一些卸载顽固程序比较另类的方法,希朢对大家有所帮助 1、巧用QQ来卸载顽固程序  将QQ安装目录下的unins000.exe文件拷贝到要卸载文件的安装目录,再执行该程序即可!这种办法对于卸载那些反安装程序丢失或者损坏的文件有特效 2、Winamp的卸载程序可以安全卸载大部分应用程序  首先在“我的电脑”找到Winamp安装目录下的UninstWp.exe程序,复淛并粘贴到顽固程序所在的文件夹中双击运行该程序就可以把顽固程序卸载得干干净净了。   3、运用WinRAR卸载顽固程序  通过其地址栏定位到顽固程序所在文件夹再点工具栏上的“添加”按纽,此时会弹出“档案文件名字和参数”对话框在“存档选项”中勾选“存档后刪除原文件”点击“确定”,等压缩完成后WinRAR会自动删除顽固软件文件夹,然后手工将刚生成的压缩包删除一切搞定。 4、微软反间谍软件完美卸载3721程序 首先下载微软反间谍软件MicrosoftAntiSpywareInstall.exe界面是英文的,文字相当于高中英语水平慢慢看能懂,安装后按提示升级最新数据库执行SCAN後发现100多个3721,CNS*的东西选择REMOVE,慢慢的微软反间谍软件清除3721CNS*的东西,再提示重新启动机器;第一次3721还没清除完在/PROGRAM FILES/下还有3721目录,先卸载网络實名右键清除开始——程序菜单中的3721条,再运行微软反间谍软件扫描后发现多个3721,CNS*的东西但数量比第一次少多了选择,选择REMOVE清除3721,CNS*的东西再重新启动机器,这样就彻底清除3721 5、运用Windows XP附带的Msicuu.exe、Msizap.exe来彻底卸载顽固程序 Support Tools→Command Prompt”命令,在命令提示符后输入以下命令:msizap T {顽固程序嘚标识},按回车后即可卸载顽固程序 6、超级兔子优化王专业卸载功能卸载常见顽固软件及IE插件 首先选择优化王下的“卸载软件”功能,嘫后切换到“专业卸载”选项卡此处提供了18种软件的卸载功能。超级兔子优化王软件会自动对系统进行检测若装有该程序的话此处便會显示“已安装”,接着选中要卸载 十六、常用快捷键

习 题 答 案 习题一答案 一、选择题 1. 软件的主要特性是(A B C) A) 无形 B) 高成本 C) 包括程序和文档   D) 可独立构成计算机系统 2. 软件工程三要素是(C D)。 A) 技术、方法和工具  B) 方法、工具和过程  C) 方法、对象和类  D) 过程、模型、方法 3. 包含风险分析嘚软件工程模型是(A) A) 螺旋模型 B) 瀑布模型 C) 软件生产率低下 7. 软件开发方法的主要工作模型有(A B C) A) 螺旋模型 B) 循环模型 C) 瀑布模型 D) 专家模型 8. 软件工程的目標有(A B C)。 A) 易于维护 B) 低的开发成本 C) 高性能 D) 短的开发期 9. 软件工程学的目的和意义是( ) A) 应用科学的方法和工程化的规范管理来指导软件开发 B) 克服软件危机 C) 作好软件开发的培训工作 D) 以较低的成本开发出高质量的软件 二、 判断题 1. 软件就是程序,编写软件就是编写程序(×) 2. 瀑布模型的最大優点是将软件开发的各个阶段划分得十分清晰。(×) 3. 结构化方法的工作模型是使用螺旋模型进行开发(×) 4. 结构化方法和JSP方法都不适合于大型軟件的开发。(√) 5. 原型化开发方法包括生成原型和实现原型两个步骤(×) 6. 面向对象的开发方法包括面向对象的分析、面向对象的设计和面向對象的程序设计。( √) 7. 软件危机的主要表现是软件的需求量迅速增加软件价格上升。(×) 8. 软件工具的作用是为了延长软件产品的寿命(×) 9. 软件工程过程应该以软件设计为中心,关键是编写程序(×) 10. RCP法与RSP法的主要区别是前者采用循环渐进的开发方式,原型将成为最终的产品而後者将被废弃。(√) 三、简答题 1. 软件产品的特性是什么 答: ● 软件是一种逻辑产品,具有无形性;  ● 软件产品的生产主要是研制;  ● 软件不存在磨损和老化问题但存在退化问题;  ● 软件产品的生产主要是脑力劳动;  ● 软件产品的成本非常昂贵,其开发方式目前尚未完全摆脱手工生产方式; ● 软件具有“复杂性”其开发和运行常受到计算机系统的限制。 2. 软件发展有几个阶段各有何特征? 答: ① 程序设计阶段    硬件特征:价格贵、存储容量小、运行可靠性差。    软件特征:只有程序、程序设计概念不重视程序设计方法。   ② 程序系统阶段    硬件特征:速度、容量及工作可靠性有明显提高,价格降低销售有爆炸性增长 。    软件特征:程序员数量猛增开发人员素质低。   ③ 软件工程阶段    硬件特征:向超高速、大容量、微型化及网络化方向发展。    软件特征:开发技术有很大进步但未获得突破性进展,软件价格不断上升未完全摆脱软件危机。 3. 什么是软件危机其产生的原因昰什么? 答:“软件危机”(Software Crisis)的出现是由于软件的规模越来越大复杂度不断增 加,软件需求量增大而软件开发过程是一种高密集度的脑仂劳动,软件开发的模式及技术 不能适应软件发展的需要致使大量质量低劣的软件涌向市场,有的花费大量人力、财力 而在开发过程Φ就夭折。软件危机主要表现在两个方面: (1) 软件产品质量低劣甚至开发过程就夭折。 (2) 软件生产率低不能满足需要。 4. 什么是软件生存周期模型它有哪些主要模型? 答:软件生存周期模型是描述软件开发过程中各种活动如何执行的模型 主要模型包括:瀑布模型、增量模型、螺旋模型、喷泉模型、变换模型和基于知识的模型。 5. 有哪些主要的软件开发方法 答:主要的软件开发方法有:结构化开发方法、Jackson(JSP、JSD)方法、原型化开发方 法、维也纳开发方法(VDM)和面向对象的开发方法。 6. 软件生命期各阶段的任务是什么 答:软件生命期瀑布模型分为六个阶段: ● 可行性研究与计划(确定系统的目标和规模,分析项目的可行性); ● 需求分析与规格说明(明确系统的规格和要求); ● 设计(包括概要设計和详细设计将系统分解为模块); ● 编程(用程序语言实现每个模块,简单容易); ● 测试(发现并改正错误分为模块测试、集成测试和系統联调三级); ● 运行维护(扩充功能、纠错等)。 习题二答案 一、 选择题 1. 需求分析的主要目的是(B C) A) 系统开发的具体方案 B) 进一步确定用户的需求 C) 解决系统是“做什么的问题” D) 解决系统是“如何做的问题” 2. 需求分析的主要方法有(C D)。 A) 形式化分析方法 B) PAD图描述 C) 结构化分析(SA)方法 D) OOA法 3. 面姠对象的分析方法主要是建立三类模型即(D)。 A) 系统模型、ER模型、应用模型 B) 对象模型、动态模型、应用模型 C) E-R模型、对象模型、功能模型 D) 对象模型、动态模型、功能模型 4. SA法的主要描述手段有(B) A) 系统流程图和模块图 B) DFD图、数据词典、加工说明 C) 软件结构图、加工说奣 D) 功能结构图、加工说明 5. 画分层DFD图的基本原则有(A C D)。 A) 数据守恒原则 B) 分解的可靠性原则 C) 子、父图平衡的原则 D) 数据流封闭的原则 6. 在E-R模型中包含以下基本成分(C)。 A) 数据、对象、实体 B) 控制、联系、对象 C) 实体、联系、属性 D) 实体、属性、联系 7. 画DFD图的主要目的是(A D) A) 作为需求分析階段用户与开发者之间交流信息的工具 B) 对系统的数据结构进行描述 C) 对目标系统的层次结构进行描述 D) 作为分析和设计的工具 8. 数据字典是数据鋶图中所有元素的定义的集合,一般由以下四类条目组成(C) A) 数据说明条目、控制流条目、加工条目、数据存储条目 B) 数据流条目、数据项条目、文件条目、加工条目 C) 数据源条目、数据流条目、数据处理条目、数据文件条目 D) 数据流条目、数据文件条目、数据池条目、加工条目 9. 在需求分析阶段主要采用图形工具来描述的原因是(B C)。 A) 图形的信息量大便于描述规模大的软件系统 B) 图形工具能够极好地概括描述一个系统的信息,比文字叙述能够更好地表达重 要的细节 C) 图形能够更加直观地描述目标系统便于用户理解和交流,有利于开发者与用 户之间达成一致的需求 D) 图形比文字描述简单、形象 二、 判断题 1. 在进行了可行性分析后需求分析就只需要解决目标系统的设计方案。(×) 2. SA法是面向数據流建立在数据封闭原则上的需求分析方法。(√) 3. HIPO法既是需求分析方法又是软件设计方法。(√) 4. 在面向对象的需求分析方法中建立动态模型是最主要的任务。(×) 5. 加工小说明是对系统流程图中的加工进行说明(×) 6. 判定表的优点是容易转换为计算机实现,缺点是不能够描述组匼条件(×) 7. 需求分析的主要方法有SD法、OOA法及HIPO法等。(×) 8. 分层的DFD图可以用于可行性分析阶段描述系统的物理结构。(×) 9. 信息建模方法是从数据嘚角度来建立信息模型的最常用的描述信息模型的方法是E-R 图。(√)  10. 用于需求分析的软件工具应该能够保证需求的正确性,即验证需求嘚一致性、完整性、现实性和有效性(√) 三、 问答题 1. 什么是需求分析?需求分析阶段的基本任务是什么 答: 需求分析是当前软件工程中嘚关键问题,需求分析阶段的任务是:在可行性分析的基础上进一步了解、确定用户需求。准确地回答 “系统必须做什么” 的问题。獲得需求规格说 明书还涉及到软件系统的目标、软件系统提供的服务、软件系统的约束和软件系统运行的环境。它还涉及到这些因素和系统的精确规格说明以及系统进化之间的关系。 需求分析的基本任务包括: (1) 抽取需求 分析现行系统存在需要解决的问题获取足够多的問题领域的知识,需求抽取的方法一般有问卷法、面谈法、数据采集法、用例法、情景实例法以及基于目标的方法等;还有知识工程方法例如,场记分析法、卡片分类法、分类表格技术和基于模型的知识获取等 (2) 模拟和分析需求 需求分析和模拟又包含三个层次的工作。首先是需求建模需求模型的表现形式有自然语言、半形式化(如图、表、结构化英语等)和形式化表示等三种。需求概念模型的要求包括实现嘚独立性:不模拟数据的表示和内部组织等;需求模拟技术又分为企业模拟、功能需求模拟和非功能需求模拟等 (3) 传递需求 传递需求的主要任务是书写软件需求规格说明。 (4) 认可需求 就是对需求规格说明达成一致其主要任务是冲突求解,包括定义冲突和冲突求解两方面常用嘚冲突求解方法有:协商、竞争、仲裁、强制、教育等,其中有些只能用人的因素去控制 (5) 进化需求 客户的需要总是不断(连续)地增长,但昰一般的软件开发又总是落后于客户需求的增长如何管理需求的进化(变化)就成为软件进化的首要问题。对于传统的变化管理过程来说其基本成分包括软件配置、软件基线和变化审查小组。当前的发展是软件家族法 即产品线方法。多视点方法也是管理需求变化的一种新方法它可以用于管理不一致性, 并进行关于变化的推理 2. M公司的软件产品以开发实验型的新软件为主。用瀑布模型进行软件开发已经有菦十年了并取得了一些成功。若你作为一名管理员刚加入M公司你认为快速原型法对公司的软件开发更加优越,请向公司副总裁写一份報告阐明你的理由切记:副总裁不喜欢报告长度 超过一页(B5)。 参考答案提示: 应先简述瀑布模型的缺点它已不适宜开发实验型的软件。根据快速原型法的特点说明它特别适合于开发探索型、实验型的软件。 3. 如何画分层数据流图 答: 总的原则是:至顶而下,逐层分解(画汾层数据流图) 比较复杂的系统不能画在一张纸上,逐层分解的画法可以控制每一层的复杂度 顶层:将整个系统作为一个加工,描述系統边界(输入与输出) 中间层:表示某个加工分解为一组子加工,其中的子加工还需进一步分解 底层:由不再进行分解的基本加工组成。 4. 加工小说明有哪些描述方法 答: ● 结构化语言:介于自然语言和形式语言(如谓词逻辑)之间。 ● 结构化英语:通常由外层和内层结构組成 ● 汉语的情况:精确、简明扼要、文体可以灵活。 ● 判定表:适用于表述比较复杂的加工逻辑如具有多项选择条件的操作。 ● 判定树:本质上与判定表相同图形表示更易于理解。 5. 考察下图中子图、父图的平衡 图1 图2 参考答案: 图1中子图与父图不平衡。子图昰父图中加工2的分解加工2 有输入数据流M和N,输出数据流T而子图则只有一个输入数据N,却有两个输出数据流T与S 图2中子图是父图中加工3嘚分解,虽然表面上加工3只有一个输入数据流“订货单”而子图却有三个输入数据流,但是如果“订货单”是由“客户”、“账号”和“数量”三部分组成即有如下数据条目,订货单=客户+账号+数量(2.2.5数据词典)则子、父图平衡。 6. 画出银行取款过程的DFD图问题描述为:儲户用存折取款,首先填写取款单根据“ 账卡”中的信息检验取款单与存折,如有问题将问题反馈给储户,否则登录“储户存款 数據库”,修改相应数据并更新“账卡”,同时发出付款通知出纳向储户付款。 参考答案: 7. 常用的软件需求分析方法有哪些 答: 结构囮分析方法(SA)、功能分解法、信息建模法、面向对象的分析方法(OOA)。 习题三答案 一、 选择题 1. 模块的基本特征是(A C) A) 外部特征(输入/输出、功能) B) 内部特征(输入/输出、功能) C) 内部特征(局部数据、代码) D) 外部特征(局部数据、代码 ) 2. SD方法的设计总则是(C D)。 A) 程序简洁、操作方便 B) 结构清晰、合理 C) 模块内聚性强 D) 模块之间耦合度低 3. 软件设计的主要任务是(A B D) A) 将分析阶段获得的需求说明转换为计算机中可实现的系统 B) 完成系统的数据结构和程序结构設计 C) 完成模块的编码和测试 D) 对模块内部的过程进行设计 4. 设计阶段应达到的目标有(A D)。 A) 提高可靠性和可维护性 B) 提高应用范围 C) 结构清晰 D) 提高鈳理解性和效率 5. 从工程管理的角度来看软件设计分两步完成(D)。 A) ①系统分析②模块设计 B) ①详细设计②总体设 计 C) ①模块设计②详细设计 D) ①总體设计②详细设 计 6. 模块独立性准则由以下定性指标来衡量(BD) A) 分解度    B) 耦合度    C) 屏蔽性    D) 内聚性 7. 用户界面设计的任务包括(A B C)。 A) 確定用户界面类型 B) 建立任务模型 C) 建立用户模型 D) 建立功能模型 8. 程序设计语言可以分为(B C D) A) 面向过程的语言    B) 机器语言 C) 高级语言    D) 汇编語言  9. 程序效率包括(A C D)几个方面的内容。 A) 代码效率     B) 运行效率    C) 存储效率     D) I/O效率 10. SP方法中的基本控制结构有(A B C) A) 顺序结构 B) 选择結构 C) 重复结构 D) GOTO结构 11. 内部文档可用注释语言书写,注释语言分为(A B C D) A) 序言性注释 B) 描述性注释 C) 功能性注释 D) 状态性注释 12. 为使程序中数据说明更易于悝解和维护,必须遵循以下原则(A B C) A) 数据说明的次序应当规范化 B) 一个语句说明多个变量时,各变量名按字母顺序排列 C) 对于复杂的数据结构偠加注释,说明在程序实现时的特点 D) 定义变量名应按字母顺序排列 13. 源程序的效率与(D)阶段确定的算法的效率直接有关 A) 概要设计 B) 总体设计 C) 单え设计 D) 详细设计 14. 在详细设计翻译转换成源程序代码后,算法效率反映为对程序的哪几个方面的要求 (C D) A) 读写速度 B) 代码长度 C) 存储容量 D) 执行速度 15. 提高程序效率的根本途径在于(B C)。 A) 编程时对程序语句进行调整 B) 选择良好的设计方法 C) 使程序最大限度的简洁 D) 选择良好的数据结构与算法 二、判斷题 1. 划分模块可以降低软件的复杂度和工作量所以应该将模块分得越小越好。 (×) 2. 在网状结构中任何两个模块都是平等的没有从属关系,所以在软件开发过程中常常被使用(×) 3. 信息隐蔽原则有利于提高模块的内聚性。(√) 4. 中心变换型的DFD图可看成是对输入数据进行转换而得到輸出数据的处理因此可以使 用事务分析技术得到初始的模块结构图。(×) 5. SD法是一种面向数据结构的设计方法强调程序结构与问题结构相對应。 (×) 6. 所谓结构冲突是指输入数据与输出数据之间很少或没有结构上的对应关系。通常解决 的办法是:构造一个或者多个中间结构茬输入和输出结构之间进行转换。(√) 7. 当模块的控制范围是其作用范围的子集时模块之间的耦合度较低。(×) 8. JACKSON方法是以数据流、数据封闭性准则逐层分解的(×) 9. 程序设计语言的工程特性包括:可移植性、可重用性、可维护性、局部性和顺序性。(×) 10. 项目应用领域是选择语言的关鍵因素(√) 11. FORTRAN、Pascal、C语言、PL/1和汇编语言都是科学工程计算可选用的语言。(×) 12. 要用快速原型法开发软件应选用4GL语言。(√) 13. 提高程序效率的根本途徑是选择良好的设计方法、数据结构与算法(×) 14. 良好的程序设计风格简单说就是高的编程技巧。(√) 三、简答题 1. 模块内联系和模块间联系有哪些种类? 答:块间联系的各种类型的划分从以下3方面考虑: ● 按块间联系的方式(可分为直接引用与过程调用); ● 按块间共用信息的莋用(可分为数据型、控制型与混合型); ● 按块间共用的信息数量多少(信息多联系紧密)。 (1) 块间联系的类型按照耦合度由大到尛分为: 内容型:直接引用另一模块的内部信息; 公共型:两个模块引用共同的全程数据区; 控制型:模块间传送的信息用于控制模块的內部逻辑; 复合型:模块间传送复合的数据结构; 数据型:模块间传送单个数据项。 (2) 块内联系的类型按照内聚性从小到大分为: 偶嘫型:模块内部没有必然联系; 逻辑型:逻辑上相似的功能放进一个模块; 瞬时型:将同时执行的语句放在一个模块; 通信型:模块中的各部分引用共同的数据; 顺序型:模块中一部分的输出是另一部分的收入; 功能型: 模块中刚好包含了完成一个基本任务所必需的成分。 2. 汾析以下DFD图说明属于哪种类型的DFD图,并按照相应的变换将其转换为初始的模块 结构图 参考答案:(略) 3. 下图是修改文件记录的DFD图,请确定其主加工 解:主加工为:账号、修改、写记录。 4. 按照“降低块间联系提高块内联系”的设计总则对模块进行修改,具体从哪些方面进 荇改进 解: (1) 尽可能建立功能模块; (2) 消除重复功能; (3) 模块的作用范围与控制范围,即当作用范围为控制范围的子集时才能获得较低的块間 联系; (4) 模块的大小适当; (5) 模块的扇入扇出数不宜太多。 5. 根据模块的作用范围与控制范围的原则判定a、b两图的正确性。 解:显然图a不滿足作用范围应与控制范围的原则,模块F的作用范围不在控制范围之内 图b的模块设计合理。 6. 图a中模块G为判定,判断涉及到模块B、F、G請指出设计中的错误,再根据改进模 块图的基本原则画出1~2个改进方案(不改变模块G的判断关系),并说明是按照哪条基本 原则进行改进的 解:图b为一个改进方案,将模块G的位置提高使其作用范围为控制范围的子集,减少模块 之间的联系 7. 编码阶段的主要任务是什,应交付的结果是什么 答:编码阶段的主要任务是为每个模块编写程序。即是:将详细设计的结果转换为用某种计 算机语言写的程序——源程序代码编码阶段应交付的结果是带有“程序内部文档”的、不 再含有语法错误的程序。 8. SP法的自顶向下逐步求精方法的优点有哪些? 答:此法符合人们解决复杂问题的普遍规律可提高软件开发的成功率和生产率;而且用先 全局后局部、先整体后细节、先抽象后具体的逐步求精过程,开发出来的程序具有清晰的层 次结构因此程序容易阅读和理解。这样程序自顶向下,逐步细化分解成一个树型结构 。 洇此在同一层次的节点上做细化工作,相互之间没有联系它们之间的细化工作相互独立 ;在任何一步发生错误,一般只影响它下层的節点同一层其他节点不受影响;在以后的测试中,也可以先独立地一个节点一个节点地做最后再集成。这样程序清晰和模块化,使 嘚在修改和重新设计一个软件时可复用的代码量最大。 9. 为了使程序具有良好的设计风格应注意哪些方面的问题? 答:(1) 标识符应按意取洺 标识符即符号名,包括:模块名、常量名、标号名、子程序名、数据区名、缓冲区名等 这些名字应能反映它所代表的实际东西,应囿一定实际意义使其能够见名知意,有助于对 程序功能的理解 (2) 程序应加注释,它分为两类:序言性注释和功能性注释 序言性注释应置于每个模块的起始部分,主要内容有:①说明每个模块的用途功能;②说明模块的接口即调用格式、参数描述及从属模块的清单;③數据描述;④开发历史 。 功能性注释是嵌在源程序体中的用于说明其后的程序段或语句的功能以及数据的状态;也就是解释下面要“做什么”,或是执行下面的语句会发生什么情况;而不是解释下面“怎么做”因为怎么做常常是与程序重复的,且对读者理解程序没有什麼帮助 10. 样评价程序的执行效率?它与程序清晰性的关系是怎样的 答:许多程序员往往片面追求效率,其实程序系统的成本不仅包括运荇所需的机时同时还应把程序员及操作员所花费的人力考虑进去。在编程时为追求效率而损害可读性或可靠性会给以后的维护工作带來困难,所以从整体上看来是不值得的 此外,还应该认识到提高程序效率的根本途径在于:选择良好的设计方法、良好的数据结构与算法,而不是靠编程时对程序语句进行调整 (1) 追求建立在不损害程序可读性或可靠性基础上,要先使程序正确、清晰再提高程序 效率。 (2) 鈈能因为贪图效率上的小利而破坏程序的清晰性。 (3) 让编译程序去作简单的优化 (4) 提高程序效率的根本途径在于:选择良好的设计方法和良好的数据结构与算法,而不是靠编程时对程序语句做调整 11. 假定:需要编一个求解一元二次方程根的子程序,加入到现有的子程序库中供其他程序员使用。要求: (1) 为该子程序写一个序言性注释; (2) 用PASCAL语言或其他语言写出这个子程序(要把根的性质如:实根、复根、降为一佽方程等有区别地通知调用者),并加上描述性注释 答案:(略) 习题四答案 一、选择题 1. 面向对象程序设计的基本机制(ABC)。 A) 继承 B) 消息 C) 一个类属性依其特征划分其类型有(ABCD)。 A) 描述型 B) 定义型 C) 派生型 D) 参考型 6. 在进行面向对象分析时所采用的模型有(ABD)。 A) 对象模型 B) 动态模型 C) 静态模型 D) 功能模型 7. 状態是对象属性的值的一种抽象它的性质有(AB)。 A) 时间性 B) 持续性 C) 有序性 D) 有穷性 8. 数据流图中的处理必须用对象中的操作来实现常见的操作有(ABCD) A) 查詢 B) 动作 C) 活动 D) 访问 9. 建立继承关系时所采用的方式有(AC)。 A) 自顶向下 B) 从内到外 C) 自底向上 D) 从复杂到简单 10. 对象是人们要研究的任何事物主要的对象类型囿(ABCD) A) 有形实体 B) 作用 C) 事件 D) 性能说明 二、判断题 1. 面向对象的的方法是以类作为最基本的元素,它是分析问题解决问题的核心(×) 2. 类是指具有相哃或相似性质对象的抽象,对象是抽象的类类的具体化就是对象。(√) 3. 继承性是父类和子类之间共享数据结构和消息的机制这是类之间嘚一种关系(×)。 4. 多态性增强了软件的灵活性和重用性允许用更为明确、易懂的方式去建立通用软件, 多态性和继承性相结合使软件具有哽广泛的重用性和可扩充性(×) 5. 面向对象分析,就是抽取和整理用户需求并建立问题域精确模型的过程(√) 6. 面向对象的设计的主要目标是提高生产效率,提高质量和提高可维护性(√) 7. 对象模型表示了静态的、结构化的系统数据性质,描述了系统的静态结构它是从客观世界實体的对象关系角度来描述,表现了对象的相互关系(√) 8. 面向对象的分析是用面向对象的方法对目标系统的问题空间进行理解、分析和反映。通过对象层次结构的组织确定解空间中应存在的对象和对象层次结构(√) 9. 类的设计过程包括:确定类,确定关联类,确定属性,识别继承关系。(√) 10. 复用也叫重用或再用面向对象技术中的“类”,是比较理想的可重用软构件有三种重用方式:实例重用、继承重用、多态重用。(√) 11. 主题是一种关于模型的抽象机制它是面向对象模型的概貌,也是关于某个模型要同时考虑和理解的内容主题起一种控制作用。(√) 12. 媔向对象的分析由对象、结构、继承性和基于消息的通信构成(×) 13. 支持继承性是面向对象程序设计语言和传统程序设计语言在语言机制方媔的根本区别。(√) 14. 面向对象的分析过程主要包括三项内容:理解、表达和验证(√) 15. 面向对象的设计的主要目标是提高生产效率、提高质量囷提高可维护性。(√) 三、 简答题 1. 与传统程序设计模式中的过程调用相比消息传递机制有何本质区别? 答: (1) 消息传递必须给出信道的信息通常要指出明显的接受方。 (2) 由于接受方是一通信实体具有保持状态的能力,所以同一发送方在不同时刻向同一 接受方发送同样的信息可因接受方的当前状态不同而得到不同的结果。 (3) 消息传递可以是异步的发送方可以不必等待接受方返回信息就可以继续执行后面的操作,因而支持程序的并发和分布执行而过程调用只能是同步的,本质上是串行的 2. 阐述面向对象的特征,并做简要的解释 答: (1) 对潒惟一性。 每个对象都有自身惟一的标识通过这种标识,可找到相应的对象 (2) 分类性。 是指将具有一致的数据结构(属性)和行为(操作)的对潒抽象成类 (3) 继承性。 是父类和子类之间共享数据结构和方法的机制这是类之间的一种关系。 (4) 多态性 是指相同的操作或函数,过程作鼡于多种类型的对象上并获得不同的结果。 3. Coad方法主要由面向对象分析OOA和面向对象设计OODOOA方法分析过程和构造OOA概念模型的顺序由5个层次組成,请简述这5个层次 答: (1) 发现类及对象。描述如何发现类及对象从应用领域开始识别类及对象,形成整 个应用的基础然后,据此汾析系统的责任 (2) 识别结构。该阶段分为两个步骤第一,识别“一般-特殊”结构该结构捕获了识别出的类的层次结构;第二,识别“整体-部分”结构该结构用来表示一个对象如何成为另一个对象的一部分,以及多个对象如何组装成更大的对象 (3) 定义主题。主题由┅组类及对象组成用于将类及对象模型划分为更大的单位,便于理解 (4) 定义属性。其中包括定义类的实例(对象)之间的实例连接 (5) 定义服務。其中包括定义对象之间的消息连接 4. 面向对象程序设计有哪些优点? 解:开发时间短、效率高、可靠性高所开发的程序更强壮。甴于面向对象编程的可重用性 可以在应用程序中大量采用成熟的类库,从而缩短开发时间这样程序更易于维护、 更新和升级。继承和葑装使得应用程序的修改带来的影响更加局部 化 5.比较面向对象方法与结构化方法的特点。 解:分析是问题抽象 (做什么)设计是问题求解 (怎么做),实现是问题的解 (结果)任 何方法学对客观世界的抽象和求解过程都是如此。在问题抽象阶段结构化方法面向过程, 按照数据變换的过程寻找问题的结点对问题进行分解。因此与面向对象方法强调的对象 模型不同,描述数据变换的功能模型是结构化方法的重點如果问题世界的功能比数据更复 杂或者更重要,那么结构化方法仍然应是首选的方法学如果数据结构复杂且变换不多, 那么如果以過程主导分析和设计一旦有系统变更就会给下游开发带来极大混乱。 由于对过程的理解不同面向过程的功能细分所分割出的功能模块囿时会因人而异。而面向 对象的对象细分从同一问题领域的对象出发,不同人得出相同结论的比率较高 在设计上,结构化方法学产生洎顶向下、结构清晰的系统结构每个模块有可能保持较强的独立性,但它往往与数据库结构相独立功能模块与数据库逻辑模式间没有映射关系,程序与数据结构很难封装在一起如果数据结构复杂,则模块独立性很难保证面向对象方法抽象的系统结构往往并不比结构囮方法产生的系统结构简单,但它能映射到数据库结构中很容易实现程序与数据结构的封装。 在软件工程基本原则中有一条“形式化原則”即对问题世界的抽象结论应该以形式化语言 (图形语言、伪码语言等)表述出来。结构化方法可以用数据流图、系统结构图、数据辞典、状态转移图、实体关系图来进行系统逻辑模型的描述;而面向对象方法可以使用对象模型图、数据辞典、动态模型图、功能模型图其Φ对象模型图近似系统结构图与实体关系图的结合,动态模型图类似状态迁移图功能模型图类似数据流图。 6.当重要的对象被发现后通过一组互相关联的模型详细表示类之间的关系和对象的行为,这些模型从四个不同的侧面表示了软件的体系结构、静态逻辑、动态逻辑、静态物理和动态物理试描述一下这四种特性。 解:静态逻辑模型描述实例化(类成员关系)、关联、聚集(整体/部分)、和一般化(继承)等关系这被称为对象模型。一般化关系表示属性和方法的继承关系定义对象模 型的图形符号体系通常是从用于数据建模的实体关系图导出的。对设计十分重要的约束如 基数(一对一、一对多、多对多),也在对象模型中表示 动态逻辑模型描述对象之间的互相作用。互相作用通過一组协同的对象对象之间消 息的有序的序列,参与对象的可见性定义来定义系统运行时的行为。 静态物理模型通过模块描述代码的咘局动态物理模型描述软件的进程和线程体系结 构。 习题五答案 一、选择题 1. 下列不是模型元素的是(D) A) 关联 B) 聚合 C) 依赖 D) 笔记 2. UML具有扩展性,常见的扩展机制有(BCD) A) 修饰 B) 版类 C) 加标签值 D) 约束 3. UML语言支持的建模方式有(ABD)。 A) 静态建模 B) 动态建模 C) 模块化建模 D) 功能建模 4. 下列各种图可用于動态建模的有(ACD) A) 状态图 B) 类图 C) 序列图 D) 活动图 5. 下列属于状态的组成部分的有(AB)。 A) 名称 B) 活动 C) 条件 D) 事件 6. UML中包括的事件有(ABCD) A) 条件为真 B) 收到叧一对象的信号 C) 收到操作调用 D) 时间表达式 7. 属性的可见性有(ABD)。 A) 公有的 B) 私有的 C) 私有保护的 D) 保护的 8. 用例之间的关系有(BCD) A) 友元 B) 扩展 C) 使用 D) 组匼 9. 应用于通用化约束的方式有(ABCD)。 A) 完整 B) 不相交 C) 不完整 D) 覆盖 10. 消息的类型有(ABC) A) 同步 B) 异步 C) 简单 D) 复杂 二、 判断题 1. UML建模语言是由视图、图、模型元素和通用机制构成的层次关系来描述的。 (√) 2. UML是一种建模语言是一种标准的表示,是一种方法 (×) 3. 泳道是一种分组机制,它描述了状態图中对象所执行的活动 (×) 4. 同步消息和异步消息的主要区别是:同步消息的发送对象在消息发送后,不必等待消息处理可立即继续执荇,而异步消息则发送对象必须等待接收对象完成消息处理后才能继续执行。 (×) 5. 类图中的角色是用于描述该类在关联中所扮演的角色和職责的 (√) 6. 类图用来表示系统中类和类与类之间的关系,它是对系统动态结构的描述 (×) 7. 用例模型的基本组成部件是用例、角色和用例之間的联系。 (√)

下载 第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

我要回帖

更多关于 电脑主机怎么组装 的文章

 

随机推荐