z****e 发帖数: 54598 | 1 前面看到有人说写出来的代码让人一眼就看出是没有工作经验的
这个的确是有可能的,从我自身经验判断
一般来说,具备以下一个或几个特点的代码
会被认为是写java代码写不够多的人写出来的
1) 变量名和方法名首字母大写
这个是大忌,一般遇到了,不让过是很正常的
从某种意义上说,这个不是风格的问题
跟goto一样,其实是个错误
2) 命名中使用下划线
尤其是自定义的系统变量,喜欢用下划线开始
这说明程序猿喜欢介入系统内部实现
which正好是java不提倡的做法
java提倡非侵入式编程
也就是对于已经做好的东西,比如jvm
采用输入参数形式来tune
其次,对于具体对象的管理,采用反射等高级手段来做
直接介入系统内部实现,比如介入jvm内部实现
的方式,其实是不提倡,甚至可以说是禁止的
对于下划线的命名,能不用就不用
所以当你遇到了_myInstance的时候,嗯
3) static关键字的使用
能写出static方法是好事
说明你懂static是干什么的
但是多数时候,static其实并不是那么频繁滴被使用到
static的代码实现多数时候交给了框架去做
一般如果你要用static
建议单独搞一个类,然后在这个类的命名最后加上Util
比如MyApplicationUtil,这样就显得professional一点
static变量应该尽量避免
关于2和3,有一个特例,就是全局常量(不变的变量)的定义
比如public static final String BIG_COW = "goodbug";
这个时候你需要static变量和下划线,其它时候,最好不要了
4) 封装的意识
对于一个类,实现之后,看是否意识到实现了private和set/get方法
还是直接访问内部变量
这个是oop,set/get方法可以有很多理由
比如说,只实现get而不实现set,那么这就是read only
还有并发的时候,可以通过syncrhonized set/get方法来控制并发
等等
5)最后一个就是看对于各种类的使用
比如Hashtable,这个已经too old了
还有Vector这几个类,都已经old太久了
有新类能够替换这些类,所以如果你打算用java写代码
请躲开这几个“老”类
这几个细节,虽然说都是rule of thumb,都不难,稍微留意一下,都很容易避开
但是很有趣的是,往往是一些有其它语言经验的程序猿
比如写c++写得比较多的,转过来,会犯这些错误
所以有时候雇主更喜欢新人,白纸一张,可塑性很强
换编程语言的程序猿,会带来不少坏习惯
当然最理想的还是有相关经验的程序猿
只要能针对上诉五点,稍加练习,你的代码显得比较professional问题不大 |
p*****3 发帖数: 488 | 2 "方法名首字母大写"
Di yi tiao jiu gui le .... |
l*****a 发帖数: 14598 | 3 你不是转行的c++选手吗
【在 p*****3 的大作中提到】 : "方法名首字母大写" : Di yi tiao jiu gui le ....
|
d***n 发帖数: 832 | 4 我觉得一个主要原因是现在网上搜到的
面试题的解法大部分是在学校的同学写的
有工作经验的写code牛的如版上几位大牛
要么没时间,要么有时间公布的code也有限
在这种大环境下很容易走向学院派
这种code给有经验的面试官的印象都会比较差
觉得你就是刷题出来的,别的都不会
我顺便提一个学院派风格特点,就是变量名用单字母 |
z****e 发帖数: 54598 | 5 其实命名显得professional的话,java有一个超级容易的做法
List list = new ArrayList();
就算现实中,也不过是在list前面加点前缀罢了
List itemsList = new ArrayList();
搞定
【在 d***n 的大作中提到】 : 我觉得一个主要原因是现在网上搜到的 : 面试题的解法大部分是在学校的同学写的 : 有工作经验的写code牛的如版上几位大牛 : 要么没时间,要么有时间公布的code也有限 : 在这种大环境下很容易走向学院派 : 这种code给有经验的面试官的印象都会比较差 : 觉得你就是刷题出来的,别的都不会 : 我顺便提一个学院派风格特点,就是变量名用单字母
|
l*****a 发帖数: 14598 | 6 你这个不是老版本吗
【在 z****e 的大作中提到】 : 其实命名显得professional的话,java有一个超级容易的做法 : List list = new ArrayList(); : 就算现实中,也不过是在list前面加点前缀罢了 : List itemsList = new ArrayList(); : 搞定
|
z****e 发帖数: 54598 | 7 新版本是啥样?
【在 l*****a 的大作中提到】 : 你这个不是老版本吗
|
z*********8 发帖数: 2070 | 8 为啥方法不能开头大写?
变量倒是都是小写字母开头 |
z****e 发帖数: 54598 | 9 rule of thumb
变量名大写开头一样可以编译通过
但是便于他人阅读
大写开头留给最重要的Class
没有任何一个东西重要性超过类本身
没有类就没有oop
【在 z*********8 的大作中提到】 : 为啥方法不能开头大写? : 变量倒是都是小写字母开头
|
D****3 发帖数: 611 | 10 呵呵 学术派最大的问题就是写的代码WET。。。如果能DRY 就成功了一半
还有安全性一直要考虑 适当的时候考虑可扩展性 但没必要premature optimization |
|
|
c*****a 发帖数: 808 | 11 顶zhaoce大大
code review时,code里面有static,人家一定问为啥要static,搞得我能不写static就不
写了 |
l*n 发帖数: 529 | 12 呵呵,自己写小程序的时候喜欢用static方法,那样main里面就不用instantiate对象
了。^^
【在 z****e 的大作中提到】 : 前面看到有人说写出来的代码让人一眼就看出是没有工作经验的 : 这个的确是有可能的,从我自身经验判断 : 一般来说,具备以下一个或几个特点的代码 : 会被认为是写java代码写不够多的人写出来的 : 1) 变量名和方法名首字母大写 : 这个是大忌,一般遇到了,不让过是很正常的 : 从某种意义上说,这个不是风格的问题 : 跟goto一样,其实是个错误 : 2) 命名中使用下划线 : 尤其是自定义的系统变量,喜欢用下划线开始
|
w**z 发帖数: 8232 | 13 with generic .
【在 z****e 的大作中提到】 : 新版本是啥样?
|
w**z 发帖数: 8232 | 14 it is code convention, just follow it.
http://www.oracle.com/technetwork/java/javase/documentation/cod
【在 z*********8 的大作中提到】 : 为啥方法不能开头大写? : 变量倒是都是小写字母开头
|
t***t 发帖数: 6066 | 15 来个美点的:
List stringList = new ArrayList<>(); |
w**z 发帖数: 8232 | 16 你这个Java 6 compile 过不了。
【在 t***t 的大作中提到】 : 来个美点的: : List stringList = new ArrayList<>();
|
z****e 发帖数: 54598 | 17 关键是我不知道往里面放什么
举例的时候
【在 w**z 的大作中提到】 : with generic .
|
g**e 发帖数: 6127 | 18 不如来点在java6也能用的语法糖
List strList = Lists.newArrayList();
【在 t***t 的大作中提到】 : 来个美点的: : List stringList = new ArrayList<>();
|
z****e 发帖数: 54598 | 19 记不住import的路径
对面阿三拿过去放到eclipse上
然后说,编译不通过
【在 g**e 的大作中提到】 : 不如来点在java6也能用的语法糖 : List strList = Lists.newArrayList();
|
t**********r 发帖数: 2153 | 20 最后一条是说加元素的类型吗?这还是看了所有的跟贴才有点事懂非懂的
【在 z****e 的大作中提到】 : 前面看到有人说写出来的代码让人一眼就看出是没有工作经验的 : 这个的确是有可能的,从我自身经验判断 : 一般来说,具备以下一个或几个特点的代码 : 会被认为是写java代码写不够多的人写出来的 : 1) 变量名和方法名首字母大写 : 这个是大忌,一般遇到了,不让过是很正常的 : 从某种意义上说,这个不是风格的问题 : 跟goto一样,其实是个错误 : 2) 命名中使用下划线 : 尤其是自定义的系统变量,喜欢用下划线开始
|
|
|
z****e 发帖数: 54598 | 21 差不多
它们说的是类似这种的做法
List list = new ArrayList();
但是问题在于,我不能确定里面的element一定是String
完全可以是其它的东西
有挨滴用了1.7的简写方式
List list = new ArrayList<>();
然后在纽约阿妈总的某个人物,举出了guava的类和方法
which是第三方google提供的类库
但是我不认为对于没有经验的人来说是必需掌握的
【在 t**********r 的大作中提到】 : 最后一条是说加元素的类型吗?这还是看了所有的跟贴才有点事懂非懂的
|
t**********r 发帖数: 2153 | 22 guava这个也不是standard的, 看过源码就知道其实就是拿API包裹了一行程序,真心
不觉得比原来的好到哪里去。
【在 z****e 的大作中提到】 : 差不多 : 它们说的是类似这种的做法 : List list = new ArrayList(); : 但是问题在于,我不能确定里面的element一定是String : 完全可以是其它的东西 : 有挨滴用了1.7的简写方式 : List list = new ArrayList<>(); : 然后在纽约阿妈总的某个人物,举出了guava的类和方法 : which是第三方google提供的类库 : 但是我不认为对于没有经验的人来说是必需掌握的
|
l********9 发帖数: 8 | 23 你说的只是代码的规范,一个好的SD在乎的是代码的质量和效率,我在的AGILE TEAM很
少在乎代码的规范化,我们甚至所有的APP都没有DOC, WEB SERVICE除外。你说的
GETTER/SETTER也只是NEWBIE的感觉,我还是比较喜欢用BUILDER FACTORY |
g**e 发帖数: 6127 | 24 guava,apache common之类lib在大量production code里应用是有原因的. 这个例子显
然没什么大不了的
【在 t**********r 的大作中提到】 : guava这个也不是standard的, 看过源码就知道其实就是拿API包裹了一行程序,真心 : 不觉得比原来的好到哪里去。
|
z****e 发帖数: 54598 | 25 你确定你清楚get/set跟factory或者builder之间的关系?
【在 l********9 的大作中提到】 : 你说的只是代码的规范,一个好的SD在乎的是代码的质量和效率,我在的AGILE TEAM很 : 少在乎代码的规范化,我们甚至所有的APP都没有DOC, WEB SERVICE除外。你说的 : GETTER/SETTER也只是NEWBIE的感觉,我还是比较喜欢用BUILDER FACTORY
|
z****e 发帖数: 54598 | 26 只是一个简单的factory pattern
但是又怕别人不懂factory,于是用了new而不是build
【在 t**********r 的大作中提到】 : guava这个也不是standard的, 看过源码就知道其实就是拿API包裹了一行程序,真心 : 不觉得比原来的好到哪里去。
|
l********9 发帖数: 8 | 27
不清楚,看过书好像是说提倡用builder?
【在 z****e 的大作中提到】 : 你确定你清楚get/set跟factory或者builder之间的关系?
|
z****e 发帖数: 54598 | 28 你们写的是什么?android?
【在 l********9 的大作中提到】 : : 不清楚,看过书好像是说提倡用builder?
|
A***o 发帖数: 358 | 29 骆驼大写这些好fix,差距最大还是design,OOP,翻几页就能看出来 |
l********9 发帖数: 8 | 30
POJO
【在 z****e 的大作中提到】 : 你们写的是什么?android?
|
|
|
g*****g 发帖数: 34805 | 31 我现在都这么写,用的guava。
List stringList = Lists.newArrayList();
【在 t***t 的大作中提到】 : 来个美点的: : List stringList = new ArrayList<>();
|
z****e 发帖数: 54598 | 32 现在连ejb都是pojo了
没有什么不是pojo
我问的是,你们的app是用来做什么的
【在 l********9 的大作中提到】 : : POJO
|
w**z 发帖数: 8232 | 33 guava collection 还是很handy 的。
【在 t**********r 的大作中提到】 : guava这个也不是standard的, 看过源码就知道其实就是拿API包裹了一行程序,真心 : 不觉得比原来的好到哪里去。
|
l********9 发帖数: 8 | 34
Web App, Web Services
【在 z****e 的大作中提到】 : 现在连ejb都是pojo了 : 没有什么不是pojo : 我问的是,你们的app是用来做什么的
|
z****e 发帖数: 54598 | 35 怎么实现的?
mvc都没有?
【在 l********9 的大作中提到】 : : Web App, Web Services
|
l********9 发帖数: 8 | 36 我说的BUILDER用于构造一个类,和design pattern有关系? |
l********9 发帖数: 8 | 37 ALTERNATIVE TO SETTER/GETTER |
s*****r 发帖数: 43070 | 38 builder pattern
【在 l********9 的大作中提到】 : 我说的BUILDER用于构造一个类,和design pattern有关系?
|
z****e 发帖数: 54598 | 39 问题在于setter/getter压根不是用作构造的
任何builder都跟dp有关系,人家起名时候就告诉你了
【在 l********9 的大作中提到】 : 我说的BUILDER用于构造一个类,和design pattern有关系?
|
w**z 发帖数: 8232 | 40 you can annotate pojo with a builder in Jackson for deserialization, pretty
useful.
【在 s*****r 的大作中提到】 : builder pattern
|
|
|
s*****r 发帖数: 43070 | 41 string没有meaning,最好用相近的英文词汇,比如employeeList,wishList,别人一
读就懂。
【在 t***t 的大作中提到】 : 来个美点的: : List stringList = new ArrayList<>();
|
z****e 发帖数: 54598 | 42 鉴于你是做web的
所以我尽量用你们的行话来说,便于你理解
mvc是你们web最常见的一个pattern
其中set/get是model的一部分
而你说的builder什么,其实更多的是controller在做
而不是model,无论是什么builder还是factory或者prototype或者其它任何一个构造模式
都可以造出包含有set/get的model,或者在构造模式里面,我们说这叫product,产品
而set/get本身,不是用来构造的,而是用来读取和设置attribute属性用的
是产品本身的动作,这两个互相之间并不冲突,更谈不上什么alternative
一般来说,我倾向于使用实体Builder/Factory类
而不是实体类内部自身就实现一个static build方法,除非是singleton
这样可以使得factory和product两者分离
代码更为清晰易懂,而不会造成像你现在这样的混乱
【在 l********9 的大作中提到】 : ALTERNATIVE TO SETTER/GETTER
|
s********k 发帖数: 6180 | 43 goto恰好是学院派的人不提倡,但是工业中大量应用,那个做系统的公司没有code用到
goto才怪
【在 z****e 的大作中提到】 : 前面看到有人说写出来的代码让人一眼就看出是没有工作经验的 : 这个的确是有可能的,从我自身经验判断 : 一般来说,具备以下一个或几个特点的代码 : 会被认为是写java代码写不够多的人写出来的 : 1) 变量名和方法名首字母大写 : 这个是大忌,一般遇到了,不让过是很正常的 : 从某种意义上说,这个不是风格的问题 : 跟goto一样,其实是个错误 : 2) 命名中使用下划线 : 尤其是自定义的系统变量,喜欢用下划线开始
|
a****n 发帖数: 1887 | 44 MVC 是web GUI的实现方式, 和具体web 内部的entity 没太大关系
MVC的M 一般是DTO, 只是struct, 而不是class
而 setter/getter 一般不会同时加到 variable, 否则你就得考虑你的class的
cohesion和coupling 是不是有问题。
模式
【在 z****e 的大作中提到】 : 鉴于你是做web的 : 所以我尽量用你们的行话来说,便于你理解 : mvc是你们web最常见的一个pattern : 其中set/get是model的一部分 : 而你说的builder什么,其实更多的是controller在做 : 而不是model,无论是什么builder还是factory或者prototype或者其它任何一个构造模式 : 都可以造出包含有set/get的model,或者在构造模式里面,我们说这叫product,产品 : 而set/get本身,不是用来构造的,而是用来读取和设置attribute属性用的 : 是产品本身的动作,这两个互相之间并不冲突,更谈不上什么alternative : 一般来说,我倾向于使用实体Builder/Factory类
|
a****n 发帖数: 1887 | 45 GOTO 其实是违反的过程式编程的原则
【在 s********k 的大作中提到】 : goto恰好是学院派的人不提倡,但是工业中大量应用,那个做系统的公司没有code用到 : goto才怪
|
b***n 发帖数: 15 | |
s***o 发帖数: 2191 | 47 这个才是正解。不然两星期后你自己都不知道写的啥。
【在 s*****r 的大作中提到】 : string没有meaning,最好用相近的英文词汇,比如employeeList,wishList,别人一 : 读就懂。
|
z****e 发帖数: 54598 | 48 您应该先确定一下您说的是不是java这个语言
set/get同时存在的不要太多,尤其是dto时候
没有set,hibernate等orm怎么放数据?
没有get就不用说了
【在 a****n 的大作中提到】 : MVC 是web GUI的实现方式, 和具体web 内部的entity 没太大关系 : MVC的M 一般是DTO, 只是struct, 而不是class : 而 setter/getter 一般不会同时加到 variable, 否则你就得考虑你的class的 : cohesion和coupling 是不是有问题。 : : 模式
|
z****e 发帖数: 54598 | 49 其他不敢说,但是java里面肯定不会有goto
cheers
【在 s********k 的大作中提到】 : goto恰好是学院派的人不提倡,但是工业中大量应用,那个做系统的公司没有code用到 : goto才怪
|
w*********m 发帖数: 4740 | 50 这都是基本要求呀。
另外命名最好不要用缩写。多看看goog的coding style 规范
类目用名词
多用@
少用synchronized的类
另外尽量用super class/interface传参数。比如用List不要用ArrayList, 尽管调用是
是ArrayList
【在 z****e 的大作中提到】 : 前面看到有人说写出来的代码让人一眼就看出是没有工作经验的 : 这个的确是有可能的,从我自身经验判断 : 一般来说,具备以下一个或几个特点的代码 : 会被认为是写java代码写不够多的人写出来的 : 1) 变量名和方法名首字母大写 : 这个是大忌,一般遇到了,不让过是很正常的 : 从某种意义上说,这个不是风格的问题 : 跟goto一样,其实是个错误 : 2) 命名中使用下划线 : 尤其是自定义的系统变量,喜欢用下划线开始
|
|
|
a****n 发帖数: 1887 | 51 从概念上来说 class 是 expose behavior, struct 是 expose data.
java 没有struct keyword, 但是java 里面struct 可以通过两种方式来实现,
1. setter/ getter
2. public memeber variable
hibernate mapping的是structs, 而不是class,
如果自己要写的struct直接用public variable更方便
【在 z****e 的大作中提到】 : 您应该先确定一下您说的是不是java这个语言 : set/get同时存在的不要太多,尤其是dto时候 : 没有set,hibernate等orm怎么放数据? : 没有get就不用说了
|
y*******g 发帖数: 6599 | 52 这个太无聊了 c++里面class和struct也完全一样啊。
一定要说template parameter只能用class和typename, 不能用struct当关键字就很无
聊了
【在 a****n 的大作中提到】 : 从概念上来说 class 是 expose behavior, struct 是 expose data. : java 没有struct keyword, 但是java 里面struct 可以通过两种方式来实现, : 1. setter/ getter : 2. public memeber variable : hibernate mapping的是structs, 而不是class, : 如果自己要写的struct直接用public variable更方便
|
t**********h 发帖数: 2273 | 53 老赵,太佩服你和sw*了
天天都有大坑出来
膜拜
【在 z****e 的大作中提到】 : 前面看到有人说写出来的代码让人一眼就看出是没有工作经验的 : 这个的确是有可能的,从我自身经验判断 : 一般来说,具备以下一个或几个特点的代码 : 会被认为是写java代码写不够多的人写出来的 : 1) 变量名和方法名首字母大写 : 这个是大忌,一般遇到了,不让过是很正常的 : 从某种意义上说,这个不是风格的问题 : 跟goto一样,其实是个错误 : 2) 命名中使用下划线 : 尤其是自定义的系统变量,喜欢用下划线开始
|
l******i 发帖数: 880 | 54 我觉得那个帖子讨论的学术派代码不仅仅是专门针对java,也不是仅仅是专门针对语法
而是很多逻辑上的优化、简洁吧?
【在 z****e 的大作中提到】 : 前面看到有人说写出来的代码让人一眼就看出是没有工作经验的 : 这个的确是有可能的,从我自身经验判断 : 一般来说,具备以下一个或几个特点的代码 : 会被认为是写java代码写不够多的人写出来的 : 1) 变量名和方法名首字母大写 : 这个是大忌,一般遇到了,不让过是很正常的 : 从某种意义上说,这个不是风格的问题 : 跟goto一样,其实是个错误 : 2) 命名中使用下划线 : 尤其是自定义的系统变量,喜欢用下划线开始
|
a****n 发帖数: 1887 | 55 这个不是语法的问题,是OOP概念上的问题, class 本身应该有高内聚/低耦合,
简单的例子, 比如Rectangle的面积, 一般create一个Rectangle的object,
1. setWidth, setHeight, 然后 double area = object.getArea()。
2. setWidth, setHeight, 然后 double area = object.getWidth() * object.
getHeight();
第二种方法内聚比第一种低很多. 一般在设计class 的时候更多的考虑他的behavior,
设计class 有个基本原则tell, don't ask. 也就是说告诉object去做什么, 而不是问
他detail的information.
所以一般来说一个type 同时有很多 getter/setter, 基本上不应该给他其他的
behavior, 而他仅仅充当一个 data 容器, 也就是struct, 反过来真正的class 一般
应该避免同时又setter/getter
而class可以有get, 而这个get 一般是抽象的,
比如父类vehicle.getPowerPercent(). 其子类实现不同的getPowerPercent(), 可以是
gas/electric/..
【在 y*******g 的大作中提到】 : 这个太无聊了 c++里面class和struct也完全一样啊。 : 一定要说template parameter只能用class和typename, 不能用struct当关键字就很无 : 聊了
|
m***i 发帖数: 2480 | 56 Lists.newArrayList()
【在 z****e 的大作中提到】 : 其实命名显得professional的话,java有一个超级容易的做法 : List list = new ArrayList(); : 就算现实中,也不过是在list前面加点前缀罢了 : List itemsList = new ArrayList(); : 搞定
|
s******n 发帖数: 793 | 57 用Checkstyle 检查,不通过就没法 verify就好了,写几天就习惯勒 |
l******n 发帖数: 9344 | 58 goodbug江湖地位真高呀,全局静态大牛
【在 z****e 的大作中提到】 : 前面看到有人说写出来的代码让人一眼就看出是没有工作经验的 : 这个的确是有可能的,从我自身经验判断 : 一般来说,具备以下一个或几个特点的代码 : 会被认为是写java代码写不够多的人写出来的 : 1) 变量名和方法名首字母大写 : 这个是大忌,一般遇到了,不让过是很正常的 : 从某种意义上说,这个不是风格的问题 : 跟goto一样,其实是个错误 : 2) 命名中使用下划线 : 尤其是自定义的系统变量,喜欢用下划线开始
|
z****e 发帖数: 54598 | 59 如果图方便的话,hello world java肯定不如c方便
显然public member在很多时候有明显的缺陷
比如并发的时候,当然自己写的app的话就不需要考虑那么多了
any way,你扣概念木有什么意思,你说的struct就是简单的set/get包装的一个entity咯
表告诉我说entity只有web才有,ejb以前还有entitybean
你说的dto模式,经常被人一捅到底
从web捅到persistence,然后再拔出来
如果你要每一层都做一个值传递的话,会显得效率很低
所以一般只要是同一台jvm,我们就采用同一个set/get实体
而不是拆成一层一层独立的实体,然后互相之间挨个set(get())
当然理论上后者更正确
从mvc上说,model指的就是你说的struct,而不是什么构架层面的东西
每一个模块都要实现自己的mvc,struts里面的action和service都是controller
而struct这个在不同层面有不同的叫法,甚至还有你说的dto
【在 a****n 的大作中提到】 : 从概念上来说 class 是 expose behavior, struct 是 expose data. : java 没有struct keyword, 但是java 里面struct 可以通过两种方式来实现, : 1. setter/ getter : 2. public memeber variable : hibernate mapping的是structs, 而不是class, : 如果自己要写的struct直接用public variable更方便
|
z****e 发帖数: 54598 | 60 耦合和内聚要放在模块内部来看
你把getarea和getwidth还有getheight放在同一个类里
这对于这个模块来说,这就是高耦合
mvc强调你应该把getwidth和getheight的struct
和实现getarea的class,分开实现,前者是model,后者是controller
这样才是真正的低耦合,在每一层每一个模块内部都实现低耦合
而不是把耦合和内聚放在一个固定的层面去讨论,下面不管了
下面一样要切割,否则代码可读性就会变差
我尽量用你的概念
,
【在 a****n 的大作中提到】 : 这个不是语法的问题,是OOP概念上的问题, class 本身应该有高内聚/低耦合, : 简单的例子, 比如Rectangle的面积, 一般create一个Rectangle的object, : 1. setWidth, setHeight, 然后 double area = object.getArea()。 : 2. setWidth, setHeight, 然后 double area = object.getWidth() * object. : getHeight(); : 第二种方法内聚比第一种低很多. 一般在设计class 的时候更多的考虑他的behavior, : 设计class 有个基本原则tell, don't ask. 也就是说告诉object去做什么, 而不是问 : 他detail的information. : 所以一般来说一个type 同时有很多 getter/setter, 基本上不应该给他其他的 : behavior, 而他仅仅充当一个 data 容器, 也就是struct, 反过来真正的class 一般
|
|
|
z****e 发帖数: 54598 | 61 Model{
void setWidth(int i);
int getWidth();
void setHeight(int i);
int getHeight();
}
Controller(){
double getArea(Model model){
return model.getWidth()*model.getHeight();
}
}
而不是讨论把getarea放到model中去实现
一个模块写成一个大类,里面什么都有,随着时间的推移
这个类会变得异常恐怖
,
【在 a****n 的大作中提到】 : 这个不是语法的问题,是OOP概念上的问题, class 本身应该有高内聚/低耦合, : 简单的例子, 比如Rectangle的面积, 一般create一个Rectangle的object, : 1. setWidth, setHeight, 然后 double area = object.getArea()。 : 2. setWidth, setHeight, 然后 double area = object.getWidth() * object. : getHeight(); : 第二种方法内聚比第一种低很多. 一般在设计class 的时候更多的考虑他的behavior, : 设计class 有个基本原则tell, don't ask. 也就是说告诉object去做什么, 而不是问 : 他detail的information. : 所以一般来说一个type 同时有很多 getter/setter, 基本上不应该给他其他的 : behavior, 而他仅仅充当一个 data 容器, 也就是struct, 反过来真正的class 一般
|
z****e 发帖数: 54598 | 62 看了下原文,发现原文没有说清楚
set/get只是一个例子
对于一般的行为类
应该多采用接口做封装
而不是用set/get
楼上的Controller
可以单独做一个ControllerInterface{
double getArea(Model model);
}
然后ControllerInterface controller = new Controller();
酱紫 |
a****n 发帖数: 1887 | 63 你听说过OO的SOLID 原则么?你觉得把behaviors 和 data 放到一起就会产生巨无霸么?
MVC是涉及到UI才采用的设计原则, 而MVC 的Controller 准确的说是Input-
Controller!
【在 z****e 的大作中提到】 : Model{ : void setWidth(int i); : int getWidth(); : void setHeight(int i); : int getHeight(); : } : Controller(){ : double getArea(Model model){ : return model.getWidth()*model.getHeight(); : }
|
z****e 发帖数: 54598 | 64 你知道entitybean为什么挂了么?
还有struts2
么?
【在 a****n 的大作中提到】 : 你听说过OO的SOLID 原则么?你觉得把behaviors 和 data 放到一起就会产生巨无霸么? : MVC是涉及到UI才采用的设计原则, 而MVC 的Controller 准确的说是Input- : Controller!
|
z****e 发帖数: 54598 | 65 mvc固然在ui层面用得比较多
swing,但是实际上大多数swing代码都没有遵循mvc规范
倒是web framework做得很好,spring mvc总知道吧?
么?
【在 a****n 的大作中提到】 : 你听说过OO的SOLID 原则么?你觉得把behaviors 和 data 放到一起就会产生巨无霸么? : MVC是涉及到UI才采用的设计原则, 而MVC 的Controller 准确的说是Input- : Controller!
|
a****n 发帖数: 1887 | 66 class 本身就是hide data expose behavior, 为什么非要吧data 和 behavior 分开?
而根据SOLID 原则设计class, 根本不会出现巨无霸类 |
z****e 发帖数: 54598 | 67 你的东西理论性过强了
实践起来你会发现,其实理论有很多时候有问题
给你看一下struts2的代码片段,which恰好是一个失败的例子
希望你能顿悟
public class WelcomeUserAction{
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
// all struts logic here
public String execute() {
return "SUCCESS";
}
}
么?
【在 a****n 的大作中提到】 : 你听说过OO的SOLID 原则么?你觉得把behaviors 和 data 放到一起就会产生巨无霸么? : MVC是涉及到UI才采用的设计原则, 而MVC 的Controller 准确的说是Input- : Controller!
|
z****e 发帖数: 54598 | 68 我们随便一个破entity都是五六十个变量,在企业这很正常
business logics就不用说了
所以实际工作中,你只会希望这两个之间的耦合越少越好
这跟设计一点关系没有,有些table它就是几十个column,你怎么办?
【在 a****n 的大作中提到】 : class 本身就是hide data expose behavior, 为什么非要吧data 和 behavior 分开? : 而根据SOLID 原则设计class, 根本不会出现巨无霸类
|
a****n 发帖数: 1887 | 69 不要随便假设, 我也做了多年项目了, 你们的项目做成这个样子, 不见得别人的项
目都是这个样子。 我说东西比较理论, 不过这些只是guideline, design is about
trade off.
你所谓的entity 有五六十个变量, 并不见得内聚高。十有八九可以根据response 分
成不同的类。
我感觉你们是直接拿ORM mapping 出来的class 当成domain class 使用了,对于复杂
的应用 ORM mapping出来的 class 并不是 entity/domain class, 一般在这些class
和domain class 之间会有mapper/entity gateway |
z****e 发帖数: 54598 | 70 不是内聚等概念的问题,是可读性太差
你打开一个类,上千行,瞬间连看的兴趣都没有了
你还不能说它错,你说人家五六十个column,写一个大类包装
违反了哪一条原则?solid可不管代码行数
随着代码数量的增加,你唯一期望的就是能够有足够细致的分类
但是往往不尽如人意,前面说的struts2挂了的例子是实实在在的教训
硬生生滴struts从一个市面上最流行的产品给搞挂了,其原因很大程度上就是因为这种
可笑的结构
使得springmvc后来居上,你说的各种原则和设计思想,未必一定对
实际上你转变一下思路,把包含set/get的entity当成一个没有思想的物体,物体也是
object
那么把controller当成一个有思想控制物体的人去看,这种分类就非常直观了
只是我觉得没有必要,如果实在无法理解,再做这种尝试吧
【在 a****n 的大作中提到】 : 不要随便假设, 我也做了多年项目了, 你们的项目做成这个样子, 不见得别人的项 : 目都是这个样子。 我说东西比较理论, 不过这些只是guideline, design is about : trade off. : 你所谓的entity 有五六十个变量, 并不见得内聚高。十有八九可以根据response 分 : 成不同的类。 : 我感觉你们是直接拿ORM mapping 出来的class 当成domain class 使用了,对于复杂 : 的应用 ORM mapping出来的 class 并不是 entity/domain class, 一般在这些class : 和domain class 之间会有mapper/entity gateway
|
|
|
g****y 发帖数: 2810 | 71 为什么不能首字母大写。我写c和pascal都是首字母大写的。
[发表自未名空间手机版 - m.mitbbs.com] |
a****n 发帖数: 1887 | 72 你说的这种设计方式叫做controller - entity, 大部分的business logic 在
controller 里, 不过我更喜欢service - domain object, service 只是很薄的 一层
对应use case.
五六十个columns 做一个包装类,我觉得你们更应该吧这个类分成多个, 中间用
mapper 把数据库完全隔离, 另外这样对于unittest mock db也比较方便
【在 z****e 的大作中提到】 : 不是内聚等概念的问题,是可读性太差 : 你打开一个类,上千行,瞬间连看的兴趣都没有了 : 你还不能说它错,你说人家五六十个column,写一个大类包装 : 违反了哪一条原则?solid可不管代码行数 : 随着代码数量的增加,你唯一期望的就是能够有足够细致的分类 : 但是往往不尽如人意,前面说的struts2挂了的例子是实实在在的教训 : 硬生生滴struts从一个市面上最流行的产品给搞挂了,其原因很大程度上就是因为这种 : 可笑的结构 : 使得springmvc后来居上,你说的各种原则和设计思想,未必一定对 : 实际上你转变一下思路,把包含set/get的entity当成一个没有思想的物体,物体也是
|
z****e 发帖数: 54598 | 73 大哥,controller里面包含有action&service
action只是一个简单的分派,具体逻辑在service里面实现
无论如何,entity是一定有的,随便找一个mvc的web fraemwork
一般都包含有这三个基本类
【在 a****n 的大作中提到】 : 你说的这种设计方式叫做controller - entity, 大部分的business logic 在 : controller 里, 不过我更喜欢service - domain object, service 只是很薄的 一层 : 对应use case. : 五六十个columns 做一个包装类,我觉得你们更应该吧这个类分成多个, 中间用 : mapper 把数据库完全隔离, 另外这样对于unittest mock db也比较方便
|
s*****i 发帖数: 32 | 74 难道面试的时候还要写这么长的变量名?
难道面试中int i, int j, int a有学术派的问题吗?int a的话不管什么问题都可以用
,在面试中花时间去想有意义的变量名如employeeList会用掉部分想解题思路的时间,
而且重复写这么长的一个变量也很烦吧,又没有copy,paste。
什么样的公司在面试中会注重这种东西?难道flg会重视这些吗?
实际工作中当然是有意义的变量名很重要。
【在 s*****r 的大作中提到】 : string没有meaning,最好用相近的英文词汇,比如employeeList,wishList,别人一 : 读就懂。
|
z****e 发帖数: 54598 | 75 写list就好了
对于int i,j这种,尤其是在循环中用来标识的无所谓
如果觉得名字太长,去掉元音字母
比如list -> lst
manager -> mngr
【在 s*****i 的大作中提到】 : 难道面试的时候还要写这么长的变量名? : 难道面试中int i, int j, int a有学术派的问题吗?int a的话不管什么问题都可以用 : ,在面试中花时间去想有意义的变量名如employeeList会用掉部分想解题思路的时间, : 而且重复写这么长的一个变量也很烦吧,又没有copy,paste。 : 什么样的公司在面试中会注重这种东西?难道flg会重视这些吗? : 实际工作中当然是有意义的变量名很重要。
|
s*******e 发帖数: 142 | |
B*****g 发帖数: 34098 | 77 晕倒
【在 g**e 的大作中提到】 : 不如来点在java6也能用的语法糖 : List strList = Lists.newArrayList();
|