资源预览内容
第1页 / 共49页
第2页 / 共49页
第3页 / 共49页
第4页 / 共49页
第5页 / 共49页
第6页 / 共49页
第7页 / 共49页
第8页 / 共49页
第9页 / 共49页
第10页 / 共49页
亲,该文档总共49页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第15章 怎样写好程序唐大仕dstang2000263.nethttp:/www.dstang.com内容提要n写好程序的一些经验n编程规范n性能与安全n其他几个技术问题15.1 怎样写好程序经验谈写好“单词”n变量n大小写:变量小写,方法名、类名大写n长度:单个字母的变量只能在三五行内结束n含义:用特定含义,控件用匈牙利命名法n不用temp,it ,do等没有意义的词n常量n数字常量用const或enum或配置n不要从天上掉下来一个数n字符串常量写好“语句”n简单语句n写好赋值语句n使用中间变量n使用括号n分支语句n循环语句n变量局部化写好“函数”n写简单程序n使用卫语句降低层次n语句不要太多n将一段语句提出来,形成新的函数n层次不要太多n将内部语句提出来,形成新的函数n改变算法n如果太复杂了,说明思路还不够清晰写好“对象”n对象的功能是独立的n高内聚n不要太多的成员n处理好对象之间的关系n保存:构造时传入n关联:使用方法n通信:使用事件“定律”n写简单程序n代码永远不要写两遍n推论:永远不要copy代码重构 Refactorn重构改变既有代码的设计15.2 编程规范代码规范n文件结构及名字空间n代码格式n缩进、空格、空行、 、换行n注释nXML注释n命名规范n名字空间、类名、方法、属性 Pascal Casingn接口名用I开头n局部变量、函数参数 Camel Casingn控件可以考虑用“匈牙利命名法”n参见SharpDevelopCodingStyle03.pdfn参见VS_NET 2003 控件命名规范.htmXML注释标标 记记含含 义义标记为代码将多行标记为代码示例异常包含另一个文件列表段落文本参数参数引用访问权限注解返回值参见可参见总述属性值加入XML注释:在VS.NET中输入/NDocnhttp:/ndoc.sourceforge.net/nNDoc文档生成工具n另外:n在csc命令中用/doc:选项n在VS.NET中,在项目的属性中n选择生成文档n使用Lutz Roeder的Docutmentor编程规范nDesign Guidelines for Class Library Developersnhttp:/msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconnetframeworkdesignguidelines.asp nRelationship to the Common Type System and the Common Language Specification nNaming Guidelines nClass Member Usage Guidelines nType Usage Guidelines nGuidelines for Exposing Functionality to COM nError Raising and Handling Guidelines nArray Usage Guidelines nOperator Overloading Usage Guidelines nGuidelines for Implementing Equals and the Equality Operator (=) nGuidelines for Casting Types nCommon Design Patterns nSecurity in Class Libraries nThreading Design Guidelines nGuidelines for Asynchronous Programming FxCopnhttp:/www.gotdotnet.com/team/fxcop/数据库设计规范n参见数据库开发规范.htm界面规范n参见网站软件开发规范.htm开发文档规范n需求分析n概要设计n详细设计n参见国家软件开发标准.rar15.3 性能和安全性能是一项功能n设计时就考虑性能n不要在事后再加入性能!n在项目开发的整个过程中反复测试n两种量化Web性能的方法:n1) 机器吞吐率 (requests/sec)n2) 响应时间 (time to first/last bytes)Perfmonn性能计数n开始|运行|Perfmonn点“+”,添加计数器关键的性能计数器n处理器, CPU % 使用率n低数值 = 受阻或者锁竞争nASP.NET, 入列请求数n线性增长意味着服务器已满负荷nASP.NET 应用, 每秒请求数n动态吞吐量 (应当一致)nASP.NET 应用, 总错误数n指示功能错误 (应当是0)nASP.NET 应用, 工作进程重启n指示严重功能错误NProfnhttp:/www.genghisgroup.com/n可以测试每个方法的调用时间NPerfNTimen一个测试框架,通过编程来使用n参见 http:/www.codeproject.com/gen/design/nperf.aspnhttp:/www.dotnetwiki.org/ nhttp:/www.codeproject.com/dotnet/NTime.asp 高负载测试高负载测试n高负载测试是建立高负载测试是建立scalable web 站点的防御站点的防御性手段性手段n高负载运行可以说明应用的高负载运行可以说明应用的scalability n可用于确定操作的规模可用于确定操作的规模, 何时增加新硬件何时增加新硬件,等等等等n高负载测试不应是构建一个高负载测试不应是构建一个web应用的最后应用的最后一步一步. 它应当贯穿于开发周期中它应当贯穿于开发周期中 n缩小高负载运行缩小高负载运行的范围以获得更准确的范围以获得更准确, 可行动可行动的结果的结果最佳实践n遵循好的设计实践:n逻辑/物理设计n语言选择n基本类库nCOM 交互n数据访问n输出缓存代码性能n.NET 通用语言运行环境 (CLR)n运行性能大幅提高n运行时JIT 编译到本机代码n优化的垃圾回收器n简单问题: 代码分离还是混合?n没有性能差别n简单问题: VB .NET 或者 C#?n没有可觉察的差别, 然而正确使用基本类nStringBuilder与Stringn不要在循环中使用 s+=n参见 StringStringBuilder.csn使用字符代替字符串,如str.IndexOf()n使用集合类nHashtable实现查找n用Array.Sort进行排序n正确使用线程n线程、线程池、Timer性能提高的技巧n避免不必要的执行操作nPage_Load 和 IsPostBackn void Page_Load(Object sender, EventArgs e) n / .set up a connection and command here.n if (!Page.IsPostBack) n String query = select * from Authors where FirstName like %JUSTIN%;n myCommand.Fill(ds, Authors);n myDataGrid.DataBind();n n n void Button_Click(Object sender, EventArgs e) n String query = select * from Authors where FirstName like %BRAD%;n myCommand.Fill(ds, Authors);n myDataGrid.DataBind();n 性能提高的技巧n不要用Exception控制程序流程ntry nresult = 100 / num;nn catch (Exception e) nresult = 0;n n n if (num != 0) nresult = 100 / num;n elsen result = 0; 数据访问n编写良好的代码对性能至关重要 n不要受阻在数据库服务器上n简单事项, 比如关闭数据库连接n数据代码检查表:n分析并优化数据表索引n利用ADO.NET的输出参数n推荐: 使用存储过程n可以消除数据库的往返访问n通过使用数据库事务而避免分布式事务的耗费.NET 数据访问n.NET中多种数据访问方法nSQL vs. OLEDB vs. ODBC数据提供者nDataReaders vs. DataSetn数据提供者选择:n使用SQL服务器时使用Data.SqlClient中的类型n推荐:nDataReader: 用于只进的只读访问nDataSet: 用于缓存或者Web服务使用缓存 n什么是缓存?n缓存的三种方式:n页输出缓存n页片断缓存n数据缓存 应用的安全考虑 n修改数据库的文件名和扩展名,尽量让别人猜不出来。 n因为授权只对.aspx文件有效,对HTML文件无效。解决方法是修改扩展名为.aspx。n数据库中用户密码也可以加密n(关于加密请看后面示例)System.web.securityn此命名空间包含用于在 Web 服务器应用程序中实现 ASP.NET 安全性的类。n在ASP.NET中我们需要额外的对象加密。HashPasswordForStoringInConfigFile方法非常容易使用,并且,它支持“SHA1”和“MD5”散列算法。加密与解密nSystem.Security.Cryptographyn使用CryptoStream加密示例FileStream stream = new FileStream(“C:test.txt”,FileMode.OpenOrCreate,FileAccess.Write);DESCryptoServiceProvider cryptic = new DESCryptoServiceProvider();cryptic.Key = ASCIIEncoding.ASCII.GetBytes(“ABCDEFGH”);cryptic.IV = ASCIIEncoding.ASCII.GetBytes(“ABCDEFGH”);CryptoStream crStream = new CryptoStream(stream,cryptic.CreateEncryptor(),CryptoStreamMode.Write);byte data = ASCIIEncoding.ASCII.GetBytes(“Hello World!”);crStream.Write(data,0,data.Length);crStream.Close();stream.Close();解密示例FileStream stream = new FileStream(“C:test.txt”,FileMode.Open,FileAccess.Read);DESCryptoServiceProvider cryptic = new DESCryptoServiceProvider();cryptic.Key = ASCIIEncoding.ASCII.GetBytes(“ABCDEFGH”);cryptic.IV = ASCIIEncoding.ASCII.GetBytes(“ABCDEFGH”);CryptoStream crStream = new CryptoStream(stream,cryptic.CreateDecryptor(),CryptoStreamMode.Read);StreamReader reader = new StreamReader(crStream);string data = reader.ReadToEnd();reader.Close();stream.Close();敏感数据nDo avoid secrets when you cannConsider using integrated authenticationnUse layered protection when you need secretsnAccess control settingsnData Protection API (DPAPI)nUse aspnet_setreg for ASP.NET secretsn, , nhttp:/support.microsoft.com/default.aspx?scid=kb;EN-US;329290输入验证n一定要验证所有的输入数据n使用 ASP.NET validation controlsn使用 regular expressions (如 web service parameters)n在服务端再次进行验证n使用参数,而不是直接连接SQL语句SQL Injection如何工作SELECT COUNT (*) FROM UsersWHERE UserName= or 1=1-AND Password=SELECT COUNT (*) FROM UsersWHERE UserName=JeffAND Password=imbatman应用中的应用中的Query模型模型恶意的恶意的Query语句语句or 1=1 matches everyrecord in the table- comments out theremainder of the query15.4 几个技术问题代码的安全IL代码n学习IL代码:参见IL目录下的文档n使用ILDASM,进行反汇编nC:Program FilesMicrosoft Visual Studio .NETFrameworkSDKBinildasm.exen使用ILASM,进行汇编、连接nC:WINNTMicrosoft.NETFrameworkv1.0.3705ilasm.exe“n参见ILHello目录下的文件Reflectorn能将程序反编译nLutz Roedernhttp:/www.aisto.com/roeder/dotnet/ n插件Reflector.FileDisassembler.zipObfuscaten代码混淆器n对类、方法、变量等进行更名n加密字符串n打乱流程n加入特定字节,使反编译程序不能工作n有很多这样的产品nDotfuscator(preemptive.com)nDeploy.NETnRemoteSoft、Thinstall、XenoCode反射与插件nReflectionnPlugin问题与讨论dstang2000263.net
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号