簡體   English   中英

為什么在Java中使用類作為結構不良實踐?

[英]Why is using a class as a struct bad practice in Java?

我們最近進行了代碼審查。 我使用了其中一個類,以便我可以從/向方法返回/傳遞多種類型的數據。 該類唯一的方法是getter / setter。 團隊的一名成員(我尊重他的意見)說,擁有這樣的課程是不好的做法(而不是非常OOP)。 這是為什么 ?

有一種觀點認為類應該是“數據結構”(即,專注於存儲沒有功能的數據)或“功能導向”(即,專注於在存儲最小狀態時執行某些操作)。 如果你遵循那個論點(這是有道理的,但並不總是那么容易),那么就沒有什么不妥。

實際上,人們會認為bean和實體bean本質上就是 - 具有getter和setter的數據容器。

我已經看到某些來源(例如,書籍“干凈的代碼”)認為應該避免使用具有多個參數的方法,而是將它們作為具有getter和setter的單個對象傳遞。 這也更接近命名參數的“smalltalk模型”,其中順序無關緊要。

所以我認為如果使用得當,你的設計是有道理的。

請注意,這里有兩個不同的問題。

  1. “結構式”類是否合情合理?

  2. 創建一個類來從一個合理的方法返回多個值?

類似結構的類

對象類應該 - 在大多數情況下 - 代表一類真實世界的對象。 一個被動的,類似結構的java bean(所有getter和setter) 可能代表一個真實的東西。

然而,大多數現實世界的事物都有規則,約束,行為和基本動詞。 類似結構的類很少與現實世界相匹配,它通常是一些技術性的東西。 這使得它不如理想的OO設計。

從方法返回多個

雖然Python有這個,但Java沒有。 多個返回值是不是OO問題, 本身 這是一個解決語言限制的問題。

多個返回值可能意味着對象已更改狀態。 也許一種方法改變狀態,一些吸氣劑組返回源於這種狀態變化的值。

說實話,對我來說聽起來不錯。 評論者提出了哪些替代方案?

遵循OOP“最佳實踐”,一切都很好,但你必須務實,實際上完成工作。

在某些情況下,使用像這樣的值對象(OO代表'struct')是一種完全合法的方法。

通常,您需要將操作類所需的知識與類本身隔離開來。 如果你有一個這樣的類,它可以在多個地方使用,因此可以在這兩個地方承擔一些功能,或者它在一個地方,並且應該是一個內部類。 如果它以多種方式使用,但以完全不同的方式使用,使得沒有共享功能,將其作為單個類具有誤導性,表明沒有共享功能。

但是,這些一般規則可能適用或不適用的具體原因通常都有,因此這取決於您的課程應該代表什么。

我認為他可能會因為不良做法而混淆“不是非常OOP”。 我認為他希望你提供幾種方法,每種方法都返回一個需要的值(因為你必須在你的新類中使用它們,不管怎么說都不錯)。

請注意,在這種情況下,您可能不應該使用getter / setter,只需將數據公開。 不,這是“不是非常OOP”,但這是正確的方法。

也許Josh Bloch 在這里提供了一些見解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM