Java代码的风格为什么这么“糟糕”?
本帖最后由 shimachao 于 2014-03-12 15:26:52 编辑
小弟初学java SE,是在不明白为什么代码风格都是这样的:
1 括号位置的问题
void func(){
//...
}
而不是这样
void func()
{
//...
}
//前者不好确定一个语句块的范围。也许因为我之前学的是C++,所以不适应。
2. 类的定义和实现在一起,看起来很糟糕。类提供的接口看起来不清晰。C++提倡的把类的定义和实现放在不同文件中,类的定义看起来很清晰。
3. 还有匿名类的设计,完全违背软件工程原则。该出现一个变量的地方,居然出现一个类的定义。如果这个类有点大,代码顿时变的看不懂了。
能告诉我为什么会这样吗?难道这背后有什么哲学,告诉我吧,让我早的接受。
------解决方案--------------------定义风格是为了让整体统一,方便查看,如果风格各异,后面维护的会比较麻烦和费时间,没必要纠结。
每种语言都有自己的定义和规则,不能说哪种就一定好!
反正就是,想开点,学会接受新事物
------解决方案--------------------自己喜欢,明白就行。很多公司风格都不一样。你可以自己做格式化模板。
------解决方案--------------------第一个个人认为没有本质的区别,但是在Java领域都是这么写,那么尽量适应吧
第二个,Java里面也可以分文件,就是Java里的interface
第三个,和C里的,goto一样,你可以不用..
------解决方案--------------------1、要找第3行结束的块的开始,找到的就是1,但是找第8行结束的块的开始,就有5和6两行。
(这是很蛋疼的理由,实际上和楼上各位的解释差不多,
有规定按规定,没规定按常理,没常理...自己爽就行了)
2、c++我不太懂,不过,C++即便是分开定义,那么定义实际的类的时候,也要有个名字吧?
比如一个定义里写了abc方法
public void abc();
,那么实际内容的文件里,还是要写
public void abc(){
xxxx
}
那么,这个public void abc()字符串就在多个地方(至少是2个文件里)定义,
反而会增加出错的概率吧?
C++我不太...根本就不懂,大家讨论讨论
另外,3楼朋友说的java里的接口(interface),
虽然形式上看起来和你所了解的"C++提倡的把类的定义和实现放在不同文件中"一致,
但是,接口还有着另外的作用,
比如“定义和约束行为”等作用。
这方面LZ多接触接触底层库的代码就有感觉了
3、实际上这个匿名类就不是为了实现“有点大”的类。
如果要实现一个“有点大”的类,
就不要用匿名类,直接定义个单独的类,
然后把需要操作的“宿主”的对象传递给这个单独的类就行。
对于这个,概念上类似jsp和servlet的感觉
简单的处理,可以放在jsp里完成
复杂的处理(相对的就是lz说的“有点大”的类)就不要放在jsp里了,
而是要把处理的代码放到servlet里处理
大概其就是我的理解吧
欢迎拍砖
good luck
------解决方案--------------------C++里的内联函数和模板也需要和类一起放在头文件里呢?这样就清晰了吗?
至于花括号放在同一行还是下一行得看自己习惯吧,放在同一行的优势是可以使代码更紧凑。
匿名类可以在创建的时候同时继承一个类,这样就可以用于实现像C++里回调的作用(Callback),比如Button可以添加一个ActionListener来相应操作,如果这个操作比较简单那么直接new一个匿名类实现actionPerformed方法就行了,而不必重新定义这个ActionListener的子类。这里ActionListener接口中只有一个方法,在Java 8里还可以使用Lambda表达式(http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html),匿名类则可以用于一个接口或类中有2个或多个方法的时候。
顺便说下C++和Java有本质的区别,一个是静态的,另一个是动态的。
------解决方案--------------------楼主明显是C++过来的,java的风格都是这样的,习惯就好了.
------解决方案--------------------典型c语言转java不适应,适应就好了
------解决方案--------------------我也奇怪,为什么他们美国人的姓放在后面
------解决方案--------------------个人习惯和公司规定,这有什么可说的
------解决方案--------------------我就喜欢用第二种!
不过,还是第一种用的人多吧!
每个公司里应该会有自己的规范的!
------解决方案--------------------习惯第一种用eclipse格式一下就好了,我习惯第二种,格式化一下也成了第一种。。。。。。。。所以我在慢慢改回第一种。。。。。。。
------解决方案--------------------
风格的问题慢慢适应吧!
也许换一家公司就要换一种写代码的风格呢!
------解决方案--------------------用第二个也可以的,个人认为第二个能使层次更分明
------解决方案--------------------我到时感觉这个很爽的,但是学了C,然后用eclipse过后,在到VC里面写C程序,感觉大括号就不习惯了。人有所好吧
------解决方案--------------------1:那样你的代码会少很多行 看起来更加简洁 至于你说的不好确定一个语句块 我真没看出来为什么不好确认。
2::java中也有接口跟实现类的写法
3:匿名内部类用的很少,一般不会用,特殊情况才用
------解决方案--------------------第一种在 这种在连续多个程序块中 会显的紧凑。
而
如果要用第二种。程序块多时,就会然你感觉到很散,会让人感觉到代码很长。如果你的一个类中的一个方法中有一连很多连续的这样的程序块,那结果就是这个程序块占了太长的空间。整个文件显的很乱。查看下面的代码就要那好长得进度条。
------解决方案--------------------编程空余时间可以看看Java Code Conventions,然后就明白了。
------解决方案--------------------第一条没什么说的,我见过怎么写的都有,跟语言没关系。我自己写C++的话也是和你说的Java一个写法。自己看着顺眼,公司允许就OK
第二条,C++这么做不是因为代码风格,而是它的规范使得它不得不这么做。在你的函数体引用一个函数的时候,它的定义首先要存在。所以C++只能把类定义单独写出来,你的所以函数实现中才可以引用它。第二个原因,制作动态链接库(DLL,so之类)的时候,必须有一个头文件让编译器找到相关函数的定义,再在库中寻找接入点,
Java中函数实现可以直接引用还没有定义的函数(当然在后面有定义),包括静态函数。Java的Jar包(相当于库)自带了所有的索引信息,即函数定义,所以Java不需要头文件。
事实上你觉得有头文件不繁琐么?Java有各种强大的编译器,你想只看函数定义的话,最多按一个组合键就行了,有些甚至直接摆在编辑窗口旁边你点谁就看谁。
第三条,匿名类是Java8之前Java仅有的类似函数式编程的语言特性(lambda的模拟),C++根本没这个功能(至少我学的时候还没有)。如果你觉得这种形式看着晕,一是因为你还没有适应,二是因为你看的代码没写好。
------解决方案--------------------代码风格是便于以后维护时能更好的阅读!慢慢就习惯了,我已经学习的时候也是那样的。
------解决方案--------------------这个看习惯了,你那样写也是可以的,不过也要看公司规范了
------解决方案--------------------在eclipse里面可以改为第二种格式的,需要设置代码风格