2017-05-04 17 views
2

我最近幾個月從頭開始重寫我的Python算法的新版本。我的目標之一是編寫完善的文檔代碼,易於閱讀和理解「任何人」。使用類作爲函數和「全局」變量容器:糟糕的設計?

在同一個項目文件夾中,我放了很多不同的模塊,每個模塊都包含一個類。我使用類作爲函數和相關變量容器,這樣一個類包含具有特定任務的所有函數,例如在Excel文件上打印算法的所有輸出結果。

下面的例子:

Algorithm.py

import os 
import pandas as pd 
import numpy as np 
from Observer import Observer 


def main(hdf_path): 

    for hdf_file in os.listdir(hdf_path): 

     filename = str(hdf_file.replace('.hdf', '.xlsx')) 
     Observer.create_workbook(filename) 

     dataframe = pd.read_hdf(hdf_file) 
     years_array = dataframe.index.levels[0].values 

     for year in years_array: 
      year_mean = np.mean(dataframe.loc[year].values) 
      Observer.mean_values = np.append(Observer.mean_values, dataframe_mean) 

     Observer.export_result() 

if __name__ == "main": 

    hdf_path = 'bla/bla/bla/' 
    main(hdf_path) 

Observer.py

import numpy as np 
import openpyxl 


class Observer: 

    workbook = None 
    workbookname = None 
    mean_values = np.array([]) 


    def create_workbook(filename): 

     Observer.workbook = openpyxl.Workbook() 
     Observer.workbookname = filename 
     # do other things 

    def save_workbook(): 

     Observer.workbook.save('results_path' + Observer.workbookname) 

    def export_results(): 

     # print Observer.mean_values values in different workbook cells 
     # export result on a specific sheet 

我希望你可以從這個簡單的例子,我怎麼用理解我的項目上課。對於每個類我定義了很多變量(例如工作簿),並且我將它們從其他模塊中調用,就好像它們是全局變量一樣。通過這種方式,我可以從任何地方輕鬆訪問它們,而且我不需要將它們明確地傳遞給函數,因爲我可以簡單地編寫Classname.varname。

我的問題是:這是不好的設計?它會造成一些問題或性能下降嗎?

感謝您的幫助。

回答

2

我的問題是:它是不好的設計?

是的。

我可以簡單地寫入Classname.varname。

當您強制呼叫Classname.varname時,您正在創建非常強大的coupling類。訪問此變量的類現在與Classname強耦合。這會阻止你通過傳遞不同的參數來改變OOP方式的行爲,並會使類的測試複雜化 - 因爲你將無法模擬Classname並使用它的模擬而不是「真實」類。

當您嘗試在應用程序的兩個部分中運行2個非常類似的代碼時,這會導致代碼重複,這些代碼在這些參數中只有不同的部分。你最終會創建兩個幾乎相同的類,一個使用Workbook,另一個使用Notepad類。

記住的惡性循環:

Hard to test code -> Fear of refactor -> Sloppy code 
^         | 
    |          | 
    --------------------------------------- 

使用合適的對象,有能力嘲笑他們(和dependency injection)是要保證你的代碼容易測試,其餘的將隨之而來。

+0

感謝您的回答。我會重寫所有的東西,試圖只使用模塊的功能,因爲你很可能理解,我不需要上課。只是好奇,我的設計是否以任何方式折磨演出?謝謝。 – ilpomo