2009-12-10 31 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