“如果现在能震撼过去,那么未来又能带给我们什么”,这句联通的广告说明了科技创新的力量与结果。在过去令人匪夷所思的东西现在都出现了。在第一次 工业革命(以蒸汽机的发明为标志)之前,人类很难想象将来会有不用任何动物拖动,就可以自由行走的车;第二次工业革命(以电的发现为标志)之前,人类同样很难想象将来会有这么多电器。这是人类美好的理想促使着社会的发展。同样现在没有东西不等于将来不会有。
再说对象设计,让程序准确描述对象,无人对此有异议,一旦描述出的对象,现实没有就可能因违背逻辑和常识而遭到耻笑。如一个酒吧的“吧台”,通常样子是,一张具备某种款式的桌子,里面可以摆放各式各样的酒。我开始违背常识,重新为该酒吧设计“吧台”,让它会推销酒水,当酒瓶放在“吧台”上的时候,吧台能显示这瓶就得相关信息,以及给出替代品,因为考虑到,它摆放在酒吧,是买酒的柜台,所以能增加一个推销功能。这与让狗能注册自己信息的例子是同样的,都是把常识中的一个事物变成为常识外一个例子。只不过前者可能比较容易实现,后者觉得不可能,所以从实现的可能性说:前者叫创新,后者叫幻想(其实实现也不难)。其中这样会推销的“吧台”已经问世一段时间。
这样的吧台会让酒吧运营更加轻松,至少站在吧台后面那个人会轻松,留出更多的精力关注业务,酒吧运营的业务逻辑丝毫未变。
酒吧的运营在现实环境是一套系统,酒吧老板,服务员,吧台,酒等对象,在酒吧的运营业务下把他们关联成一个系统;在软件系统也是多个不同对象+业务逻辑组成。在现实环境下使实体对象多功能,能让环境更加和谐;在虚拟的软件环境下,让对象多功能也能让软件环境更加和谐。二者系统性质相似,而有一个令人欣慰的不同是,在软件环境下,让对象多功能要比现实容易多了,所以我们可以让软件环境在和谐的路上大步前进,并让业务逻辑运营更加舒畅。
物极必反,让对象多功能也不能太离谱,要依附现实,但可超越现实。我们总不能给“吧台”增加喝酒的功能。
最初我提出的“智能对象”多有不妥,从此改名为“多功能对象”,这个名字比较合适。大家都认为原“智能对象”的remember()等方法名称有悖于逻辑。我把名称改一下:
// 在此输入java代码 public abstract class MObject extends Observable implements Serializable { /<strong> */ private static final long serialVersionUID = 1L;
public static final int REMEMBER = 1; public static final int FORGET = 2; public static final int UPDATE_MEMORY = 3; public static final int ASSOCIATE = 4; public static final int OBTAIN_ME = 5; public static final int FRESH_REMEMBER = 6;
private boolean setupedObserver = false;
/</strong> * 把对象自身持久。子类可以根据类的情况,重写该方法。 如该类是复合对象,想关联存储,则需要重写该方法 * */ public abstract void saveSelf();
/<strong> * * 匹配性删除对象对应的数据库记录,所谓“匹配性”就是根据参数删除该类对应的数据库中存储的实体 * * @param updateFields params */ public abstract void associateDelete(Object...params); /</strong> * 用于更新数据库记录,需要更新对象的某一个属性时,用到此方法。 * * @param updateFields * 属性的名称,如果你更改username的值,那么这个参数就应该是username, 注意不是username的值 */ public abstract void updateSelfPropes(String... updateFields);
/<strong> * 这是一个最自由的,最难以理解的,最惹争议的方法。所以在这里解释以下,该类方法名称可意为 * “联想”或者“匹配”,英语associate包含这两种解释,有一定哲学含义, 即:要素与一系列对象属性的匹配过程就叫联想。 * 默认实现是查询相关对象。意义是根据一个对象可以找到和它相关的对象。 * * 若该对象是一个事件,这是一个事件对象,那么你可以让他想到与这个事件相关的任何东西。 在子类中可以自己添加相关的‘associateXXX()’方法。 * * @param params * 任何对象要素 * @return */ public abstract List<?> associate(Object... params);
/</strong> * 根据主键数据库中获取自身全部信息 * * @param id * @return */ public abstract void obtainMe();
/** * * @param obj * 任何数据 */ protected void notifyMyObservers(Object obj) { if (!isSetupedObserver()) { ThinObjectLoader.setupObservers(this); }
this.setChanged(); this.notifyObservers(obj); }
public boolean isSetupedObserver() { return setupedObserver; }
public void setSetupedObserver(boolean setupedObserver) { this.setupedObserver = setupedObserver; }
}
|
声明一下,这个类只不过是我的思想一个实现,不是标准,saveSelf(),你也可以写成saveXXX()。在使用时,根据具体环境实现该接口,比如saveSelf()方法你可以实现让它存储到数据库,文件等任何地方。我的一个实现就是:ThinObject持久方式采用的Thin。你可以使用hibernate/JPA。在实际开发中,让需要持久的对象继承ThinObject就可以了。
这里需要谈一个问题:“入侵”,首先说明一下什么叫“入侵”,入侵是指在某对象不需要某种事物的情况下,强行赋予了它该种事物。19世纪末八国联军进中国是“入侵”,但对外开放让外国人来中国做生意不算“入侵”;所以一个需要持久的对象继承了能够提供持久功能ThinObject也不算入侵。这恰是面向对象编程的优势。
没有必要太过于遵守条条框框,闭上眼睛想想,什么才是我们最想要的,才是发展起源。
[该贴被cuwkuhaihong于2011-02-01 18:10修改过]