2013-03-09 37 views
3

當編寫一個具有不同函數的python類來獲取數據和解析數據時,什麼是最正確的方法? 您可以編寫它,以便逐個填充self.data ...,然後運行解析函數來填充self.parsed_data ....或者編寫接受self.data的函數並返回self.parsed_data ..?用正確的方式編寫大型python類

下面的例子。 MyClass1填充self.variables,MyClass2將它們作爲參數。 我認爲MyClass2是「最」正確的。

那麼,什麼是正確的?爲什麼?我一直在試圖決定這兩種編碼風格中的哪一種。但我想知道哪些被認爲是最佳實踐。

class MyClass1(object): 
    def __init__(self): 
     self.raw_data = None 

    def _parse_data(self): 
     # This is a fairly complex function xml/json parser 
     raw_data = self.raw_data 
     data = raw_data # Much for is done to do something with raw_data 
     cache.set('cache_key', data, 600) # Cache for 10 minutes 
     return data 

    def _populate_data(self): 
     # This function grabs data from an external source 
     self.raw_data = 'some raw data, xml, json or alike..' 

    def get_parsed_data(self): 
     cached_data = cache.get('cache_key') 
     if cached_data: 
      return cached_data 
     else: 
      self._populate_data() 
      return self._parse_data() 

mc1 = MyClass1() 
print mc1.get_parsed_data() 


class MyClass2(object): 
    def _parse_data(self, raw_data): 
     # This is a fairly complex function xml/json parser 
     data = raw_data # After some complicated work of parsing raw_data 
     cache.set('cache_key', data, 600) # Cache for 10 minutes 
     return data 

    def _get_data(self): 
     # This function grabs data from an external source 
     return 'some raw data, xml, json or alike..' 

    def get_parsed_data(self): 
     cached_data = cache.get('cache_key') 
     if cached_data: 
      return cached_data 
     else: 
      return self._populate_data(self._get_data()) 

mc2 = MyClass2() 
print mc1.get_parsed_data() 

回答

2

最後是個人喜好。但國際海事組織,最好只有一個模塊級別的函數parse_data,它接收原始數據,做一堆工作並返回解析的數據。我假設你的緩存鍵是從原始數據派生的,這意味着parse_data函數也可以實現你的緩存邏輯。

我更喜歡的功能VS具有完全成熟的類的原因是簡單性。如果你想有一個類提供從你的原始數據中提取的數據字段,那麼你的對象的用戶可以做類似obj.some_attr的事情,而不必去查看一些較低級別的數據結構(例如JSON,XML,Python字典等等。),我會做一個簡單的「值對象」類只包含數據字段和沒有分析邏輯,並有上述parse_data函數返回這個類的一個實例(基本上充當您的數據類工廠函數) 。這導致更少的狀態,更簡單的對象和不懈怠,讓您的代碼更容易推理。

這也使其更易於單元測試消費者這一類的,因爲在這些測試中,你可以簡單地用領域實例,而不必提供試驗原始數據的大斑點的數據對象。

0

的第二種方法是優選的,因爲(如果我正確理解)它在效率和結果相同的,但避免了對原始數據的實例成員。一般而言,您希望減少存儲在對象中的數據量,因爲每個額外的屬性意味着更加擔心隨時間的一致性。

換句話說,它是「更多功能」。

0

想想這個問題是這樣的:如果不是有兩個方法,你結合這一邏輯成一個長的方法,你會跟蹤原始數據,它被解析後?如果答案是肯定的,那麼把它作爲一個屬性存儲是有意義的。但是如果你在那之後不再關心它,那麼更喜歡第二種形式。將你的邏輯部分分解爲「輔助」子例程應該最好避免對其他方法可能需要關心的類進行更改。

1

對我來說最正確的類是用戶理解類,並用儘可能少的錯誤,可能的用途。

當我看第二課時,我問自己我會如何使用它...

mc2 = MyClass2() 
print mc1.get_parsed_data() 

我想只有

print get_parsed_data() 

有時,最好是到not write classes可言。

+0

+1的鏈接:P – root 2013-03-09 14:08:05

+0

這個例子不應該是一個類。但它是另一個類的簡單版本,應該是一個類:)但是,感謝鏈接,不應該僅僅因爲我們可以使用類。 – xeor 2013-03-09 14:39:30

相關問題