由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
JobHunting版 - 说一下学术派的代码(java)
相关主题
Amazon电话二面再问Maximal Rectangle的N^2解法
@synthesize的问题感觉avl tree的插入不是O(lgn)啊
请教面试时的代码规范菜鸟问一道java题目,check balanced binary tree
Re: 你为什么写public?如何计算recursion的空间复杂度
昨天G面经里的这一题怎么做?问两道A家的设计题
LC装水容器题一定要O(nlogn)做法吗?一年代码量4万行啥概念
how to check a bin tree is balanced?王垠测试的道理写的不错呀
算法题:如何判断二叉树是AVL?真心求助想转WEB后端需要学什么技能?
相关话题的讨论汇总
话题: string话题: 代码话题: class话题: static话题: list
进入JobHunting版参与讨论
1 (共1页)
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
相关主题
LC装水容器题一定要O(nlogn)做法吗?再问Maximal Rectangle的N^2解法
how to check a bin tree is balanced?感觉avl tree的插入不是O(lgn)啊
算法题:如何判断二叉树是AVL?菜鸟问一道java题目,check balanced binary tree
进入JobHunting版参与讨论
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) 命名中使用下划线
: 尤其是自定义的系统变量,喜欢用下划线开始

相关主题
如何计算recursion的空间复杂度王垠测试的道理写的不错呀
问两道A家的设计题真心求助想转WEB后端需要学什么技能?
一年代码量4万行啥概念说几个资本家剥削的新手段
进入JobHunting版参与讨论
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?
相关主题
面试之后,HM的回信,有戏吗@synthesize的问题
Contractor position at Wells Fargo, Charlotte, NC (转载)请教面试时的代码规范
Amazon电话二面Re: 你为什么写public?
进入JobHunting版参与讨论
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
相关主题
Re: 你为什么写public?how to check a bin tree is balanced?
昨天G面经里的这一题怎么做?算法题:如何判断二叉树是AVL?
LC装水容器题一定要O(nlogn)做法吗?再问Maximal Rectangle的N^2解法
进入JobHunting版参与讨论
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
46
用checkstyle
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) 命名中使用下划线
: 尤其是自定义的系统变量,喜欢用下划线开始

相关主题
感觉avl tree的插入不是O(lgn)啊问两道A家的设计题
菜鸟问一道java题目,check balanced binary tree一年代码量4万行啥概念
如何计算recursion的空间复杂度王垠测试的道理写的不错呀
进入JobHunting版参与讨论
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 一般

相关主题
真心求助想转WEB后端需要学什么技能?Contractor position at Wells Fargo, Charlotte, NC (转载)
说几个资本家剥削的新手段Amazon电话二面
面试之后,HM的回信,有戏吗@synthesize的问题
进入JobHunting版参与讨论
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

相关主题
@synthesize的问题昨天G面经里的这一题怎么做?
请教面试时的代码规范LC装水容器题一定要O(nlogn)做法吗?
Re: 你为什么写public?how to check a bin tree is balanced?
进入JobHunting版参与讨论
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
76
thanks
B*****g
发帖数: 34098
77
晕倒

【在 g**e 的大作中提到】
: 不如来点在java6也能用的语法糖
: List strList = Lists.newArrayList();

1 (共1页)
进入JobHunting版参与讨论
相关主题
真心求助想转WEB后端需要学什么技能?昨天G面经里的这一题怎么做?
说几个资本家剥削的新手段LC装水容器题一定要O(nlogn)做法吗?
面试之后,HM的回信,有戏吗how to check a bin tree is balanced?
Contractor position at Wells Fargo, Charlotte, NC (转载)算法题:如何判断二叉树是AVL?
Amazon电话二面再问Maximal Rectangle的N^2解法
@synthesize的问题感觉avl tree的插入不是O(lgn)啊
请教面试时的代码规范菜鸟问一道java题目,check balanced binary tree
Re: 你为什么写public?如何计算recursion的空间复杂度
相关话题的讨论汇总
话题: string话题: 代码话题: class话题: static话题: list