读书笔记:《代码大全》之基本数据类型

*可以少犯错误的使用数的建议

#避免使用“神秘数值(magicnumber)”

神秘数值时在程序中出现的并且没有经过解释的数值文字量。

如果你使用的编程语言支持具名常量,那么就用它来代替神秘数值,如果你无法使用具名常量,在可行的情况下应该使用全局变量

避免使用神秘数值,可以增强代码的可读性,并且使修改变得更容易,更可靠。

#如果需要,可以使用硬编码的01

数值01用于增量,减量和从数组的第一个元素开始循环。

一条很好的经验法则是,程序主体中仅能出现的文字量就是01,任何其他文字量都应该换成更有描述性的表示。

#预防除零(devide-by-zero错误

每次使用除法符号的时候,都要考虑表达式的分母是否可能为0

#使类型转换变得明显

因为隐式的类型转换在不同的编译器会执行不同的转换,为了避免这种不确定性,请明确告知编译器你需要的转换。

C++代码y=x+(float)i;

VB代码y=x+CSng(i);

#避免混合类型的比较

要做比较测试的两个数值的类型不同时,请动手进行类型转换,这样编译器就会把代码编译成你期望的结果。

#注意编译器的警告

通过编译器警告来发现问题要比自己找容易得多。

*使用整数时的注意事项

#检查整数除法

整数除法的结果还是整数,所以当你执行10*(7/10)的计算时,其结果是0,而不是你所期待的结果。对此问题最简单的补救方法就是重新安排表达式的顺序。如安排成:(10*7)/10,结果就准确了。

#检查整数溢出

在做整数的乘法或者加法时,要注意可能的最大整数。

要检查算术表达式的每一项,使用最合理的类型来避免整数的溢出。

#检查中间结果的溢出

如果在计算某一项时,中间结果也可能溢出,那么请换用一种更长的整形或者浮点类型。

*使用浮点数时的注意事项

#避免数量级相差巨大的数之间的加减运算

使用数量级相差巨大的数进行加减运算时,有可能不能得到你希望的结果,如果不可避免要使用这种运算,就先对这些数进行排序,然后从最小值开始把它们加起来,这样做虽然不能消除舍入问题,但是能使这一问题的影响减少到最低限度。

#避免等量判断

很多应该相等的浮点数值并不一定相等。这里的根本问题是,用两种不同的方法来求同一数值,结果不一定总得到同一个值。

因此应该找一种替代方案,一种有效的方法是先确定可接受的精度范围,然后用布尔函数判断数值是否足够接近。

#处理舍入误差问题

这里有处理舍入误差的常见方案

&换一种精度更高的变量类型

&换用二进制编码的十进制变量,即BCD模式。

&把浮点变量变成整型变量。采用这种方法,需要自己处理数字的小数部分。

#检查语言和函数库对特定数据类型的支持

如果语言中有内置的处理敏感数值的类型,如VB种的Currency等等,就使用它。

*使用字符串的技巧

#避免使用神秘字符和神秘字符串

同神秘数值一样,神秘字符和字符串也是不应该有的,如果你用的编程语言支持具名常量,则用具名常量来加以取代。否则就用全局变量

#避免off-by-one错误

由于子字符串的小标索引方式几乎与数组相同,因此要避免因为读写操作超出了字符串末尾而导致的off-by-one错误

#了解你的语言和开发环境是如何支持Unicode

为了标准函数库与第三方函数库之间的通信,常常需要在Unicode和其他字符集之间进行转换。如果有些字符串不需要表示成Unicode,就要尽早决定是否采用Unicode字符集。如果你决定要用Unicode字符串,就要决定何处以及何时使用它。

#在程序生命周期中尽早决定国际化/本地化策略

与国际化和本地化相关的事项都是很重要的问题,要尽早决定。

#如果你知道只需要支持一种文字的语言,请考虑使用ISO8859字符集

#如果你需要支持多种语言,请使用Unicode

#采用某种一致的字符串类型转换策略

