锁定老帖子 主题:基础知识: 需求!
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2004-08-22
ajoo 写道 "不恰当的名字"是你个人的看法.
你自己这么看不要紧. 但是如果你想把这个想法强迫每个人接受, 似乎你就要告诉大家为什么它们是不恰当的. 你要告诉客户: 看, 我知道你要一个可以打印"x1"的功能, 但是, 我们内部现在学习三个代表, 精简机构, 没有x1这个部门了. 你需要到"generic X"部门, 并且明确告诉他们你想打印x1 (因为这个部门现在吃喝拉撒都管, 你不告诉他们, 他们可不象原来的x1部门的人自动就知道你要打印x1) 于是客户要调整自己的工作逻辑, 给每个工作人员发一个通知: 大家以后不要去x1部门, 要去generic X部门并且告诉他们你要打印x1. 呵呵. 不错啊. 这个代码不是给客户看的,甚至你都不会把源代码给客户。 但是,你必须保证开发/维护团队的其他成员能够看明白这些代码。名字的重要性体现在这里。 |
|
返回顶楼 | |
发表时间: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了. |
|
返回顶楼 | |
发表时间:2004-08-22
charon 写道 ajoo 写道 "不恰当的名字"是你个人的看法.
你自己这么看不要紧. 但是如果你想把这个想法强迫每个人接受, 似乎你就要告诉大家为什么它们是不恰当的. 你要告诉客户: 看, 我知道你要一个可以打印"x1"的功能, 但是, 我们内部现在学习三个代表, 精简机构, 没有x1这个部门了. 你需要到"generic X"部门, 并且明确告诉他们你想打印x1 (因为这个部门现在吃喝拉撒都管, 你不告诉他们, 他们可不象原来的x1部门的人自动就知道你要打印x1) 于是客户要调整自己的工作逻辑, 给每个工作人员发一个通知: 大家以后不要去x1部门, 要去generic X部门并且告诉他们你要打印x1. 呵呵. 不错啊. 这个代码不是给客户看的,甚至你都不会把源代码给客户。 但是,你必须保证开发/维护团队的其他成员能够看明白这些代码。名字的重要性体现在这里。 请仔细解释你的"名字不恰当"这个判断. 不要假设这是一个公认得前提. |
|
返回顶楼 | |
发表时间:2004-08-22
引用 没人说你所有的调用都通过调用X.instance()啊. 你调用X.instance(), Y.instance()不就成了? 就象你分别调用new X(), new Y()一样啊. 我们的前提是不希望知道X内部用哪一个子类,是X自己还是另外一个Y,你怎么让我主动去调用Y.instance()了 |
|
返回顶楼 | |
发表时间:2004-08-22
每一个类的构造器private,意味着每一个类都需要一个instance(),整体类层次等于相对于service类并行多了一层instance method层。
instance 层有效代理了对象的安全生产。instance()代替构造函数。 可行吗?继续讨论! |
|
返回顶楼 | |
发表时间: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。 或者说,有那么一个东西,它既不会叫,也不会跑,但是,你去找它的时候,它能帮你找到一条狗,那么,这个东西也叫做狗? |
|
返回顶楼 | |
发表时间:2004-08-22
我要证明的就是,任何你在这个静态方法里面加入的东西,如果不光光是new ,它都会影响到这个类的重用
|
|
返回顶楼 | |
发表时间: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", 那就要遵守我的前提. 否则不免就是偷换概念了. |
|
返回顶楼 | |
发表时间:2004-08-22
firebody 写道 每一个类的构造器private,意味着每一个类都需要一个innter factory,整体类层次等于相对于service类并行多了一层service factory 类层。
factory层有效代理了对象的安全生产。用factory的instance()代替构造函数。 可行吗?继续讨论!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 不用这么多感叹号吧? 冷静, 冷静, 兄弟. 在老外的论坛上, 这叫shout, 叫yell, 一般大家都避免这么做的. 首先纠正一下: 不是每个类都必须隐藏构造函数. 别把我往极端了推. 我的观点是:每个类作者自己选择是否隐藏构造函数. 这个决定不受外部环境影响. 这和你以为的我的观点不同. 其次, 关于静态厂是不是一个额外的层又是一个太随便的概念. 怎么有了一个service factory类并行呢? 难道加上一句factorymethod="xxx"就那么大不了? |
|
返回顶楼 | |
发表时间: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, 你们是否再这点上一致? 好吧, 先不说这个观点是否是真理吧. 我们保留这个争议. 作为讨论到现在的反对方的一个论据. 如何? 我们先弄清楚了双方都有些什么观点, 至于每个具体点大家是否意见一致并不十分重要. 这也是我拿手的, 列出所有优缺点, 然后大家自己比较权衡. |
|
返回顶楼 | |