2013-10-06 59 views
0

這是一個關於面向對象編程的常見問題,我將使用下面的簡化示例來說明它。在類中迭代或迭代類實例?

每天在FTP站點上傳文件。根據文件上傳日期,文件被賦予一個名稱。所以,我們有Day1.txt,Day2.txt等等。 我創建了一個一次下載一個文件的類。所以當我調用這個類的實例時,會根據給定的參數下載一個文件。例如: downloading_class("2")將下載Day2.txt

現在,我想通過從開始日期到結束日期下載一系列文件來擴展我的程序的功能。很明顯,我將使用for循環。 我的問題是:這是一個很好的做法,在for環整合類中,然後調用這個類的一個實例,像這樣的東西:

downloading_class("2","10") 

寫一個for循環外班並在環路中集成實例:

for i in range(start,end): 
    downloading_class(i) 

爲什麼它會更好一些?

+0

問題是,你做了多少?如果你反覆做某件事,把它抽象成一個函數。如果你只做了一次,這可能不值得這樣做。 –

+0

@Lattyware該程序意圖在每次使用時下載用戶定義的各種文件(例如100)。這是你問的嗎? – multigoodverse

+1

通常情況下,你用一個參數來調用然後消失的東西不是一個類,而是一個函數。當然,你可以創建一個類似功能的類,或者其對象像函數一樣行事的類,但是......你爲什麼要這樣做? – abarnert

回答

1

如果你想定義一些在一系列文件上執行的操作,那麼有一個代表一系列文件的類是有意義的。這並不意味着你應該將它整合到代表一個文件的類中,但是,你可以寫兩個類!

但是,要小心地考慮這些操作是否僅適用於連續範圍的日期順序,而不是以任何順序應用於任何舊文件集合。如果他們可以應用於任何舊的文件集合,那麼你可能會更好地堅持與你的班級代表一個文件。然後編寫一些其他函數對文件的列表(或其他可迭代的文件)進行操作,以便進行any-old-collection操作,並且爲了方便起見編寫一個函數以返回最常見的情況(以日期順序爲範圍)。然後,代碼可以是這樣的:

for file in download_range("2", "10"): 
    do_something_with_one(file) 

或你做一個地方的情況下,預先定義的任何大的採集操作:

do_something_with_many(download_range("2", "10")) 

在這兩種情況下,你可以將其替換download_range("2", "10")(downloading_class("2"), downloading_class("4"), downloading_class("6"))reversed(download_range("2", 10"))(file for file in download_range("2", "10") if file.size() < 1000)。或者你喜歡的任何東西,這是設計可以靈活使用的API的目標。

+0

實例化多次而不是在類內迭代可能會更加兼容多處理模塊? – multigoodverse

1

我不認爲這種情況下的性能受實例化對象影響很大,但通常情況下,我認爲最好實例化一次,並使用N次而不是實例化並使用N次。