如果你使用了多种字符串类型,有一种常用的方法能维护各种字符串类型,那就是在程序中把所有字符串都保存为一种格式,同时在尽可能靠近输入和输出操作的位置把字符串转换为其他格式。

*布尔变量的使用技巧

#用布尔变量对程序加以文档说明

不同于仅仅判断一个布尔表达式,你可以把这种表达式的结果赋给一个变量,从而使得这一判断的含义变得明显。

#用布尔变量来简化复杂的判断

当判断十分复杂的时候,使用布尔变量来标注,将十分有效,增强代码的可读性。

#如果需要的话创建自己的布尔类型

有些语言,比如C++,JavaVB,含有预定义的布尔类型,而其他语言,比如C,则没有,在没有布尔类型的语言中定义自己的布尔类型。

C中的定义:

EnumBoolean{

TRUE=1,

FALSE=(!TRUE)

};

*枚举类型的使用技巧

#用枚举类型来提高可读性

#用枚举类型来提高可靠性

#用枚举类型来简化修改

#将枚举类型作为布尔变量的替换方案

#检查非法数值

#定义出枚举的第一项和最后一项,以便用于循环边界

#把枚举类型的第一个元素留作非法值

#明确定义项目代码编写标准中第一个和最有一个元素的使用规则,并且在使用时保持一致

#警惕给枚举元素明确赋值而带来的失误

如果使用的编程语言中没有枚举类型,那么可以使用全局变量或者类来模拟它。

*具名常量的使用

具名常量很像变量,一旦赋值以后就不能再修改了。具名常量允许你用一个名字而不是数字来表示固定的量。

#在数据声明中使用具名常量

在需要定义所用数据的大小的数据声明和其他语句里,使用具名常量可以提高程序的可读性和可维护性。

#避免使用文字量,即使是“安全”的

应该使用具名常量替换代码中的文字

#用具有适当作用域的变量或类来模拟具名常量

如果你的语言不支持具名常量,你可以自行创建解决方案。

#统一地使用具名常量

如果需要表示的是同一个实体,在一处使用具名常量,而在另一处使用数字符号是非常危险的。这样的编程实践就是在自找麻烦。请统一使用具名常量。

*数组的使用

#确认所有的数组下标都没有超出数组的边界

#考虑用容器来取代数组,或者将数组作为顺序化结构来处理

#检查数组的边界点

#如果数组是多维的,确认下标的使用顺序是正确的

很容易把array[i][j]写成array[j][i],所以请花点时间检查下标的顺序是否正确。与其用ij这类不明不白的东西,不如去考虑更有意义的名字。

#提防下标串话

如果你在使用嵌套循环,那么很容易把array[i]写成array[j],请检查这种问题。更好的做法是使用比ij更具有意义的下标名。

#C中结合ARRAY_LENGTH()宏来使用数组

定义:#defineARRAY_LENGTH(x)(sizeof(x)/sizeof(x[0]))

在使用时,用ARRAY_LENGTH()宏取代具名常量来表示数组大小的上限。

*创建自定义数据类型的指导原则

#给所创建的类型取功能导向的名字

#避免使用预定义类型

#不要重定义一个预定义的类型

#定义替代类型以便于移植

#考虑创建一个类而不是使用typedef

要点

@使用特定的数据类型就意味着要记住适用于各个类型的很多独立的原则。

@如果你的语言支持,创建自定义类型会使得你的程序更容易修改,并更具有自描述性。

@当你用typedef或者其等价方式创建了一个简单类型的时候,考虑是否更应该创建一个新的类。

参考:

