2017-08-15 84 views
1

我讀過很多關於「public vs getter/setter」的文章,但我仍然懷疑是否有關於公共變量的任何好的部分。公有變量是不是很糟糕?

或者問題是:

如果你打算做一個新的真棒編程的語,你仍然要支持公共變量,爲什麼?

回答

1

公共變量本質上意味着您在對象的範圍內具有全局可訪問/可變的變量。這真的有用例嗎?舉個例子:你有一個DatabaseQueryHandler類,它有一個變量databaseAccessor。在什麼情況下,你會希望此變量是:

  1. 可公開訪問的(即gettable)
  2. 公開設定

選項#1我能想到的幾個 - 你可能想要得到的插入操作後的最後一個插入ID,您可能想要檢查生成的最後一個查詢,提交或回滾事務等的任何錯誤,並且將這些方法寫入類DatabaseAccessor而不是DatabaseQueryHandler可能更符合邏輯。

選項#2是不太理想的,特別是如果你正在做的OOP和SOLID原則遵守,特別是關於該 SP和d IP原則。在那種情況下,您想在DatabaseQueryHandler中設置變量databaseAccessor?可能只在施工中,並且在此之後從未有過。您可能還希望它在界面級別上進行類型提示,以便您可以編寫界面。另外,你爲什麼要需要一個任意的對象能夠改變數據庫訪問?如果Foo將變量DatabaseQueryHandler->databaseAccessor更改爲NULL,然後Bar嘗試呼叫DatabaseQueryHandler->databaseAccessor->beginTransaction(),會發生什麼情況?

我只是在這裏舉一個例子,它絕不是子彈的證明。我用PHP編程(閃避爛果子),並考慮到語言的鬆散,非常重視OOP和SOLID。我確信圍欄兩邊會有爭論,但我會說,如果你正在考慮使用公共類變量,而不是考慮實際需要訪問它,以及如何使用該變量。在大多數情況下,可以通過公共方法暴露功能,而不允許意外更改變量類型。

0

簡單的回答是:是的,他們是不好的。有很多原因,如耦合和不可否認的代碼。在實踐中,你不應該使用它們。在OOP公共變量替代爲Singleton,這被認爲是一個不好的實踐。檢查出here

0

它與封裝有很大關係。你不希望你的變量被訪問。其他語言如iOS(objective-c)使用屬性:

@property(nonatomic,strong)NSArray * array;

然後編譯器會隱式地生成帶有getter和setter的實例變量。在這種情況下,不需要使用變量(儘管其他開發人員仍然傾向於使用變量)。然後,您可以通過在.h文件中聲明該屬性或通過在.m文件中聲明該屬性來公開該屬性。

1

我同意幾乎一切的被其他人說,但想補充一點:

公衆是不會自動不錯。公衆是壞的,如果你正在寫一個對象類。 數據類就好了。這個班沒什麼問題:

public class CommentRecord 
{ 
    public int id; 
    public string comment; 
} 

...爲什麼?因爲該類不是使用任何東西的變量。這只是一個數據對象 - 這是意味着是隻是一個簡單的數據存儲庫。

但有絕對有毛病這個類:

public class CommentRecord 
{ 
    public int id; 
    public string comment; 
    public void UpdateInSQL() 
    { 
     // code to update the SQL table for the row with commentID = this.id 
     // and set its UserComment column to this.comment 
    } 
} 

...這是爲什麼不好?因爲它不是數據類。這是一個類,實際上它的變量做的東西 - 因爲這一點,使他們的公共部隊使用類知道類的內部人。在使用的人需要知道:「如果我想更新自己的評論,我必須要改變公共變量,但更改ID,然後調用UpdateInSQL()方法。」更糟糕的是,如果他們搞砸了,他們會以一種無意的方式來使用這門課程,並且這種方式會導致未預料到的後果!

如果您想了解更多關於此的信息,請參閱Robert Martin,第6章關於「Data/Object Anti-Symmetry」的Clean Code

相關問題