2014-10-03 45 views
1

我正在設計我的Web應用程序的服務層。我需要根據產品獲得訂單。Java API設計 - 按對象傳遞或按值傳遞

當我設計API時,是否應該按對象或值傳遞?

Order order = new Order(); 
String orderId = "1"; 
order.setId(orderId); 

List<Product> products = getProductByOrder(order); 

List<Product> products = getProductsByOrderId(orderId) 
+7

這些術語意味着完全不同的東西。你可能想澄清。 – 2014-10-03 14:40:36

+0

爲什麼不都有,因爲一個是從另一個派生出來的? (這裏主要是魔鬼的擁護者,我不知道額外的表面區域是否值得。) – 2014-10-03 14:42:18

+0

如果是我我會有一個映射其中String是orderId,然後獲取order/orderId(取決於你想要顯示什麼)通過使用orderID。 – nafas 2014-10-03 14:43:55

回答

3

嗯,我覺得你在做一些錯誤與此概念中,你正在爲這個目標,秩序和訂單ID引用這兩種方式(因爲字符串是一個對象了。)

但最好的方法這種情況下使用getProductsByOrderId(orderId),因爲你的代碼將鬆散耦合,因爲你的其他層不必知道一個Order對象,並只知道一個字符串對象。如果我們可以傳遞更簡單的對象作爲參數,我們可以。

從@Pienterekaak很好的例子張貼評論:

「在許多情況下,它更容易獲得只是一個訂單ID,那麼整個訂單的對象(例如,您將包括訂單ID在REST調用,不是整個訂單對象)「

+0

但它必須知道一個orderid,這是訂單的一部分。 Imo在Order類中實現它會更好,因此您可以調用List order這樣的屬性。產品 – Nicolas 2014-10-03 14:47:42

+1

這比僅傳遞訂單的效率要低。因爲現在你必須根據id查找訂單。額外的處理。如果您只是給訂單本身的指針,那麼就沒有查找。 – brso05 2014-10-03 14:49:22

+0

這就是要點,如果我通過orderid,接收的方法不需要知道它是訂單對象的一部分。如果我們可以傳遞更簡單的對象作爲參數,我們可以。順便說一句,好點@ brso05 - 直到你的評論 – 2014-10-03 14:51:14

1

從我的經驗,我會去的:

List<Product> products = getProductsByOrderId(orderId) 

有了說法,對於第一個呼叫,您需要一個Order對象,併爲第二個電話,你只需要一個ID號,很容易獲得。

1

其實這些都是傳遞的價值。 Java只能通過價值傳遞。在這兩種情況下,您都傳遞對象(字符串)或(訂單)的引用。您傳遞的值是該對象所在的內存位置(指針)。如果你傳遞的是像int這樣的基本類型,它會傳遞類似1的值,但是如果你正在傳遞一個對象,它會將指針的值傳遞給對象ie。內存位置。無論如何,你總是在傳遞價值。

如果您有一個存儲Order對象的Map,那麼傳遞Object本身實際上會更高效,因爲您直接傳遞該對象的指針。如果你傳遞的字符串ID爲1,你傳遞一個指向該字符串的指針,那麼你將不得不使用該字符串來查找你的Order對象,它實際上是添加更多的處理,然後直接傳遞一個指向對象的指針。

+0

你已經考慮過一個他們有'Map '的案例。其他情況呢?如果他們有'Map ',怎麼辦? – 2014-10-03 14:53:03

+0

在行之間閱讀有時你必須根據OP的要求推斷事情......我只是根據他的要求給了他一個例子。 – brso05 2014-10-03 14:57:38

+2

我不知道你在說什麼線路。你只是在考慮一種可能性而批評另一個答案,但在你的答案中做同樣的事情。 – 2014-10-03 15:06:45

0

OrderId屬於訂單的概念。如果您傳遞訂單ID,則產品必須知道訂單如何識別。這不是鬆散耦合的。

如果你把方法變爲有序,所以你可以調用像 列表order.Products 只有等級的概念都知道,產品和訂單是如何連接的,這聽起來我的權利屬性。 產品不應該知道任何關於訂單,但訂單應該知道產品。

如果您使用Hibernate,您可以將它配置爲使用一對多來完成它,因爲orderId是訂單表中的主鍵。