代码大全》第二版,第十二章,基本数据类型

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 -------------------------------- 数字类型的格式化 --------------------------------     固定格式参数:     General Number 普通数字,如可以用来去掉千位分隔号     format$("100,1
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关。意思是尽管你用诸如 Format(Now, "MM/dd/yyyy"),如果系统的设置格式区域语言的日期和时间格式分隔符是"-",那他还会显示为 MM-dd-yyyy     只有拼凑: <%response.write
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦 ‘======================================================== ‘以下事件
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用V
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integer, y As Integer, subStr As String If MsgBox("确定要分列处理吗?请确定分列的数据会覆盖它后面的单元格!", _
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 2 Dim path As String, hash As String 3 For Each fil
  Imports MySql.Data.MySqlClient Public Class Form1 ‘ GLOBAL DECLARATIONS Dim conString As String = "Server=localhost;Database=net2;Uid=root;Pwd=123456;" Dim con As New MySqlConnection
‘導入命名空間 Imports ADODB Imports Microsoft.Office.Interop   Private Sub A1() Dim Sql As String Dim Cnn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim S As String   S = "Provider=OraOLEDB.Oracl
Imports System.IO Imports System.Threading Imports System.Diagnostics Public Class Form1 Dim A(254) As String    Function ping(ByVal IP As Integer) As String Dim IPAddress As String IPAddress = "10.0.
VB运行EXE程序,并等待其运行结束 参考:https://blog.csdn.net/useway/article/details/5494084 Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Pr
今天碰到一个问题,登陆的时候,如果不需要验证手机号为空,则不去验证手机号 因为登陆的时候所有的验证信息都存放在一个数组里 Dim CheckUserInfo() As String ={UserBirthday, SecEmail, UserMob, UserSex, RealNameFirst, RealName, CheckCardID, CheckCardType, Contactemail
在VB6.0中,数据访问接口有三种: 1、ActiveX数据对象(ADO) 2、远程数据对象(RDO) 3、数据访问对象(DAO) 1.使用ADO(ActiveX Data Objec,ActiveX数据对象)连接SQL Server 1)使用ADO控件连接 使用ADO控件的ConnectionString属性就可以连接SQL Server,该属性包含一个由分号分隔的argument=value语
注:大家如果没有VB6.0的安装文件,可自行百度一下下载,一般文件大小在200M左右的均为完整版的软件,可以使用。   特别提示:安装此软件的时候最好退出360杀毒软件(包括360安全卫士,电脑管家等,如果电脑上有这些软件的话),因为现如今的360杀毒软件直接会对VB6.0软件误报,这样的话就可能会在安装过程中被误报阻止而导致安装失败,或者是安装后缺乏很多必须的组件(其它的杀毒软件或安全卫士之类的
Private Sub Form_Load() Call conndb End Sub Private Function conndb() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strCn, sql As String Dim db_host As String Dim db_user As String
  PPSM06S70:  Add  moddate  EDITSPRINTJOB:  MAX(TO_CHAR(ETRN.MODDATE, ‘yyyy/mm/dd/HH24:MI AM‘)) ACTUAL_SHIPDATE   4.Test Scenario (1) :Query SQL Test DN:8016578337 SELECT CTRN.TKCTID TRUCK_ID,        
  沒有出現CrystalReportViewer時,須安裝CRforVS_13_0. 新增1個數據集,新增1個數據表,添加二列,列名要和資料庫名一樣. 修改目標Framework 修改app.config, <startup >改成<startup useLegacyV2RuntimeActivationPolicy ="true">  CrystalReport1.rpt增加數據庫專家 在表單
Imports System.Threading Imports System Public Class Form1 Dim th1, th2 As Thread Public Sub Method1() Dim i As Integer For i = 1 To 100 If Me.Label1.BackColor =
Friend Const PROCESS_ALL_ACCESS = &H1F0FFF = 2035711 Friend Const PROCESS_VM_READ = &H10 Friend Const PROCESS_VM_WRITE = &H20 Friend Const PAGE_READONLY = &H2 Friend Const PAGE_READWRITE = &H4 Friend
以下代码随手写的 并没有大量测试 效率也有待提升 如果需要C#的请自行转换 Function SplitBytes(Data As Byte(), Delimiter As Byte()) As List(Of Byte()) Dim i = 0 Dim List As New List(Of Byte()) Dim bytes As New
Imports System.Data.SqlClient Public Class Form1 REM Public conn1 As SqlConnection = New SqlConnection("server=.; Integrated Security=False;Initial Catalog= mydatabase1; User ID= sa;password")