关于编程风格??
首先,编程风格并不同于其他的style,目的并不是形成自己独树一帜的风格,而是为了让你的程序易读,有利于团队合作以及别人帮你改错。
风格是通用的
C语言和C++语言的编程风格(Java见下)
第一章:缩进格式
Tab是8个字符,于是缩进也是8个字符.有很多怪异的风格,他们将缩进格式定义为4个字符(设置为2个字符!)的深度,这就象试图将PI定义为3一样让人难以接受.
理由是:缩进的大小是为了清楚的定义一个块的开始和结束.特别是当你已经在计算机前面呆了20多个小时了以后,你会发现一个大的缩进格式使得你对程序的理解更容易.
现在,有一些人说,使用8个字符的缩进使得代码离右边很近,在80个字符宽度的终端屏幕上看程序很难受.回答是,但你的程序有3个以上的缩进的时候,你就应该修改你的程序.
总之,8个字符的缩进使得程序易读,还有一个附加的好处,就是它能在你将程序变得嵌套层数太多的时候给你警告.这个时候,你应该修改你的程序.
第二章:大符号的位置
另外一个C程序编程风格的问题是对大括号的处理.同缩进大小不同,几乎没有什么理由去选择一种而不选择另外一种风格,但有一种推荐的风格,它是Kernighan和Ritchie的经典的那本书带来的,它将开始
的大括号放在一行的最后,而将结束大括号放在一行的第一位,如下所示:
if(xistrue){wedoy}
然而,还有一种特殊的情况:命名函数:开始的括号是放在下一行的第一位,如下:
intfunction(intx){bodyoffunction}
所有非正统的人会非难这种不一致性,但是,所有思维正常的人明白:(第一)K&R是___对___的,(第二)如果K&R不对,请参见第一条.(:-))......另外,函数也是特殊的,不一定非得一致.
需要注意的是结束的括号在它所占的那一行是空的,__除了__它跟随着同一条语句的继续符号.如"while"在do-while循环中,或者"else"在if语句中.如下:
do{bodyofdo-loop}while(condition);
if(x==y){..}elseif(x>y){...}else{....}
理由:K&R.
另外,注意到这种大括号的放置方法减小了空行的数量,但却没有减少可读性.于是,在屏幕大小受到限制的时候,你就可以有更多的空行来写些注释了.
第三章:命名系统
C是一种简洁的语言,那么,命名也应该是简洁的.同MODULE-2以及ASCAL语言不同的是,C程序员不使用诸如ThisVariableIsATemporaryCounter之类的命名方式.一个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章:注释
注释是一件很好的事情,但是过多的注释也是危险的,不要试图区解释你的代码是注释如何如何的好:你应该将代码写得更好,而不是花费大量的时间去解释那些糟糕的代码.
通常情况下,你的注释是说明你的代码做些什么,而不是怎么做的.而且,要试图避免将注释插在一个函数体里:假如这个函数确实很复杂,你需要在其中有部分的注释,你应该回到第四章看看.你可以写些简短的注释来注明或警告那些你认为特别聪明(或极其丑陋)的部分,但是你必须要避免过多.取而代之的是,将注释写在函数前,告诉别人它做些什么事情,和可能为什么要这样做.
第六章:你已经深陷其中了.
不要着急.你有可能已经被告之"GUNemacs"会自动的帮你处理C的源代码格式,而且你已经看到它确实如此,但是,缺省的情况下,它的作用还是不尽如人意(实际上,他们比随便敲出来的东西还要难看-ainfinitenumberofmonkeystypingintoGNUemacswouldnevermakeagoodprogram)
于是,你可以要么不要使用GUNemacs,要么让它使用sanervalules.使用后者,你需要将如下的语句输入到你的.emacs文件中.(defunlinux-c-mode()"CmodewithadjusteddefaultsforusewiththeLinuxkernel."(interactive)(c-mode)(c-set-style"K&R")(setqc-basic-offset8))
这会定义一个M-xLinux-c-mode的命令.当你hacking一个模块的时候,如何你将-*-linux-c-*-输入在最开始的两行,这个模式会自动起作用.而且,你也许想加入如下
(setqauto-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个字符).
"缩进"有很多功能,特别是当它建议你重新格式你的代码的时候,你应该看看帮助.但要记住:"缩进"不是风格很差的程序的万灵丹.
JAVA编程风格简析
很久以来都在体会着JAVA的风格,现在做一简单陈述,希望大家多提宝贵意见。
对于一种好的编程语言,学习它的编程风格是很重要的。每种语言都有自己的编写和注释约定,当然所有语言都建立在最基本的约定之上。编程中最重要的并不是让代码按自己希望的方式运行,而是程序中那种自明的编程风格(这对于程序员的益处相信众多程序员都身有体会)!但这还不够,程序还应该具有可读、相对持久和可维护性。可读性非常重要,因为你不希望自己以前的作品在之后的阅读中给自己留下障碍,当然,更重要的是自己的程序能让其他程序员读懂并且修改。
下面我把工作中所理解的java风格做一简单总结,这是我所理解的好的编程风格和应用中我们应当如何使用java编写自己的代码的小Guide。这并不完全,希望大家帮我陆续总结各自的经验。
一般性概述
好的编程风格固然重要,但是你一定听说过一些程序员的个人风格。其实我们完全不必为那些所谓条条框框所累,但是作为原则是我们至少不能打破这些常规。我们应该在保持自己风格的同时尽量的把自己与编程潜原则靠拢。
可读性很容易达到,比如,让自己的代码缩排排列、名字采用描述性但不要过长(短名应仅仅用在非远程)、特殊名称比如pi应当被定义为final类型。模块性是编程需要注意的另一重点,把代码划分到类里,在类中把功能划分到方法中,别让一个类太大,否则在使用、修改和理解上都会造成不必要的麻烦,方法也一样,如果一个方法长度超过50行,它产生错误的概率将接近100%,尽量把大方法划分为小方法,编程中为避免重复编写,还应尽量调用JAVA标准类库。
尽量避免在写代码和注释时使用不同语言,经常见到论坛有朋友询问诸如在java中调用c、调用php、调用shell之类的问题,其实在编程中,我们应尽量使用一种语言去完成事情。另外就是不必最优化自己的代码,应该选择相对较优的算法就可以了。
类、方法和fields
类应体现出某种物质的基本概念,比如要编程实现“汽车”的组成,那么所有的汽车都可以用类Car实现。这个类应当包括域描述、属性描述和car的状态(color,numberofdoors,age等)和由car可完成的操作(getColor,setColor等)。为了提高类的可重用性,不要在类中有过多的描述,当然这也会增加错误产生的机会。
类名首字母大写,比如Date,String,Hashtable等......
类如下定义:(未使用Javadoc做注释):
publicclassCar{
/*Instancevariablesareplacedeitherinthebeginning
orattheendoftheclass*/
privateintage;
privateColorcolor;
/*Theconstructorshouldbeplacedinthebeginning*/
publicCar(intage,Colorcolor){
this.age=age;
this.color=color;
/*Examplemethod*/
publicintgetAge(){
returnage;
/*Themainmethodisoptional,butlookslikethis.
Ifitexists,itiseitherthefirstorthelast
methodintheclass*/
publicstaticvoidmain(String[]args){
注意类名和大括号间的空格!
方法一般定义为public。当然,如果方法仅仅在当前类用到可以定义为private,而如果希望一个子类沿用这个方法则不同,这时候的方法应定义为protected。
java中的方法定义很有趣,它们一般小写字母开头,如果有两个字组成,第二个字的首字母则大写。因此名字的描述性是至关重要的。这使你不用阅读整篇代码来判断这是一个什么方法。在给自己的方法取名时应尽量不要太短或者太长,另一个需要注意的是大多方法使用动词(动宾短语)。
publicvoideat(){}
publicvoideatBananas(){}
Selector(选择器)方法有get前缀,后缀是它们将要get的,比如
publicintgetBananas(){}
Mutator(存取器)方法则有set前缀,后缀则是他们要set的,比如
publicvoidsetBananas(intamount){}
注意mutators大多无返回值。
方法的参数应当以如下方式给出:
publicvoidaMethod(typeparameter1,typeparameter2,...,typeparametern){}
如果参数过长,也可以断开为几行,应对齐向下排列如:
publicvoidaMethod(typeparameter1,typeparameter2,...,
typeparametern,typeparametern+1,...,
typeparameterm,typeparameterm+1){}
另外要注意类的左束括号应在方法的右束括号之后而非下一行:
publicintaMethod(){
inti=0;
if(i==0)
System.out.println("success!");
为了文件可读性好,还要注意语句最好写在同一行,当然一行写不下是可以断行的,比如行字母超过80。
fields
比如变量,如果不希望它永久有效,应设为private。如果一个变量在类中不发生任何动作(比如数据结构中的node)则可以设置为public,常量一般声明为public。如果不能确定一个变量到底该声明为什么,应暂且声明为private。
field的名字一般使用小写字母,不要使用下横线或其他特殊字符。如果变量包含两个字,那么第二个字的首字母大写。比如:
inti,j,k;
Datedate;
doublemyField;
常量一般全部大写,也可以包含下横线:
publicstaticfinalintMAX_SIZE_OF_DATABASE
fields的名字通常为名词。较重要的fields更应具备描述性,比如程序中包含一个游戏的得分,那可以用score来代表。如果变量变化较频繁,那使用一个单一字符来代表就ok了:
i,j,k通常代表整数
r,t,u,v,w通常代表实数
x,y,z通常是并列出现或代表浮点数
s,s1,s2,通常代表字符串
c,ch通常代表字符
f,file通常代表文件
tmp,temp通常代表临时变量
ctr,cnt,cntr一般代表计数器(如果i,j,k这些变量已被使用)
dummy,foo,bar一般代表哑元变量
args是main-method的主参数名
缩排与换行
每行长度不得超过80字符。如果需要可以折行时,也应当与上一行有共同的缩排距离。代码应如何交错、如何建立新行、在哪里建立允许、哪里不允许都有一些一般约定,缩排空格一般为2个或4个空格。
条件表达式
如果见到如下语法表达式:
if(expr)
statement1;
statement2;
代码行向右错排两个空格如上所示。
如果在一个表达式中有超过一条的声明,则需要大括号:
if(expr){
statement1;
statement2;
}else{
statement3;
statement4;
有时我们会希望在表达式中使用表达式(比如条件嵌套),这时应注意else表达式,它的位置很容易出错!如例:
if(expr1){
statement1;
statement2;
}elseif(expr2)
statement3;
elseif(expr3){
statement4;
statement5;
}else{
statement6;
statement7;
注意大括号位置!
Loops
while-loop语法如下:
while(expr){
statement1;
statement2;
for-loop语法如下:
for(expr1;expr2;expr3){
statement1;
statement2;
注意大括号位置!仅一条声明时大括号省略:
while(expr)
statement;
for(expr1;expr2;expr3)
statement;
例如,我们写一个procedure写出1到10这十个数字:
for(i=1;i<=10;i++)
System.out.println(i);
try-catch语法形如:
statements;
}catch(ExceptionClasse){
statements;
如果try-catch语句后跟随finally子句则形如:
statements;
}catch(ExceptionClasse){
statements;
}finally{
statements;
每一行最好只阐述一件事情。比如,一行包含一个声明、一个条件语句、一个循环等。不论多小,最好不要一行办两件事及以上。例如不要把一个if表达式或循环语句的主体放置在同一行,这样的表达式断行的易读性会更高。通常,互相协作的代码应放在一起,为保证代码美观可读,我们应将代码的不同代码段放置在不同的段落。不过要牢记断行不要太过分!比如:
publicintfactorial(intn){
intresult=1;
for(inti=1;i<=n;i++)
result*=i;
returnresult;
给自己的代码加入注释
注释就是类的描绘、方法存在的原因、它完成了什么以及它对它其中(变量)的作用域。假定阅读你代码的人已经知道这是什么语言,所以不需要注释语句功能,尽量使用简短而有描述力的注释。
Java有两种类型的注释:
//Thisisacommentthatcontinuesuntiltheendoftheline.
/*Thisisacomment.Itgoesonandonandonandonandonandonandon
andonandonandonandonandonandonandonandonandonandonand
onandonandonandonandonandonandonandonandendslikethis:*/
*ThisisaJavaDoccomment.MoreaboutJavaDocinthenextsection.
如果在注释中加入注释则会出错:
/*Youarenotallowedtodoanythinglikethis/*becausethecompilerwill
complain,ifyouarelucky*/DONTDOTHIS!Anddontwritecommentsin
uppercaseeither...*/
注释应放在它要解释内容上下,这样会让代码更易于理解。
不要注释一些语言的语句功能:
i++;//Add1toi
更不要让自己的代码处于这种状态:
for(inti=1;i<=n;i++)
/*dontplacecommentswhere
theydontbelong*/
result*=i;
较短的注释既可被放在被注释代码上下,而长注释则习惯性的放在代码之上:
/*Commentscanbeplacedbeforethe
blockthatistobecommented*/
for(inti=1;i<=n;i++)
result*=i;
for(inti=1;i<=n;i++){
result*=i;//shortcommentscanbeplacedlikethis
tmp++;//ifnecessary,theycontinuehere
不要写没用的注释:
i++;//changethislater
Excuseme,这句肯定是胡扯!
不要写自己都看不懂的注释:
i++;//BMW
BMW?如果你能连续十天记住这是什么意思的话,那么你的记忆真是不错了。所以不要写没人能看懂的注释,ok?
最后重申一下:写简短而富于描述性的注释,把它们放在该放的地方,而不要考验你自己的记忆力!
JavaDoc-文档工具
JavaDoc不仅是另一种给代码加注释的仿佛咱,更是一个文档工具。类、方法和一些重要地方需要用JavaDoc来注释。这并不是说你可以放弃常规的注释,这两者在代码中应该是相辅相成、互相弥补的关系。
类被注释如:
*Carrepresentscars...Adescriptionoftheclass
*shouldbeplacehere.Notethatthedescriptionbegins
*onthesecondlineandthatthereisaspacebetween
*theasterixandthetext.Nextwewilladdsomefields
*indicatingwhotheauthorsoftheclassareand
*otherusefulinformation.Noticethenewline!
*@authorJerryMeng
*@version%I%,%G%
publicclassCar{
注意JavaDoc结束和类开始间无空行。
方法被注释如:
*Adescriptionofwhatthemethoddoes...
*@paramnadescriptionoftheparameter
*@returnadescriptionofthereturnvalue
publicintfactorial(intn){
某些不是全部,被JavaDoc注释区域如:
*Shortdescriptionofthevariable(oneline)
typevariable;
什么应当使用JavaDoc做注释?如何注释的恰当呢?
可以这样想,JavaDoc中所作的注释都可以在类的文档中看到。所有读这个类的文档的读者都会明白这个类所完成的功能、它包括的方法、如何使用这些方法及方法的返回值。一些作用域,比如public的变量或常量将会一目了然。任何不了解这个类内部结构的人都可以轻松的调用它。这便是你用JavaDoc可以轻松提供的信息。而使用一般注释的地方,一般是给那些可能修改你的类代码的程序员,它们一般描述了类的内部信息和结构。
下面我写一下car的类来描述一个编程风格好的java类应该是怎样的。当然这仅仅是一个小例子(apartfromselectorandmutatormethods),仅仅是在考虑JAVA编程风格上一个参考而已。
importjava.awt.Color;
*Thisisaclassrepresentingcars.Acarhascertainfeatures,such
*ascolor,age,numberofdoorsetcandacarcanberepainted,
*thetankcanbefilledetc.
*@authorJerryMeng
*@version%I%,%G%
publicclassCar{
*Themaximumsizeofthetankinlitres.
privatestaticfinaldoubleTANK_SIZE=100.0;
*Thecolorofthecar.
privateColorcolor;
*Theageofthecar.
privateintage;
*Thenumberofdoorsofthecar.
privateintdoors;
*Theamountofgasolineinthetank.
privatedoublegasoline;
*Classconstructor,whichconstructsabrandnew,blackcarwith
*fivedoorsandafulltank.
publicCar(){
this(Color.black,0,5,TANK_SIZE);
*Classconstructorspecifyingthecolor,age,numberofdoors
*andlitresofgasoline
*@paramcolorThecolorofthecar
*@paramageTheageofthecar
*@paramdoorsThenumberofdoors
*@paramkmKilometresdriven
*@paramgasolineThelitresofgasoline
publicCar(Colorcolor,intage,intdoors,doublegasoline){
this.color=color;
this.age=age;
this.doors=doors;
this.gasoline=gasoline;
*Returnsthecolorofthecar
publicColorgetColor(){
returncolor;
*Repaintsthecar(i.e.changesitscolor)
publicvoidsetColor(Colorcolor){
this.color=color;
*Returnstheageofthecar
publicintgetAge(){
returnage;
*Returnsthenumberofdoorsofthecar
publicintgetDoors(){
returndoors;
*Returnstheamountofgasolineinthetank
publicdoublegetGasoline(){
returngasoline;
*Fillsthetank.Theamountofgasolinecannotexceed
*thesizeofthetank.Inthatcase,thetankwillbe
*filledtothemaximumandtherestwillrunoutin
*thesand.
*@paramgasTheamountofgasolinetoputinthetank
publicvoidsetGasoline(doublegas){
if(gasoline+gas<=TANK_SIZE)
gasoline+=gas;
gasoline=TANK_SIZE;
现在比较流行的拍照风格都有哪些
一、最近拍照流行什么风格
1、小清新
大家一般印象里都会觉得小清新风格是最好拍的,看起来比较日常感,造型穿着学生装、休闲装比较多,所以通常被认为是最保险的,不会错的风格,但其实也并不是所有人都适合它的。拍摄以校园、居家环境或者城市街道为主,看上去非常的清淡,不会让人有沉闷的感受。
拍摄取景以大片的植物为主,营造一种置身于森林的感觉。通常比较少体现城市风景,包括现代建筑、街道、居室等等。森系摄影体现出一种天人合一的美,很注重营造梦幻浪漫的感觉,模特的造型一般偏华丽些,头饰也较为精致。
3、复古风
给人的感觉是有韵味,拍出来显得人旧美旧美的。复古风人像的服装和造型上往往较为有辨识度,使得很多人以为只要在服装和拍摄背景上注意了,就很容易拍出来,而其实呢,复古风在人物的神态,拍摄者的想法和技巧等方面,需要更加注重对细节的把握。
4、情绪人像
适合文艺青年们使用的拍照风格,比较注重模特的神态,相对来说,服装、造型一般不需要很精美,通常比较简洁些。
5、都市风
都市风造型上以时装以及家居服装为主,主要展现都市生活中的风采,比起前几种来,都市风这几年不是很流行了,原因我想和都市风的格调和适合的人群比较有局限性有关,都市风人像一般以比较成熟的形象或者职场形象为主,其他风格的形象适用的就较少一点,拍摄经常会选择夜景,表现灯火阑珊的都市感。