通常情況下,我有以下情況:我實現了一個只獲取一些輸入並返回輸出的算法。標準OO方法很可能是創建與輸入初始化的對象,然後調用一個方法在其上返回的結果(可能與「跑步」算法的中間步驟):使用類方法:在這個用例中它們是「邪惡的」嗎?
algo = MyAlgorithm.new(some_input)
algo.run
algo.result
有是我不喜歡這樣幾件事情:
每次我想使用這個類,我要記下所有的步驟,這是乏味的,很明顯。
我的對象有(至少)2種不同的狀態:在運行算法之前和之後。儘管我只對第二個狀態感興趣,但我必須在我的規格中覆蓋第一個狀態的行爲。如果我在第一個狀態中撥打
#result
怎麼辦?#run
冪等?我實際上違反了告訴不要問這裏:我要求班級給我一個對象,我用它來獲得我的問題的解決方案。爲什麼我不直接向班級詢問解決方案?
最天真的實現是隻做一個方法調用。當然,純粹的命令式編程在這裏並不理想,因爲使用對象是有好處的:我們可以分離在算法計算過程中使用的數據。但是,這不僅僅是一個實現細節,如果是的話,我們不應該隱藏這些信息嗎?
我想知道爲什麼不只是做這樣的事情:與類對象的一個方法調用
class MyAlgorithm
def self.solve(input)
new(input).instance_eval { run; result }
end
def initialize(input)
@input = input
end
private
def run
# do some computation (modifying the object's state)
end
def result
# return the result
end
end
這樣,我得到的唯一的事情我真的想(結果),無失去了面向對象的好處。我沒有任何公共實例方法,所以我不必擔心我的對象的不同狀態。而且,如果我願意,我甚至可以使.new
成爲私人方法。 (請注意,如果我對像運行時,迭代次數等報告感興趣,直接訪問對象是有道理的,但在這裏我只是對計算結果感興趣)。
現在我在這裏人們說「班級方法是邪惡的」(例如here和here)。但我認爲對於我的用例來說,類方法是正確的,不是嗎?另一方面,我想知道爲什麼我沒有看到其他人使用這種風格。也許我錯過了一些東西。這種設計有什麼缺點嗎?
downvoters幹界面有點更加詳細:請建設性並添加評論。 –