📄 9932.txt
字号:
需要注意的是结束的括号在它所占的那一行是空的,__除了__它
跟随着同一条语句的继续符号.如"while"在do-while循环中,或者
"else"在if语句中.如下:
do { body of do-loop } while (condition);
以及
if (x == y) { .. } else if (x > y) { ... } else { .... }
理由: K&R.
另外,注意到这种大括号的放置方法减小了空行的数量,但却没有
减少可读性.于是,在屏幕大小受到限制的时候,你就可以有更多的空
行来写些注释了.
第三章:命名系统
C是一种简洁的语言,那么,命名也应该是简洁的.同MODULE-2以及
PASCAL语言不同的是,C程序员不使用诸如ThisVariableIsATemporary
Counter之类的命名方式.一个C语言的程序员会将之命名为"tmp",这很
容易书写,且并不是那么难以去理解.
然而,当混合类型的名字不得不出现的时候,描述性名字对全局变
量来说是必要的了.调用一个名为"foo"全局的函数是很让人恼火的.
全局变量(只有你必须使用的时候才使用它) ,就象全局函数一样,
需要有描述性的命名方式.假如你有一个函数用来计算活动用户的数
量,你应该这样命名--"count_active_users()"--或另外的相近的形
式,你不应命名为"cntusr()".
有一种称为Hungarian命名方式,它将函数的类型编码写入变量名
中,这种方式是脑子有毛病的一种表现---编译器知道这个类型而且会
去检查它,而这样只会迷惑程序员. --知道为什么Micro$oft为什么会
生产这么多"臭虫"程序了把!!.
局部变量的命名应该短小精悍.假如你有一个随机的整数循环计
数器,它有可能有"i",如果没有任何可能使得它能被误解的话,将其写
作"loop_counter"是效率低下的.同样的,""tmp"可以是任何临时数值
的函数变量.
如果你害怕混淆你的局部变量的名字,还有另外一个问题,就是称
function-growth-hormone-imbalancesyndrome.
第四章:函数
函数应该短小而迷人,而且它只作一件事情.它应只覆盖一到两个
屏幕(80*24一屏),并且只作一件事情,而且将它做好.(这不就是UNIX
的风格吗,译者注).
一个函数的最大长度和函数的复杂程度以及缩进大小成反比.于
是,如果你已经写了简单但长度较长的的函数,而且你已经对不同的情
况做了很多很小的事情,写一个更长一点的函数也是无所谓的.
然而,假如你要写一个很复杂的函数,而且你已经估计到假如一般
人读这个函数,他可能都不知道这个函数在说些什么,这个时候,使用
具有描述性名字的有帮助的函数.
另外一个需要考虑的是局部变量的数量.他们不应该超过5-10个,
否则你有可能会出错.重新考虑这个函数,将他们分割成更小的函数.
人的大脑通常可以很容易的记住7件不同的事情,超过这个数量会引起
混乱.你知道你很聪明,但是你可能仍想去明白2周以前的做的事情.
第5章:注释
注释是一件很好的事情,但是过多的注释也是危险的,不要试图区
解释你的代码是注释如何如何的好:你应该将代码写得更好,而不是花
费大量的时间去解释那些糟糕的代码.
通常情况下,你的注释是说明你的代码做些什么,而不是怎么做的.
而且,要试图避免将注释插在一个函数体里:假如这个函数确实很复杂,
你需要在其中有部分的注释,你应该回到第四章看看.你可以写些简短
的注释来注明或警告那些你认为特别聪明(或极其丑陋)的部分,但是
你必须要避免过多.取而代之的是,将注释写在函数前,告诉别人它做
些什么事情,和可能为什么要这样做.
第六章:你已经深陷其中了.
不要着急.你有可能已经被告之"GUN emacs"会自动的帮你处理C
的源代码格式,而且你已经看到它确实如此,但是,缺省的情况下,它的
作用还是不尽如人意(实际上,他们比随便敲出来的东西还要难看- a
infinite number of monkeys typing into GNU emacs would never
make a good program)
于是,你可以要么不要使用GUN emacs,要么让它使用saner
valules.使用后者,你需要将如下的语句输入到你的.emacs文件中.
(defun linux-c-mode() "C mode with adjusted defaults for use
with the Linux kernel."(interactive) (c-mode) (c-set-style
"K&R") (setq c-basic-offset8))
这会定义一个M-x Linux-c-mode的命令.当你hacking一个模块的
时候,如何你将-*- linux-c -*-输入在最开始的两行,这个模式会自
动起作用.而且,你也许想加入如下
(setq auto-mode-alist (cons `("/usr/src/linux.*/.*\\.
〖ch〗$" . linux-c-mode) auto-mode-alist))
到你的.emacs文件中,这样的话,当你在/usr/src/linux下编辑文
件的时候,它会自动切换到linux-c-mode .
但是,假如你还不能让emaces去自动处理文件的格式,不要紧张,
你还有一样东西: "缩进" .
GNU的缩进格式也很死板,这就是你为什么需要加上几行命令选项.
然而,这还不算太坏,因为GNU缩进格式的创造者也记得K&R的权威, (
GNU没有罪,他们仅仅是在这件事情上错误的引导了人们) ,你要做的
就只有输入选项"-kr -i8"(表示"K&R,缩进8个字符).
"缩进"有很多功能,特别是当它建议你重新格式你的代码的时候,
你应该看看帮助.但要记住: "缩进"不是风格很差的程序的万灵丹.
****************************************************************
VB:五彩缤纷的清屏效果
作者: 无为
在一些软件演示中,这一屏内容到下一屏内容间往往以一些有趣的清
屏图案来相互切换,有的像演出舞台上的开幕、闭幕,有的像百叶窗,
也有一些圆形、菱形等形态各异的清屏图案。VB作为一门优秀的WINDOWS
下的开发语言,其图形功能也很强。我们完全可以用其提供的画线语
句作出上述的清屏图案,下面的程序给出了常见的清屏图案程序:
Sub FilSCrO'设置背景色
Me.BackColor=RGB(Int(Rnd*256), Int(Rnd*256),Int(Rnd*256))
End Sub
Sub ClrScrl()'从左右两边到中间清屏
Dim i As Integer:Randomize:color= RGB(Int
(Rnd*256),Int(Rnd*256),Int(Rnd*256))
For i=0 To ScaleWidth/2
Line(i,0)-(i,ScaleHeight),color
Line(ScaleWidth-i,0)-(ScaleWidth-i, ScaleHeight),color
Next i
End Sub
Sub ClrSer20'从中间到左右两边清屏
Dim i As Integer:Randomize:color = RGB(Int
(Rnd*256),Int(Rnd*256),Int(Rnd*256))
for i=ScaleWidth/2 To 0 Step-1
Line(i,0)-(i,ScaleHeight-1),color
Line(ScaleWidth-i,0)-(ScaleWidth- i,ScaleHeight), color
Next i
End Sub
Sub ClrScr30'从上(顶)下(低)到中间清屏
Dim i As Integer:Randomize:color=RGB(Int
(Rnd*256),Int(Rnd*256),Int(Rnd*256))
For i=0 To ScaleHeight/2
Line(0,i)-(ScaleWidth,i),color
Line(0,ScaleHeight-i)-(ScaleWidth,ScaleHeight-i), color
next i
End Sub
Sub ClrScr40'从中间到上(顶)下(底)清屏
Dim i As Integer:Randomize:color=RGB(Int
(Rnd*256), Int(Rnd*256),Int(Rnd*256))
For i=ScaleHeight/2 To 0 Step-1
Line(0,i)_(ScaleWidth,i),color
Line(0,ScaleHeight-i)-(ScaleWidth,ScaleHeight-i), color
Next i
End Sub
Sub ClrScr50'菱形清屏,从四角向中心
Dim i,j As Integer:Randomize:color=RGB(Int
(Rnd*256), Int(Rnd*256),Int(Rnd*256))
For i=0 To ScaleWidth Sep 200
For j = 0 To ScaleHeight Step200*ScaleHeight/ScaleWidth
Line(i,0)-(0,j),color
Line(ScaleWidth-i,ScaleHeight)-(ScaleWidth, ScaleHeight
-j),color
Line(0,ScaleHeight-j)-(i,ScaleHeight),color
Line(ScaleWidth-i,0)-(ScaleWidth,ScaleHeight-j), color
Next j
Next i
End Sub
Sub ClrScr60'圆形清屏,由大至小从外围向中心
Dim i As Integer:Randomize:color=RGB(Int
(Rnd*256), Int(Rnd*256),Int(Rnd*256))
For i=ScaleWidth To 0 Step-3
Circle(ScaleWidth/2,ScaleHeight/2,i/2,color
Next i
End Sub
Sub ClrScr70'圆形清屏,由小至大从中心向外围
Dim i As Integer:Randomize:color=RGB(Int
(Rnd*256), Int(Rnd*256),Int(Rnd*256))
For i=0 To ScaleHeight Step 3
Circle(ScaleWidth/2,ScaleHeight/2),i/2,color
Next i
End Sub
‘以上程序作为定义的子函数,置于General间
Sub Form_Activate()
FillSCr; ClrScr1; ClrScr2; ClrScr3; ClrScr4; ClrScr5; ClrScr7; ClrScr6
End Sub
Private Sub Form_Click()
End
End Sub
注:该程序在VB3.0、VB4.0、VB5.0下均通过,程序一开始运行
即先后演示从左右到中间,从中间到左右,从上下到中间,从中间到
上下,从四角向中心(菱形),从中心向外围(圆形),从外围向中心(
圆形)等清屏图案。最后两个清屏图案很有趣,清屏结束后还会形成
从中心到四角的放射状图案,似孔雀开屏一样。有兴趣的读者不防一
试。另外,请注意FORM(窗体)的AutoRedraw属性值应为False,若为
True,则将看不到效果。
****************************************************************
统一JavaScript在不同浏览器下的事件处理方式
一、事件处理方式比较
在今天的Web上,越来越多的网页采用客户端脚本技术作为实现页面
交互能力的工具。JavaScript以其浏览器无关的适应能力,成为众多网页
制作者的第一选择。但是,基于事件处理的JavaScript程序还不能完全实
现与环境(浏览器)无关。虽然我们可以在特殊化(高度依赖于特定浏览
器,极小的可重用性)和通用化(避免使用任何依赖于浏览器的特色,最
大的可重用性)之间作出选择,但两种方案都存在缺点。
本文介绍一个通用的事件控制接口,通过这个接口处理事件既可以获
得特殊化脚本的灵活性,同时也拥有跨浏览器的适应能力。为更好地理解
这个接口的工作过程,我们先来比较一下IE和Navigator的事件处理方式,
找出面临的问题。 一、事件处理方式比较
虽然IE和Navigator事件模型的基础大不相同,但两者之间仍存在一
些共同之处。为深入理解JavaScript在这两种环境下事件处理方式的异同,
我们可以比较它们对于同一事件脚本的不同实现。清单1和清单2提供了这
样一个脚本——在文档级和元素级捕获按钮的单击事件。
【清单1】
< HTML>
< HEAD>
< TITLE>Navigator事件模型测试< /TITLE>
< /HEAD>
< BODY>
< script>
document.captureEvents( Event.CLICK );
document.onclick = bodyEvent;
function bodyEvent( e )
{
alert( "在文档级捕获事件 " + e.type );
if ( e.target.name == "myButton" )
routeEvent( e );
}
function buttonEvent( e )
{
// 事件传递到此结束
alert( "在按钮级捕获事件 " + e.type );
}
< /script>
< form name="myForm">
< input name="myButton" type="button" value="单击按钮"
onclick="buttonEvent( event )">
< /form>
< /BODY>
< /HTML>
【清单2】
< HTML>
< HEAD>
< TITLE>IE事件模型测试< /TITLE>
< /HEAD>
< BODY>
< script>
document.onclick = bodyEvent;
function bodyEvent()
{
// 事件传递到此结束
alert( "在文档级捕获事件 " + window.event.type );
}
function buttonEvent( e )
{
alert( "在按钮级捕获事件 " + e.type );
}
< /script>
< form name="myForm">
< input name="myButton" type="button" value="单击按钮"
onclick="buttonEvent( event )">
< /form>
< /BODY>
< /HTML>
首先我们可以注意到两者在文档级(或窗口级)事件捕获方式上的
不同。为突出这两者之间的共同之处,清单1和清单2都显式地将bodyEvent
句柄指派给文档的click事件。不过,在Navigator下需要如下的额外声明,
否则上述指派操作被忽略:
document.captureEvents( Event.CLICK );
captureEvents可以用来捕获多个不同事件,但必需显式地将所有事
件处理句柄指派给窗口或文档。captureEvents所要求的参数形式为:
“Event” + “.” + 大写的事件名称。多个事件可以在一个captureEvents
调用中用 “|”(或操作符)连接,如:
document.captureEvents( Event.MOUSEDOWN|Event.LOAD );
document.onmousedown = docMouseDown;
document.onload = docLoad
和下列调用效果完全相同:
document.captureEvents( Event.MOUSEDOWN );
document.captureEvents( Event.LOAD );
document.onmousedown = docMouseDown;
document.onload = docLoad;
而IE的等价形式为:
document.onmousedown = docMouseDown;
document.onload = docLoad;
其次,可以看到两个浏览器都提供一个事件对象,在任意一个触发
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -