g*****g 发帖数: 34805 | 1 I didn't read the original post carefully. His example should work actually.
But not the recommended way to do it.
volatile is tricky, basically it works for getter/setter without sync. But
Atomic is much easier. |
|
g*****g 发帖数: 34805 | 2 If it's private memeber for parents, just use a getter/setter in
parents to access it, I don't understand why we need any trick
for this. |
|
L*********r 发帖数: 92 | 3 public getter/setter is always used to expose accessing a data member to a
class which is not in the class hierarchy tree. |
|
k*k 发帖数: 508 | 4 what if the parent class doesn't provide the getter and setter?
it's not always the case that you have the access to the base class source |
|
g*****g 发帖数: 34805 | 5 Eclipse有这个warning, 打开就是了。
m_是比this.简单,但是在IDE里打起来反而慢。
何况this只在setter里用用就行了。 |
|
r*******y 发帖数: 290 | 6 Let's consider the following example:
CPoint
{
private:
int x, y;
};
CPointCollection
{
public:
setAllPoints(int a, int b);
private:
std::vector m_points;
}
CPointCollection and CPoint have high coupling, to access x/y of CPoint
we either write a setter or make CPointCollection a friend of CPoint
I think the friend way is better. |
|
g*****g 发帖数: 34805 | 7 Pass the instance of B to A either using a constructor,
or using a setter. |
|
t****u 发帖数: 8614 | 8 OO情况要好得多.
你可以用个configuration class, 然后用getter/setter来access,
coupling程度就降下来了. 简单举个例子,至少很多只读的config
data或者内部用的,可以不用担心被不熟悉code的其他开发者在其
他地方瞎改掉. |
|
p*u 发帖数: 2454 | 9
class
check out boost::type_traits::is_same, then use template getter and setter
methods in A. |
|
p*****u 发帖数: 711 | 10 不错不错,哈哈,直接用他们的代码会被告么?
setter |
|
p*u 发帖数: 2454 | 11 No you didn't get it. the template methods should be like:
"
//suppose _i is A's private member
template
int
A::getter( const T& ref)
{
if( boost::is_same::value )
return _i;
else
throw e( "Wrong type!" );
}
template
void
A::setter( const T& ref, int i )
{
if( boost::is_same::value )
_i = i;
else
throw e( "Wrong type!" );
}
" |
|
X****r 发帖数: 3557 | 12 No, define your own getters/setters. |
|
X****r 发帖数: 3557 | 13 I see what you are trying to do. If you really want global names, import __
builtin__ (or builtin for python 3) and assign its property (e.g. FLOATTYPE)
, which will become global for all modules without further explicit imports.
But this is highly unrecommended -- global names are very hard to maintain.
I still don't get why can't you import head.py from source.py. If you'd like
your driver.py change the value on-the-fly (e.g. decide which type to use
from command-line arguments in driver.py), ... 阅读全帖 |
|
d****n 发帖数: 1637 | 14 我就是写个snippet.
那些,getter setter 都 save 了。也不是重点啊。
你不会介意吧? |
|
g*****g 发帖数: 34805 | 15 我无语了,Java 5是04年出来的,C#的generics是.Net 2.0才有的,.Net 2.0是06年
出来的。什么叫做到Java 5才有呀,到底是谁抄谁呀?至于closure,anonymous inner
class可以实现大部分的需要。不够简洁不错,但是这么多年也没见谁因为没有
closure而不能实现某种功能。
事实上functional的滥用是难以避免的。C++语法中的很多问题,都是因为为了跟
C兼容引起的。functional自由度更大,更容易滥用。当语言中允许不同风格
的写法的时候,就很难一致。理想是美好的,现实是程序员烂的比不烂的多。
从实用的角度,一个java烂程序员写的代码,还可以维护。而一个functional的,
可能只能重写。有现代IDE的存在,boiler plate代码是被overrated的。比如一个Java
bean很繁琐,但事实上在IDE里需要写的,就是声明的那几行,其他getter setter,
equals, hashcode,包括import,都是直接点几下就生成了。
Closure
C#
Java |
|
z***e 发帖数: 5393 | 16 语言最开始都是以简单为目的,之后随着各种需求,尤其是为了跟上新的语言的步调,
再简单的也会变复杂。
就现在来说,光看程序的话,我觉得C#比Java更清晰简洁,比如setter/getter就比
java简洁吧(当然你也可以说这是sugar syntax,根本不需要,但是对用过的就会觉得
C#这方面要简洁些),这就好像也有很多人觉得C才是最简单易懂的没有其他花哨的东西
一样,一个道理。 |
|
v*****r 发帖数: 2325 | 17 paul hegarty made it look easy. 有看了debugger demo, 感觉稍好。
用NSMutableArray 做stack, push/pop 工作不正常。operandStack 存不了数!pop
always 0.
看来对objective c 理解还不深入。
@synthesize operandStack = _operandStack;
_operandStack is a storage location? used in generated getter/setter code? |
|
v*****r 发帖数: 2325 | 18 paul hegarty made it look easy. 有看了debugger demo, 感觉稍好。
用NSMutableArray 做stack, push/pop 工作不正常。operandStack 存不了数!pop
always 0.
看来对objective c 理解还不深入。
@synthesize operandStack = _operandStack;
_operandStack is a storage location? used in generated getter/setter code? |
|
|
d****n 发帖数: 1637 | 20 class A{
var a, b,c,d,shits...
set_a(a){ this.a=a; return this;}
set_b(b){ this.b=b; return this;}
set_c(c){ this.c=c; return this;}
}
我的一点经验,怕忘member名。
书写方便,省着忘了参数名:
objA= A().set_a(a).set_b(b).set_c(c);
对比:
objA=A(a, b,c, ...);
有些参数在ctor里没用到,但是将来会用到,没必要都在开始放进去。还记不住。 |
|
n*w 发帖数: 3393 | 21 does pojo violate oop principle? |
|
c*********e 发帖数: 16335 | 22 pojo没违反阿,javabean里面照样有getxxx,setxxx method啊。 |
|
z*******3 发帖数: 13709 | 23 pojo的本意是不需要继承任何特定的接口和父类
早先年版本的ejb往往要求继承特定的接口,struts等要求继承特定的抽象类
因为这种模式其实很糟糕,群众往往弄不清楚要override的方法到底是做什么的
使得j2ee早期的推广面临着很大的困难
最常见的就是ejb的那4个接口,其中的stateful还有4个方法要override
没有多少人真能弄懂到底这些方法是做什么用的
spring出现之后,不需要继承任何特定的接口和类,简单很多很多
所以一下子就使得spring在很短时间内推广开来
全民皆编java也就是那个时候开始的
另外严格意义上的pojo连特定的annotation都不要求
但是因为annotation其实比xml要简单
所以广义的pojo就也包括那些要求使用特定annotation的java bean了 |
|
d**********x 发帖数: 4083 | 24 这个嘛。。我的实际感觉是比例要比1/10高很多,高多少不知道,但是想象一下,某个
关键的数据类出了问题的时候,你要监视每一个成员的变化。。。
好吧,就算是1/10,也是很高的一个比例了 |
|
c*****m 发帖数: 1160 | 25
:) 我把原贴更新了一下,增加了一些自己的想法。1/10是我瞎猜的 |
|
d**********x 发帖数: 4083 | 26 按照他的意思,这个东西不应该叫做setX,应该叫做updateX之类的东西
不是
verbose, |
|
z*******3 发帖数: 13709 | 27 如果是public变量
任何一个方法一个线程都可以发起对该变量的修改
那么如果该调用有任何的改动
那你要搜索整个项目去寻找关于该变量的调用
然后挨个修改
但是如果你要求所有的调用全部通过方法调用
那么如果有什么改动,你只需要改动该类本身的方法就行了
举个例子
如果你要求对于某一个变量的值在get时候+1
那么如果你是public变量,那么这个+1就要你遍历项目所有的代码去修改
但是如果你用的是get,那么只需要在get方法return的时候+1就行了
如果是用方法,还有办法予以优化
因为所有调用该private变量的操作都必需经过该方法
所以可以在该方法上添加interceptor, aop之类的东东
spring也是在方法调用的时候才inject,而不是在fields被调用时候inject
直接invoke变量框架容器什么忙都帮不上 |
|
z*******3 发帖数: 13709 | 28 还有一个例子就是并发操作的时候
你用方法可以加synchronized关键字控制并发
如果是public,你怎么控制并发?
另外get方法也不是必然叫这个名字
可能这个名字就是update,而压根没有get方法
就只有update或者getMD5 |
|
|
c*****m 发帖数: 1160 | 30
我对goodbug很失望。我问一个简单的:setter 和getter有什么用处?最后他的答案是
:java都用它们作为接口。 |
|
m*******l 发帖数: 12782 | 31 大部分学Java的都是知其然而不知其所以然
学C++的,如果不知其所以然,很难混下去... |
|
d****i 发帖数: 4809 | 32 所以我一直提倡从C-> C++ ->Java这么一条学习线路学下去,这样对很多问题的理解比
较透彻,概念也比较深入清晰。虽然花的时间会多一些。 |
|
k******i 发帖数: 5774 | 33 都是面向对象设计的一些原则
SOLID里面的一条吧
么东 |
|
g*****g 发帖数: 34805 | 34 你咋不说学C++的懂Design Pattern的实在不多,本版很少讨论这个。有些人成天还沉
迷于回
字怎么写呢? |
|
m*******l 发帖数: 12782 | 35 连object这个基类都不知道的java程序员,连基本oop都搞不懂的大谈什么
Design pattern
不好笑么? |
|
a9 发帖数: 21638 | 36 好虫最近比较露窃啊。
OO跟design pattern是两回事儿。
还沉 |
|
d****i 发帖数: 4809 | 37 这回好虫你还真说错了,design pattern最著名的经典的教科书:
Design Patterns: Elements of Reusable Object-Oriented Software
By Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
Addison-Wesley,1994
就是全部用C++做例子的,当然可能跟那时Java还没有诞生有关。这本书几乎就是
design pattern的bible了吧。 |
|
S**I 发帖数: 15689 | 38 design pattern的经典用C++和很多C++程序员不懂design pattern不矛盾。 |
|
d****i 发帖数: 4809 | 39 这个倒是,很多C++程序员对于design pattern也都是一头雾水,不过那本书上的例子
的程序写的都很精美的说,看过以后让人拍案叫好。 |
|
x****u 发帖数: 44466 | 40 这个DP容易把菜鸟引入over design的坑里去。 |
|
z*******3 发帖数: 13709 | 41 gof那些pattern大部分其实都被java的各种框架什么轻松搞定了
比如singleton,一个@singleton就搞定了
或者用enum,现在很少还有人去自己实现singleton了
还有prototype也是写下配置文件就好了,或者直接调用clone()方法
factory的功能则多数spring所取代,flyweight等模式则在ejb容器中被实现
还有一些行为模式,比如iterator之类的都有现成的实现类,aop对应visitor什么
也都是用就行了,对于一般java开发人员来说,不需要自己去写这些模式
只需要会用就行了,如果经常自己去实现gof的那些模式
反倒是要看看是为什么了,为什么这个人在重复造轮子
而后在gof的基础之上,sun又搞出了一个j2ee core pattern
这个才是真正常见的对于java开发人员来说的design pattern
而就是这个core pattern,现在看也都有些陈旧了 |
|
z*******3 发帖数: 13709 | 42 set/get一个很重要常见的应用就是aop等拦截器需要嘛
要拦截对于某一个bean的属性的调用
直接拦截其get方法就行了
如果分散在其它方法里
那怎么拦截?
最常见的就是log的生成
不拦截每次都去写一个log方法?
还有如果不拦截的话,对于一些现有的jar包里面的类的使用
就无法改了,要拆开来后重写代码
如果没有代码的话,还需要先反编译,再写,再编译
麻烦得多 |
|
d*****b 发帖数: 9 | 43 "并发需要synchronized的地方会低?"
您这不叫断章取义吗? 原文是
""也许你辛辛苦苦写下了一百多行给某个public属性赋值的语句后,
东西,这时你就必须在每个赋值的地方进行改动。" |
|
z*******3 发帖数: 13709 | 44 不是,我在给你新例子
比楼主说的这个极端情况要广泛得多,几乎所有得server都会遇到
就是dto模式,如何防止多个线程并发修改同一个数据源的问题
这个太常见了,是个server就会用到,我前几天还在同步我自己的数据源
加上并发修改异常处理才大概算搞定 |
|
z*******3 发帖数: 13709 | 45 另外关于直接变量的修改
这个你没有办法利用上接口
接口不定义变量,只定义方法
这样可以剥离耦合
比如a.int = b.int
那么这个时候你要连同B一起编译
而这个B只能是具体的实现类
这样耦合度明显增加
A和B的实现就很难拆开给两个人去写
因为A的编译需要用到B类,否则无法编译
而如果B是一个接口
那么a.int = b.getInt();
的话,A的编译只需要拿到B的接口就行了
B的实现跟A的实现分离
这也是最基本的分工的要求
否则你写的代码要等隔壁阿三写好才能编译
那就痛苦了 |
|
a9 发帖数: 21638 | 46 说实话,需要后加syncronized的情况非常少。
一个操作需不需要同步,应该在写这个方法的时候就应该考虑好。
么东 |
|
z*******3 发帖数: 13709 | 47 我不是在说复用的service bean
是entity bean
这个需要syncrhonized的情况太多了
复用的service bean也不是不需要synchronized
当写core java的时候遇到的就多了
大多数时候被写好的server给解决了而已 |
|
z*******3 发帖数: 13709 | 48 set用得其实少,get用得多
但是往往set需要synchronized
只不过现在hibernate什么都做得很好
以至于越来越少人真的去自己倒腾了
如果不synchronized的话
那么各个层面之间的entity bean的数据一致性就值得商榷了
这个时候会涉及hashcode的问题
如何保证两个不同的物理对象其实代表的是一个东西
就要用hashcode来解决冲突 |
|