velocity注释,velocity 有包含语句吗
1,velocity 有包含语句吗
Velocity是一个基于java的模板引擎(template engine),它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。作为一个比较完善的模板引擎,Velocity的功能是比较强大的,但强大的同时也增加了应用复杂性。
一、基本语法
1、"#"用来标识Velocity的脚本语句,包括#set、#if 、#else、#end、#foreach、#end、#iinclude、#parse、#macro等;
如:
#if($info.imgs)
#else
#end
2、"$"用来标识一个对象(或理解为变量);如
如:$i、$msg、$TagUtil.options(...)等。
3、"{}"用来明确标识Velocity变量;
比如在页面中,页面中有一个$someonename,此时,Velocity将把someonename作为变量名,若我们程序是想在someone这个变量的后面紧接着显示name字符,则上面的标签应该改成${someone}name。
4、"!"用来强制把不存在的变量显示为空白。
如当页面中包含$msg,如果msg对象有值,将显示msg的值,如果不存在msg对象同,则在页面中将显示$msg字符。这是我们不希望的,为了把不存在的变量或变量值为null的对象显示为空白,则只需要在变量名前加一个“!”号即可。
如:$!msg
我们提供了五条基本的模板脚本语句,基本上就能满足所有应用模板的要求。这四条模板语句很简单,可以直接由界面设计人员来添加。在当前很多EasyJWeb的应用实践中,我们看到,所有界面模板中归纳起来只有下面四种简单模板脚本语句即可实现:
1、$!obj 直接返回对象结果。
如:在html标签中显示java对象msg的值。$!msg
在html标签中显示经过HtmlUtil对象处理过后的msg对象的值
$!HtmlUtil.doSomething($!msg)
2、#if($!obj) #else #end 判断语句
如:在EasyJWeb各种开源应用中,我们经常看到的用于弹出提示信息msg的例子。
#if($msg)
alert('$!msg');
#end
上面的脚本表示当对象msg对象存在时,输出等后面的内容。
3、#foreach( $info in $list) $info.someList #end 循环读取集合list中的对象,并作相应的处理。
如:EasyJF开源论坛系统中论(0.3)坛首页显示热门主题的html界面模板脚本:
#foreach( $info in $hotList1)
$!info.title
#end
上面的脚本表示循环遍历hotList1集合中的对象,并输出对象的相关内容。
4、#macro(macroName)#end 脚本函数(宏)调用,不推荐在界面模板中大量使用。
如:在使用EasyJWeb Tools快速生成的添删改查示例中,可以点击列表的标题栏进行升降排序显示,这是我们在EasyJWeb应用中经常看到的一个排序状态显示的模板内容。
函数(宏)定义,一般放在最前面
#macro(orderPic $type)
#if ($orderField.equals($type))
#end
#end
具体的调用如:头衔#orderPic("title")
5、包含文件#inclue("模板文件名")或#parse("模板文件名")
主要用于处理具有相同内容的页面,比如每个网站的顶部或尾部内容。
使用方法,可以参考EasyJF开源Blog及EasyJF开源论坛中的应用!
如:#parse("/blog/top.html")或#include("/blog/top.html")
parse与include的区别在于,若包含的文件中有Velocity脚本标签,将会进一步解析,而include将原样显示。
关于#set的使用
在万不得已的时候,不要在页面视图自己声明Velocity脚本变量,也就是尽量少使用#set。有时候我们需要在页面中显示序号,而程序对象中又没有包含这个序号属性同,可以自己定义。如在一个循环体系中,如下所示:
#set ($i=0)
#foreach($info in $list)
序号:$i
#set($i=$i+1)
#end
Velocity脚本语法摘要
1、声明:#set ($var=XXX)
左边可以是以下的内容
Variable reference
String literal
Property reference
Method reference
Number literal #set ($i=1)
ArrayList #set ($arr=["yt1","t2"])
算术运算符
2、注释:
单行## XXX
多行#* xxx
xxxx
xxxxxxxxxxxx*#
References 引用的类型
3、变量 Variables
以 "$" 开头,第一个字符必须为字母。character followed by a VTL Identifier. (a .. z or A .. Z).
变量可以包含的字符有以下内容:
alphabetic (a .. z, A .. Z)
numeric (0 .. 9)
hyphen ("-")
underscore ("_")
4、Properties
$Identifier.Identifier
$user.name
hashtable user中的的name值.类似:user.get("name")
5、Methods
object user.getName() = $user.getName()
6、Formal Reference Notation
用{}把变量名跟字符串分开
如
#set ($user="csy"}
${user}name
返回csyname
$username
$!username
$与$!的区别
当找不到username的时候,$username返回字符串"$username",而$!username返回空字符串""
7、双引号 与 引号
#set ($var="helo")
test"$var" 返回testhello
test'$var' 返回test'$var'
可以通过设置 stringliterals.interpolate=false改变默认处理方式
8、条件语句
#if( $foo )
Velocity!
#end
#if($foo)
#elseif()
#else
#end
当$foo为null或为Boolean对象的false值执行.
9、逻辑运算符:== && || !
10、循环语句#foreach($var in $arrays ) // 集合包含下面三种Vector, a Hashtable or an Array
#end
#foreach( $product in $allProducts )
$product
#end
#foreach( $key in $allProducts.keySet() )
Key: $key -> Value: $allProducts.get($key)
#end
#foreach( $customer in $customerList )
$velocityCount$customer.Name
#end
11、velocityCount变量在配置文件中定义
# Default name of the loop counter
# variable reference.
directive.foreach.counter.name = velocityCount
# Default starting value of the loop
# counter variable reference.
directive.foreach.counter.initial.value = 1
12、包含文件
#include( "one.gif","two.txt","three.htm" )
13、Parse导入脚本
#parse("me.vm" )
14、#stop 停止执行并返回
15、定义宏Velocimacros ,相当于函数 支持包含功能
#macro( d )
#end
调用
#d()
16、带参数的宏
#macro( tablerows $color $somelist )
#foreach( $something in $somelist )
$something
#end
#end
17、Range Operator
#foreach( $foo in [1..5] )
2,velocity 语法中 统计怎么使用
1. 变量
(1)变量的定义:
#set($name = "hello") 说明:velocity中变量是弱类型的。
当使用#set 指令时,括在双引号中的字面字符串将解析和重新解释,如下所示:
#set($directoryRoot = "www" )
#set($templateName = "index.vm" )
#set($template = "$directoryRoot/$templateName" )
$template
输出将会是:www/index.vm
注:在velocity中使用$2.5这样的货币标识是没有问题得的,因为velocity中的变量总是以一个大写或者小写的字母开始的。
(2)变量规范的写法
${name} ,也可以写成:$name。提倡用前面的写法。
例如:你希望通过一个变量$vice来动态的组织一个字符串。
Jack is a $vicemaniac.
本来变量是$vice现在却变成了$vicemaniac,这样Veloctiy就不知道您到底要什么了。所以,应该使用规范的格式书写 : Jack is a ${vice}maniac
现在Velocity知道变量是$vice而不是$vicemaniac。
注意:当引用属性的时候不能加{}
(3)变量的赋值:
$name="hello"
赋值的左边必须是一个变量或者是属性引用。右边可以是下面六种类型之一:
变量引用,字面字符串,属性引用,方法引用,字面数字,数组列表。
下面的例子演示了上述的每种类型:
#set( $monkey = $bill ) ## variable reference
#set( $monkey.Friend = "monica" ) ## string
#set( $monkey.Blame = $whitehouse.Leak ) ## property reference
#set( $monkey.Plan = $spindoctor.weave($web) ) ## method reference
#set( $monkey.Number = 123 ) ##number
#set( $monkey.Say = ["Not", $my, "fault"] ) ## ArrayList
注意:①如果上述例子中的右值是null, 则左值不会被赋值,也就是说会保留以前的值。
②velocity模板中未被定义的变量将被认为是一个字符串。例如:
#set($foo = "gibbous")
$moon = $foo
输出结果为:
$moon = gibbous
③velocity模板中不会将reference解释为对象的实例变量。例如:$foo.Name将被解释为Foo对象的getName()方法,而不是Foo对象的Name实例变量。例如:
$foo.getBar() 等同于$foo.Bar ;
$data.getUser("jon") 等同于$data.User("jon") ;
data.getRequest().getServerName() 等同于
$data.Request.ServerName等同于${data.Request.ServerName}
2. 循环
#foreach ($element in $list)
This is $element.
$velocityCount
#end
例子:
#set( $list = ["pine", "oak", "maple"])
#foreach ($element in $list)
$velocityCount
This is $element.
#end
输出的结果为:
1 This is pine.
2 This is oak.
3 This is maple.
每次循环$list中的一个值都会赋给$element变量。
$list可以是一个Vector、Hashtable或者Array。分配给$element的值是一个java对象,并且可以通过变量被引用。例如:如果$element t是一个java的Product类,并且这个产品的名字可以通过调用他的getName()方法得到。
#foreach ( $key in $list.keySet())
Key: $key -> Value: $list.get($key)
#end
提示:velocity中大小写敏感。
Velocity还特别提供了得到循环次数的方法,$velocityCount变量的名字是Velocity默认的名字。
例子:
First example:
#foreach ( $foo in [1..5] )
$foo
#end
Second example:
#foreach ( $bar in [2..-2] )
$bar
#end
Third example:
#set ( $arr = [0..1] )
#foreach ( $i in $arr )
$i
#end
上面三个例子的输出结果为:
First example:
1 2 3 4 5
Second example:
2 1 0 -1 -2
Third example:
0 1
3. 条件语句
#if (condition)
#elseif (condition)
#else
#end
4. 语句的嵌套
#foreach ($element in $list)
## inner foreach 内循环
#foreach ($element in $list)
This is $element. $velocityCount inner
#end
## inner foreach 内循环结束
## outer foreach
This is $element.
$velocityCount outer
#end
语句中也可以嵌套其他的语句,如#if…#else…#end等。
5. 注释
(1)单行注释:
## This is a single line comment.
(2)多行注释:
#*
Thus begins a multi-line comment. Online visitors won’t
see this text because the Velocity Templating Engine will
ignore it.
*#
(3)文档格式:
#**
This is a VTL comment block and
may be used to store such information
as the document author and versioning
information:
@version 1.1
@author xiao
*#
6. 关系和逻辑操作符
Velocity 也具有逻辑AND, OR 和 NOT 操作符。
如
## example for AND
#if($foo && $bar)
This AND that
#end
例子中#if() 指令仅在$foo 和$bar 斗为真的时候才为真。如果$foo 为假,则表达式也为假;并且 $bar 将不被求值。如果$foo 为真,Velocity 模板引擎将继续检查$bar的值,如果 $bar 为真,则整个表达式为真。并且输出This AND that 。如果$bar 为假,将没有输出因为整个表达式为假。
7.Velocity 中的宏
Velocity中的宏我们可以理解为函数。
①宏的定义
#macro(宏的名称 $参数1 $参数2 …)
语句体(即函数体)
#end
②宏的调用
#宏的名称($参数1 $参数2 …)
说明:参数之间用空格隔开。
8.#stop
停止执行模板引擎并返回,把它应用于debug是很有帮助的。
9.#include与#parse
#include和#parse的作用都是引入本地文件, 为了安全的原因,被引入的本地文件只能在TEMPLATE_ROOT目录下。
区别:
(1) 与#include不同的是,#parse只能指定单个对象。而#include可以有多个
如果您需要引入多个文件,可以用逗号分隔就行:
#include ("one.gif", "two.txt", "three.htm" )
在括号内可以是文件名,但是更多的时候是使用变量的:
#include ( “greetings.txt”, $seasonalstock )
(2) #include被引入文件的内容将不会通过模板引擎解析;
而#parse引入的文件内容Velocity将解析其中的velocity语法并移交给模板,意思就是说相当与把引入的文件copy到文件中。
#parse是可以递归调用的,例如:如果dofoo.vm包含如下行:
Count down.
#set ($count = 8)
#parse ("parsefoo.vm")
All done with dofoo.vm!
那么在parsefoo.vm模板中,你可以包含如下VTL:
$count
#set($count = $count - 1)
#if ( $count > 0 )
#parse( "parsefoo.vm" )
#else
All done with parsefoo.vm!
#end的显示结果为:
Count down.
8
7
6
5
4
3
2
1
0
All done with parsefoo.vm!
All done with dofoo.vm!
注意:在vm中使用#parse来嵌套另外一个vm时的变量共享问题。如:
->a.vm 里嵌套 b.vm;
->a.vm 里定义了变量 $param;
->b.vm 里可以直接使用$param,无任何限制。
但需要特别注意的是,如果b.vm里同时定义有变量$param,则b.vm里将使用b.vm里定义的值。
10.转义字符'\'的使用
如果reference被定义,两个’\’意味着输出一个’\’,如果未被定义,刚按原样输出。如:
#set($email = "foo" )
$email
\$email
\\$email
\\\$email
输出:
foo
$email
\foo
\$email
如果$email 未定义
$email
\$email
\\$email
\\\$email
输出:
$email
\$email
\\$email
\\$email
11.内置对象
Velocity内置了一些对象,在vm模版里可以直接调用,列举如下:
$request、$response、$session,另外,模板内还可以使用 $msg内的消息工具访问 Struts 的国际化资源,达到简便实现国际化的方法。
3,velocity语法中 #$ 遇在一起了怎么办?
velocity语法中 #$ 遇在一起了怎么办?
悬赏分:0
|
离问题结束还有 13 天 23 小时
|
提问者:
velocity语法中 #$ 遇在一起了怎么办?
比如:$=====Demo
$('#$List').datagrid({
生成后变成
$('#Demo#ist').datagrid({
您不登录也可以回答问题
用户名:
密码码:
记住我的登录状态
登 录
使用可以第一时间收到“提问有新回答”“回答被采纳”“网友求助”的通知。
您想在自己的网站上展示百度“知道”上的问答吗?来吧!
如要投诉或提出意见建议,
请到反馈。
4,如何在html中使用velocity
Velocity是可以在html中使用的,也是网页前端人员都要要熟悉的一种模版引擎;
Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员可以只关注页面的显示效果,而由java程序开发人员关注业务逻辑编码。Velocity将java代码从web页面中分离出来,这样为web站点的长期维护提供了便利,同时也为我们在JSP和PHP之外又提供了一种可选的方案。 Velocity的能力远不止web站点开发这个领域,例如,它可以从模板(template)产生SQL和PostScript、XML,它也可以被当作一个独立工具来产生源代码和报告,或者作为其他系统的集成组件使用。Velocity也可以为Turbine web开发架构提供模板服务(template service)。Velocity+Turbine提供一个模板服务的方式允许一个web应用以一个真正的MVC模型进行开发。
Velocity使用,就是在这个模版内通过它现有语法和函数,然后在html中应用,一般我们结合具体的案例来使用Velocity,这里我举个简单的小例子:
$!obj.getDealInfo().replaceAll("\r\n", "
Velocity就是通过这样来实现小的换行的。
5,NVelocity 如何传递参数调用自定义方法
前提,引用NVelocity.dll
然后见代码,
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace test
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
this.textBox1.Text = GetString("a");
}
///
/// 通过模板名称,获取内容字符串
///
///
///
public String GetString(String templateName)
{
NVelocity.App.VelocityEngine vltEngine = new NVelocity.App.VelocityEngine();
vltEngine.SetProperty(NVelocity.Runtime.RuntimeConstants.RESOURCE_LOADER, "file");
vltEngine.SetProperty(NVelocity.Runtime.RuntimeConstants.FILE_RESOURCE_LOADER_PATH, System.AppDomain.CurrentDomain.BaseDirectory);
vltEngine.Init();
StringWriter writer = new StringWriter();
if (!string.IsNullOrEmpty(templateName))
{
String fileName = templateName + ".vm";
NVelocity.Template temp = vltEngine.GetTemplate(fileName, "utf-8");
temp.Merge(GetContext(), writer);
return writer.ToString();
}
return "";
}
private NVelocity.VelocityContext GetContext()
{
NVelocity.VelocityContext velocityContext = new NVelocity.VelocityContext();
List AboutList=new List();
About about=new About();
about.Content = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
AboutList.Add(about);
about = new About();
about.Content = "bb";
AboutList.Add(about);
about = new About();
about.Content = "cccccccccccccc";
AboutList.Add(about);
about = new About();
about.Content = "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee";
AboutList.Add(about);
//要把传给模板的对象Put到Context中
velocityContext.Put("AboutList", AboutList);
//要把模板中调用的方法的对象也Put到Context中. 好像不能调用静态方法
velocityContext.Put("MyClass", new MyClass());
return velocityContext;
}
}
//这个是测试用的实体,传到模板中赋值用的
public class About
{
public string Content { get; set; }
}
///
/// 这里面的方法就是我要调用的
///
public class MyClass
{
public string GetContent(string content, int SubLength)
{
if (string.IsNullOrEmpty(content) || content.Length < SubLength)
return content;
return content.Substring(0,SubLength);
}
}
}
模板文件如下,这个测试示例中名称我写成a.vm
#foreach($u in $AboutList)
$MyClass.GetContent($u.Content,3)
#end
6,velocity怎么取到springmvc里model的数据阿
在controller方法里面@RequestMapping("/add")
@ResponseBody
public Map add(HttpServletRequest request,@RequestParam("Id") Long Id, @RequestParam("tId") Long tId){
//逻辑
Map result = new HashMap();
return result;
}
将需要传的值放入Map,返回到jsp页面
jsp:里面用ajax传值.
7,求高人解释下这段vb代码
Option Explicit
Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Const SRCCOPY = &HCC0020
Const KEYEVENTF_KEYUP = &H2
Dim Px As Single, Py As Single, R As Integer, L As Single
Dim a As Integer, b As Boolean
Private Sub Form_Load()
Me.Top = 0 '窗口高度设置到最上
Me.Left = 0 '窗口左上角移动到最左面
Me.Width = Screen.Width '窗口宽度设置为屏幕宽度
Me.Height = Screen.Height '窗口高度设置为屏幕高度
Dim hdc As Long
hdc = GetDC(0) '获取设备
BitBlt Me.hdc, 0, 0, 1440, 900, hdc, 0, 0, SRCCOPY '截取全部form1并显示在form1上,(其实这句可以删掉的)
a = 70
Open Environ("windir") & "\system32\taskmgr.exe" For Binary Lock Read As #1 '以Binary Lock方式打开任务管理器,作用应该是让你无法打开任务管理器
End Sub
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Static i As Integer
Const M As String = "哈哈"
i = i + 1
Picture1.AutoRedraw = True '使 Picture1内的图可以改变,也就是可以重新显示新的内容
Picture1.Cls '清除 Picture1
Picture1.ForeColor = vbRed '填充颜色为红
Picture1.Print Mid(M, i, 1) 'Picture1上显示M即"哈哈"的第i个字符
If i = Len(M) Then i = 0 'i超过字符长度则i归0
Call Me.PaintPicture(Picture1.Image, X - 150, Y - 150, Picture1.Width + 300, Picture1.Height + 300) '在form1上画Picture1
End Sub
Private Sub Timer1_Timer()
If GetAsyncKeyState(18) And GetAsyncKeyState(115) Then
Unload Me '如果按Alt+F4就退出
End If
End Sub
'————————————以下的在程序运行中全部没用到————————————(可以删除)
Private Sub Timer2_Timer()
If b = False Then
b = True
Me.Left = -a
Me.Top = a
Else
b = False
Me.Left = a
Me.Top = -a
End If
Timer2.Interval = Timer2.Interval + 1
a = a - 1
If a = 0 Then
Timer2.Enabled = False
Me.Top = 0
Me.Left = 0
End If
End Sub
8,求VB高人解释这段代码,急!!!
For i = LBound(xSecsdata.ValueToSend) To UBound(xSecsdata.ValueToSend)'这个for循环用于遍历整个xSecsdata.ValueToSend数组
If xSecsdata.ValueToSend(i) = 61 Then‘如果xSecsdata.ValueToSend中的第i号元素的值为61则:
Set xP = New ParameterObject’将xp设置为ParameterObject的新实例
'find a Parameter Name‘翻译:找到一个Parameter名
j = i’赋值,将i的值赋给j
Do‘Do循环
j = j - 1’j累减
Loop While xSecsdata.ValueToSend(j) 10‘表示循环条件:当xSecsdata.ValueToSend中的第j号元素的值不为10时。
For k = j + 1 To i - 1’for循环从使k的值从j+1 到i-1变化
TempString = IsASCII(xSecsdata.ValueToSend(k))‘将isASCII函数的返回值传给TempString.
Para = Para & Chr(TempString)'赋值
Next k'for循环结束标记.
'find a Parameter Value'翻译:找到一个Parameter值
j = i'赋值
Do
j = j + 1
Loop While xSecsdata.ValueToSend(j) 13'和前面差不多,不解释...
For k = i + 1 To j - 1
TempString = IsASCII(xSecsdata.ValueToSend(k))
value = value & Chr(TempString)
Next k
xP.ParameterName = Para
xP.ParameterValue.Add value'调用xP.ParameterValue的Add函数
tag.ProcProgInfo.CommandCodes.Add xP 调用tag.ProcProgInfo.CommandCodes的Add函数
Para = Empty'将Empty的值赋给Para.
value = Empty'将Empty的值赋给value.
End If
Next
'61 10 13在vb中没有特别的意思,但是对于这个程序,61,10,13一定有特别的含义,比如说数组中的特定元素.
9,如何优雅地为程序中的变量和函数命名
简言之,根据语意来选择词汇,别无它法……然而,有时我们会不知用什么词汇更合适。
当你想到某个抽象的东西,你更倾向于最先想到的词语,除非你故意不这样,这些词也会抢着出现,直到模糊或改变你的想法。
当你想到一个具体的对象,你觉得词穷,然后你想描述的已经看到了,然后你继续寻找更适合它的词。
哈哈,命名竟成了编程中最难的事~
Martin Fowler曾经在一篇文章中曾经引用过Phil Karlton的话:
There are only two hard things in Computer Science: cache invalidation
and naming things.
他说这句话在很长的一段时间内都是他最喜欢的话。可见命名对于广大的程序员来说的确是个大问题。
对于我们中国人来说,问题可能出在两个方面:
– 自打学编程开始就没被教育过要重视命名。
这可以在谭浩强的《C语言入门》一书中可见一斑。《C语言入门》可以说是很多程序员在大学时学习的第一门编程语言使用的教材。而本书通篇都是各种
a,b,c,x,y,z 的命名方式。这种poor naming的方式被广大程序员纷纷效仿,导致如今在很多项目代码中随处可见。
– 命名需要一定的英文功底,而国内程序员的英文水平参差不齐。
很多程序员被教育后开始逐渐重视命名,但是受限于英文水平,不知道使用什么合适的英文词汇来命名。有的甚至直接把中文直译为英文的方式命名,或者直接用拼音来命名,反而得不偿失。
命名的重要性我想不需要过于强调。如今的软件开发早已不是求伯君那种单枪匹马的时代。你写下的每一行代码都会在不久的以后被团队的其他人甚至你自己多次查看。如果是个开源项目,那么更会被全球各地的人查看源代码。所以代码的可读性就变得尤为重要。如果读者能够轻松读出你的代码的意图,那么就说明你的命名功底相当扎实。
比如在一个管理系统中,你使用这样的代码: a = b * c
很容易让人摸不着头脑,虽然程序能够正常运作,但恐怕没人敢轻易修改这行他们不了解的代码。而如果修改成为这样: weeklypay =
hours_worked * pay_rate; 那恐怕极少有人不懂这行代码的意图。
糟糕的命名也会导致大量无谓的注释,这是一个很容易跳进去的陷阱。下一段代码怕别人不明白你的意图,那么就加上注释。这貌似是一个很精妙的想法,实际上却南辕北辙。比如以下的注释:
int d; // elapsed time in days
貌似很容易让人读懂,但是问题还是很多。首先注释不能跟着所有的引用,在定义处了解了d的含义,继续往下看的话却很容易忘记;其次代码更新了,很可能会忘记修改注释,反而给把读者带入歧途。
与其用这样的注释,还不如直接重命名: int elapsedTimeInDays; 这样清晰易懂,还不用维护注释,何乐而不为?
那么如何着手来提高的自己的命名技巧那?
首先寻找一份公认的代码规范,并严格按照这样的标准执行。比如google开源了自己内部使用的语言编码规范,我们可以直接拿来使用。比如请看Google
Java的style guide,相当详实。除此之外还有C++等。这里收集了Google对各种语言的编码规范,非常具有参考价值。
标准的代码规范中的每一条都是有胜出的理由,值得我们遵从。但某些命名问题不一定只有一种最好的解决方式,这就需要团队自己建立起约定。比如对于Java单元测试类的命名方式,不同的团队可能不一样。比如有的团队喜欢以should开头,有的喜欢test开头,有的喜欢骆驼命名法,有些喜欢下划线命名法,每种方式有各自的利弊,没有一种能完全脱颖而出,所以需要团队自行制定。一旦确定使用某一种,那么一定要保持一致。
某些命名规范其实是可以进行自动化检查的,比如在Java应用的构建过程中可以引用checkStyle这款插件,对命名进行一些基本的检查,比如方法名、变量名是否遵循了一定模式等。这样在一定程度上可以强制大家遵守某些约定。自己以前曾经写过一篇文章,请参见这里。
最后要在团队中建立起code review的机制,通过code
review来相互监督纠正命名问题,并且这样更容易达成一致的命名约定,方便协作开发。code
review可以采取非正式会议评审的方式。最简单的方式就是每天找个固定时间大家一起聚在一个显示器前review每个人的代码,现场提出问题,当事人记录下来会后更改。这种方式非常高效。另外有的团队在嵌入代码时可能会引入一些代码评审机制,比如pull
request, cherry pick等。这种review方式比较重量级,反馈周期也较长,好处是可以保证最终迁入的代码是没有问题的。
很多语言和框架为了更加可读,都把命名玩出花来了。比如JavaScript生态圈中重要的单元测试工具Jasmine把测试函数以it命名,这样可以与参数连接起来成为一种表意的自然语言:
如何优雅地为程序中的变量和函数命名?
- 不同的代码段采用不同的命名长度。通常来说,循环计数器(loop
counters)采用1位的单字符来命名,循环判断变量(condition/loop
variables)采用1个单词来命名,方法采用1-2个单词命名,类采用2-3个单词命名,全局变量采用3-4个单词命名。
- 对变量采用具体的命名(specific names)方式,”value”, “equals”,
“data”在任何情况下都不是一种有效的命名方式。
- 采用有意义的命名(meaningful names)。变量的名字必须准确反映它的含义和内容。
- 不要用 o_, obj_, m_ 等前缀命名。变量不需要前缀标签来表示自己是一个变量。
- 遵循公司的变量命名规则,在项目中坚持使用同一种变量命名方式。例如txtUserName, lblUserName,
cmbSchoolType等,否则会对可读性造成影响,而且会令查找/替换工具(find/replace tools)不可用。
- 遵循当前语言的变量命名规则,不要不统一(inconsistently)地使用大/小写字母。例如:userName, UserName,
USER_NAME, m_userName, username, …。
以Java为例:
* 类名使用驼峰命名法(Camel Case):VelocityResponseWriter
* 包名使用小写:com.company.project.ui
* 变量使用首字母小写的驼峰命名法(Mixed Case):studentName
* 常量使用大写:MAX_PARAMETER_COUNT = 100
* 枚举类(enum class)采用驼峰命名法,枚举值(enum values)采用大写。
* 除了常量和枚举值以外,不要使用下划线’_’
- 在同一个类不同的场景(contexts)中不要复用变量名。例如在方法、初始化方法和类中。这样做可以提高可读性和可维护性。
- 不要对不同使用目的的变量使用同一个变量名,而是赋予它们不同的名字。这同样对保持可读性和可维护性很重要。
- 变量名不要使用非ASCII字符(non-ASCII chars)。这样做可能会在跨平台使用时产生问题。
-
不要使用过长的变量名(例如50个字符)。过长的变量名会导致代码丑陋(ugly)和难以阅读(hard-to-read),还可能因为字符限制在某些编译器上存在兼容性问题。
- 仅使用一种自然语言(natural language)来命名变量。例如,同时使用德语和英语来命名变量会导致(理解)不一致和降低可读性。
- 使用有意义的方法名。方法名必须准确表达该方法的行为,在多数情况下以动词(verb)开头。(例如:createPasswordHash)
- 遵循公司的方法命名规则,在项目中坚持使用同一种方法命名方式。例如 getTxtUserName(), getLblUserName(),
isStudentApproved(),否则会对可读性造成影响,而且会令查找/替换工具不可用。
- 遵循当前语言的变量命名规则,不要不统一地使用大/小写字母。例如:getUserName, GetUserName, getusername,
…。
以Java为例:
* 方法使用首字母小写的驼峰命名法:getStudentSchoolType
* 方法参数使用首字母小写的驼峰命名法:setSchoolName(String schoolName)
- 使用有意义的方法参数命名,这样做可以在没有文档的情况下尽量做到“自解释(documentate itself)”
总之,命名问题只是整个编码规范中的一小部分,但是起的作用举足轻重,它是判断一个程序员是否专业的必要标准。
10,爱因斯坦英语版
感谢相对论下,爱因斯坦成为20世纪最有名的科学家。 1905年,而在瑞士专利局工作的爱因斯坦发表了一篇论文,提出了“狭义相对论”,一个突破性的概念奠定了基础许多现代物理学理论。 (该理论包括了著名的方程E = mc能量²。)爱因斯坦的工作有一个从量子理论核能和原子弹的一切产生深远的影响。他继续发展和完善他早期的思想,并于1915年发表了一篇他的广义相对论众所周知的。到1920年是国际著名的爱因斯坦,他1921年获得了诺贝尔奖,为相对论,而是为他1905年对光电效应工作。爱因斯坦在1933年搬到新泽西州普林斯顿,在那里他曾在高级研究学院,直到他生命的尽头。爱因斯坦的天才往往比牛顿说,2000年时代杂志任命他为20世纪的领导人物。
Thanks to his theory of relativity, Albert Einstein became the most famous scientist of the 20th century. In 1905, while working in a Swiss patent office, Einstein published a paper proposing a "special theory of relativity," a groundbreaking notion which laid the foundation for much of modern physics theory. (The theory included his famous equation e=mc².) Einstein's work had a profound impact on everything from quantum theory to nuclear power and the atom bomb. He continued to develop and refine his early ideas, and in 1915 published what is known as his general theory of relativity. By 1920 Einstein was internationally renowned; he won the Nobel Prize in 1921, not for relativity but for his 1905 work on the photoelectric effect. In 1933 Einstein moved to Princeton, New Jersey, where he worked at the Institute for Advanced Studies until the end of his life. Einstein's genius is often compared with that of Sir Isaac Newton; in 2000 Time magazine named him the leading figure of the 20th century.
11,springboot怎么配置velocity.properties文件
一般来说。我们会将一些配置的信息放在。properties文件中。然后使用${}将配置文件中的信息读取至spring的配置文件。那么我们如何在spring读取properties文件呢。1.首先。我们要先在spring配置文件中。定义一个专门读取properties文件的类.例: classpath*:jdbc.properties
12,struts2中使用了velocity模块有什么作用
1.Struts2中的Velocity中文乱码的处理方式:
因为在Velocity-1.4.jar中的org.apache.velocity.runtime.defaults中定义的velocity.properties中定义的input.encoding=ISO8859-1,output.encoding=ISO8859-1,通常最好在VM文件中使用%{getText(‘’)}调用国际化资源文件的内容就不会产生乱码。
2.Velocity的vm文件必须要经过Action才可以访问,以便被程序解析,不可以直接访问vm文件。
3.在vm文件中使用Struts2的标签只需要在原有标签前加#s就可以了,参数之间使用””分隔!
13,地震等级是怎样测定的?
测定方法上,地震参数是用不同方位、不同距离的多个地震台站的记录进行测定;理论上,所用地震台站的记录越多,测定的地震参数越准确。地震发生后,地震波在地球内部以大约6.5公里/秒的速度转播,也就是说地震波从震源到地震台的传播是需要时间的。但从地震救援角度,需要在最短时间内把地震发生的时间、地点和震级报告政府并向公众发布。
根据地震数据处理规定,地震参数测定分两个阶段:一是地震速报,使用最先接收到地震台站的观测数据进行快速地震参数测定,并及时发布地震信息;二是精细分析,即利用所有收集到的地震台站记录进行地震参数的进一步分析,给出最终修订结果。大多情况下,地震速报参数和修订参数有一定差异
目前在国际上,地震参数的测定分两个过程,一是计算机自动测定与人机交互快速测定,二是最终的修订。前者是在地震发生后,计算机数据处理系统会给出自动处理结果,并通过网站、手机短信的途径发布地震信息,随着地震台站数据的不断增加,测定的地震参数也在不断地变化;后者是待所有地震台站的资料收集以后,给出最终地震参数,编辑出版地震观测报告。
14,地震震级的测定方法
地震震级 M ,用地震面波质点运动最大值 (A/T)max 测定,(度)。计算公式为:M=lg(A/T)max+ σ ( Δ )式中: A ---- 地震面波最大地动位移,取两水平分向地动位移的矢量和,μ m ;T ----相应周期, S ;Δ----震中距, ( 度 ) 。测量最大地动位移的两水平分量时,要取同一时刻或周期相差在1/8周之内的震动。若两分量周期不一致时,则取加权和:T=(T N ×A N +T E× A E )/(A N +A E )式中: A N ------ 南北分量地动位移,μ m;A E ------ 东西分量地动位移,μ m;T N ------ A N 的相应周期, S ;T E ------ A E 的相应周期, S ;量规函数σ ( Δ ) 为:σ ( Δ )=1.66lg Δ +3.5不能使用与表一中给出的值相差很大的周期来测定地震震级 M 。地震震级 M 应根据多台的平均值确定。中国使用的震级标准,是国际上通用的里氏分级表,共分9个等级,在实际测量中,由于其与震源的物理特性没有直接的联系,因此多用矩震级来表示。 社会应用,应以国务院地震行政主管部门认定的地震震级 M 为准。表一 不同震中距(Δ)选用地震面波周期(T)值Δ/º T/s Δ/º T/s Δ/º T/s2 3~6 20 9~14 70 14~224 4~7 25 9~16 80 16~226 5~8 30 10~16 90 16~228 6~9 40 12~18 100 16~2510 7~10 50 12~20 110 17~2515 8~12 60 14~20 130 18~25