论坛首页 Java企业应用论坛

基础知识: 需求!

浏览 110246 次
该帖已经被评为精华帖
作者 正文
   发表时间:2004-08-22  
ajoo 写道
"不恰当的名字"是你个人的看法.
你自己这么看不要紧. 但是如果你想把这个想法强迫每个人接受, 似乎你就要告诉大家为什么它们是不恰当的.

你要告诉客户:
看, 我知道你要一个可以打印"x1"的功能, 但是, 我们内部现在学习三个代表, 精简机构, 没有x1这个部门了. 你需要到"generic X"部门, 并且明确告诉他们你想打印x1 (因为这个部门现在吃喝拉撒都管, 你不告诉他们, 他们可不象原来的x1部门的人自动就知道你要打印x1)

于是客户要调整自己的工作逻辑, 给每个工作人员发一个通知: 大家以后不要去x1部门, 要去generic X部门并且告诉他们你要打印x1.

呵呵. 不错啊.


这个代码不是给客户看的,甚至你都不会把源代码给客户。
但是,你必须保证开发/维护团队的其他成员能够看明白这些代码。名字的重要性体现在这里。
0 请登录后投票
   发表时间:2004-08-22  
firebody 写道
那好。private构造器,看我怎么修理你!!
原来我以为你是protected,那么ajoo,
我问你,你怎么设计读取这个配置进行service的实例化?:
<bean  name="serviceA" interface="Service" class="serviceImplA" factoryMethod="instanceForService">
  <constructor>
	<param name="delaterA"></param>
  </constructor>

 </bean>
 <bean  name="delegaterA" interface="Delegater" class="DelegateImplA" factoryMethod="instanceForDelegator">
  <constructor>
	<param name="daoA"></param>
  </constructor>

 </bean>
 <bean  name="daoA" interface="Dao" class="HibernateDaoImplA" factoryMethod="instanceForDao">
 
 </bean>


呵呵. 介意给一个java代码吗?
你那个constructor干什么的? 都没有公开得constructor了.
0 请登录后投票
   发表时间:2004-08-22  
charon 写道
ajoo 写道
"不恰当的名字"是你个人的看法.
你自己这么看不要紧. 但是如果你想把这个想法强迫每个人接受, 似乎你就要告诉大家为什么它们是不恰当的.

你要告诉客户:
看, 我知道你要一个可以打印"x1"的功能, 但是, 我们内部现在学习三个代表, 精简机构, 没有x1这个部门了. 你需要到"generic X"部门, 并且明确告诉他们你想打印x1 (因为这个部门现在吃喝拉撒都管, 你不告诉他们, 他们可不象原来的x1部门的人自动就知道你要打印x1)

于是客户要调整自己的工作逻辑, 给每个工作人员发一个通知: 大家以后不要去x1部门, 要去generic X部门并且告诉他们你要打印x1.

呵呵. 不错啊.


这个代码不是给客户看的,甚至你都不会把源代码给客户。
但是,你必须保证开发/维护团队的其他成员能够看明白这些代码。名字的重要性体现在这里。

请仔细解释你的"名字不恰当"这个判断.
不要假设这是一个公认得前提.
0 请登录后投票
   发表时间:2004-08-22  
引用

没人说你所有的调用都通过调用X.instance()啊.
你调用X.instance(), Y.instance()不就成了?
就象你分别调用new X(), new Y()一样啊.


我们的前提是不希望知道X内部用哪一个子类,是X自己还是另外一个Y,你怎么让我主动去调用Y.instance()了
0 请登录后投票
   发表时间:2004-08-22  
每一个类的构造器private,意味着每一个类都需要一个instance(),整体类层次等于相对于service类并行多了一层instance method层。
instance 层有效代理了对象的安全生产。instance()代替构造函数。
可行吗?继续讨论!
0 请登录后投票
   发表时间:2004-08-22  
ajoo 写道

请仔细解释你的"名字不恰当"这个判断.
不要假设这是一个公认得前提.


这里举一个和那个X1变化差不多的例子。
假设有接口IDog:
public interface IDog{
    void bite();;
    void run();;
    void sleep();;
    .....
}


一条黑狗:
public BlackDog implements IDog{
    public IDog instance(); { return new BlackDog;}
    private BlackDog(); { .... }
    void bite(); {....}
    void run(); {...} 
}


此时,这个黑狗的类名和定义是一致的。

现在有了一个狗的通用实现Dog,使得黑狗不需要自己的实现了。按X1的做法:
public BlackDog {
    public IDog instance(); { return Dog.instance(Color.Black);;}
}


先假设这种做法合理(potian可能质疑这个)
这个时候,这个BlackDog本身和IDog是没有关系的,它不实现IDog接口,而直接只是一个工厂,那么,更加合适的名字是BlackDogFactory。
或者说,有那么一个东西,它既不会叫,也不会跑,但是,你去找它的时候,它能帮你找到一条狗,那么,这个东西也叫做狗?
0 请登录后投票
   发表时间:2004-08-22  
我要证明的就是,任何你在这个静态方法里面加入的东西,如果不光光是new ,它都会影响到这个类的重用
0 请登录后投票
   发表时间:2004-08-22  
potian 写道
引用

没人说你所有的调用都通过调用X.instance()啊.
你调用X.instance(), Y.instance()不就成了?
就象你分别调用new X(), new Y()一样啊.


我们的前提是不希望知道X内部用哪一个子类,是X自己还是另外一个Y,你怎么让我主动去调用Y.instance()了

看来还是要重复. 我说的可以放在instance()里的逻辑有这样一个要求:

这个逻辑是对外界透明的. 是你不需要知道的.

所以如果你认为Y和X提供了不同的语义, 你需要知道拿到的是X还是Y, 它就不应该放在instance()中.

如果你想用我的说法"不希望知道X内部用哪一个子类,是X自己还是另外一个Y", 那就要遵守我的前提. 否则不免就是偷换概念了.
0 请登录后投票
   发表时间:2004-08-22  
firebody 写道
每一个类的构造器private,意味着每一个类都需要一个innter factory,整体类层次等于相对于service类并行多了一层service factory 类层。
factory层有效代理了对象的安全生产。用factory的instance()代替构造函数。
可行吗?继续讨论!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

不用这么多感叹号吧? 冷静, 冷静, 兄弟. 在老外的论坛上, 这叫shout, 叫yell, 一般大家都避免这么做的.

首先纠正一下:
不是每个类都必须隐藏构造函数. 别把我往极端了推.
我的观点是:每个类作者自己选择是否隐藏构造函数. 这个决定不受外部环境影响.

这和你以为的我的观点不同.


其次, 关于静态厂是不是一个额外的层又是一个太随便的概念. 怎么有了一个service factory类并行呢?
难道加上一句factorymethod="xxx"就那么大不了?
0 请登录后投票
   发表时间:2004-08-22  
好了. 目前总结出来一个观点:
class BlackDog implements Dog{
 ...
  BlackDog();{...}
}

class BlackDog{
  static Dog instance();{return new GenericDog(new Black(););;}
}


这两个类的具体含义不同, 所以后者叫BlackDog是不可以的. 所以坚决是要换名字的.
客户端原来如果是BlackDog.instance(), 现在必须变成BlackDogFactory.instance()才合道理.

potian, firebody, 你们是否再这点上一致?

好吧, 先不说这个观点是否是真理吧. 我们保留这个争议. 作为讨论到现在的反对方的一个论据. 如何?

我们先弄清楚了双方都有些什么观点, 至于每个具体点大家是否意见一致并不十分重要.

这也是我拿手的, 列出所有优缺点, 然后大家自己比较权衡.
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics