⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 9932.txt

📁 关于编程技术技巧的文章
💻 TXT
📖 第 1 页 / 共 5 页
字号:
  需要注意的是结束的括号在它所占的那一行是空的,__除了__它
跟随着同一条语句的继续符号.如"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 + -