2009-12-10 115 views
3

考虑以下来源片段:面向对象的执行

片段#1

StoredProcedure sp = new StoredProcedure("PROC_NAME", getConnection()); 
    sp.putParameter("ID", getId()); 
    sp.execute(); 

片段#2

StoredProcedure sp = new StoredProcedure("PROC_NAME"); 
    sp.setConnection(getConnection()); 
    sp.putParameter("ID", getId()); 
    sp.execute(); 

片段#3

StoredProcedure sp = new StoredProcedure("PROC_NAME"); 
    sp.putParameter("ID", getId()); 
    sp.execute(getConnection()); 

问:哪个片段是最面向对象的,为什么?

问:每个片段有哪些优缺点?

+2

仅仅因为它在扰乱我 - 'sp.exeute'? – jball 2009-12-10 17:45:01

+0

修复了它。不再被窃听! :-) – 2009-12-10 17:59:37

+0

谢谢Andrzej! – jball 2009-12-10 18:11:57

回答

2

我的意见:没有,所有人都在同一时间。

所有代码片段显示了一个名为action的方法。总的来说,面向对象设计的一部分是每个方法只做一件事,方法名称反映了这一点。 action作为一个方法名称是不反射的,可以用作任何东西的一揽子标题。通过查看实际的功能,该方法显然应该被称为executeProcName

OO也有很多关于Law of Demeter,也被称为最小知识的原则。这意味着使用getter是一件好事,因为所有片段已经这样做了,它们实际上都是OO并且在这种情况下是相同的,就像jball says in his answer一样。如果我不得不选择我喜欢的那个,那么在最后可能的时刻获得所需的外部类/值(在这种情况下,它们确实会影响性能)或者#2是因为它是最容易阅读的。

这几乎是我认为可以说这一点,而没有深入学术语义。

+1

#3也意味着程序不需要在连接周围进行引用。从而减少它与该类的耦合。清理连接时,您不必担心删除此参考。 – reccles 2009-12-10 17:53:15

+0

删除了对action()方法的引用;是一个从片段中删减的容器。 – 2009-12-10 18:14:11

0

正如其他海报所提到的,这是一个高度优先的问题。

就我个人而言,我喜欢第一个,因为就连接而言,您显示的意图较早。你已经知道你将要执行getConnection的连接,为什么稍后设置呢?

p = new Person("Joe", "Smith");

是清楚不过

p = new Person(); 
p.setFirstName("Joe"); 
p.setLastName("Smith"); 

我想说取其最可读的给您的是最好的之一。

+0

第一个只有在你必须处理中间名时才有用。 Builder模式解决了这个问题。 – 2010-01-06 04:54:55