2016-03-07 178 views
0

這個問題與一般的OOP練習有關。 假設我們有一個接受來自對象外部參數的公共函數的類。這不是違反封裝本身嗎?另一方面,爲什麼這種做法被廣泛使用?在調用函數時,類和成員變量的所有構造函數都是「繞過」的。作爲OOP的一個相對較新的程序員和我對封裝的理解,我的函數參數通過setter傳遞給對象,這樣我就可以使用傳入的成員變量保留所有函數,而不使用任何參數。 我知道某些參數可以通過構造函數傳遞(順便說一句,我使用依賴注入),但是如果在實例化對象後這些參數發生了變化呢?創建對象後,必須有方法來更改這些值。到目前爲止,我沒有發現使用setter來完成這個任務的其他選擇,但是程序員之間長期以來討論的是getter和setter是「邪惡的」,或者至少被認爲沒有好的編程習慣。 任何人都可以告訴我在哪裏我錯過了這一點,以及如何以一種乾淨的方式解決這個困境? 非常感謝您的支持。函數參數是否違反封裝?

下面是一個使用C#的具體很簡單的例子:

我們有一個Windows窗體項目持有3個文本框,一個名爲textBox1的1和TextBox和textBox3一種形式。

任務是添加textBox1的1和TextBox的值,並使用由事件處理程序任何時候實例化textBox1的或TextBox2中的值更改類AddTextboxValues結果反饋給textBox3:

我經常看到它,並詢問是否方式是封裝的衝突:

public class AddTextBoxValues 
{ 
    public double TextBoxValueSum(double textBox1value, double textBox2Value) 
    { 
     return textBox1value + textBox2Value; 
    } 
} 

這是我使用的時刻按我封裝的理解方式:

public class AddTextBoxValues 
{ 
    private double textBox1Value; 
    private double textBoxValue2; 
    private double textBoxValue3; 

    public double TextBox1Value 
    { 
     set { textBox1Value = value; } 
    } 

    public double TextBoxValue2 
    { 
     set { textBoxValue2 = value; } 
    } 

    public double TextBoxValue3 
    { 
     get { return textBoxValue3; } 
    } 


    public void TextBoxValueSum() 
    { 
     textBoxValue3= textBox1Value + textBoxValue2; 
    } 

} 

這也有其優點,它可以注入到窗體構造函數中。

任何意見是非常感謝。

+0

這將是有益的,如果你給一個具體的例子 - 這聽起來像你將對象的狀態與其他需要*處理的狀態混淆*。 (例如,日期格式化程序需要知道它意圖使用的格式,但它會通過「日期格式化」,而且這不是對象本身狀態的一部分。) –

+0

那麼,這些是兩種不同的方式達到相同的結果 - 但是,您是否真的希望將文本框的值作爲類的一部分?你認爲在所有的情況下,他們應該是? –

+0

你使用的是什麼定義的「封裝」會暗示它是通過使用方法參數「繞過」的? –

回答

0

非常感謝Jon Skeet,你是​​一位真正的專業人士。 你確切地診斷了我的問題,並開啓了我的眼睛,因爲缺乏瞭解並找到自己問題的解決方案。這確實是對封裝和「對象狀態」的更深入的理解,這構成了我的謎題中缺失的一部分。 對於我來說,一切似乎都是邏輯和清晰的,我希望它也能在將來幫助別人。

0

這兩個例子都不是面向對象的編程。它們是程序編程的例子。

第一個「類」實際上只是一個命名空間包裝TextBoxValueSum函數。 第二個「類」只是一個結構與公共領域(getters-setters和公共領域之間沒有區別)。

如果你想使用真正的面向對象的編程,你應該想到的對象,他們是代表東西。 在你的情況,我會寫類Sum這是代表一個,具體金額是現實的事情:

class Sum { 
    private double a, b; 
    public Sum (double a, double b) { this.a = a; this.b = b; } 
    public double value() { return this.a + this.b; } 
} 
+0

我是否必須創建和處理總和類的每個和每個操作的對象?那麼,OOP如何處理依賴注入?如果DI在OOP中很重要,那麼下一個問題就出現了:問題在於,在初始化時,對象被注入到表單中而不知道操作數,只有當表單被創建並且需要在整個生命週期中改變輸入值(這相當於表單的生命週期),以在文本框值發生變化時生成新的總和。那麼如何在創建對象後更改值? – user3079832

+0

您可以使用工廠(它不僅可以創建'Sum'對象,還可以創建一些不同的對象,如「差異」等)並注入它。 'void clientFunction(NumberFactory numFactory){ double sum = numFactory.sum(textBox1.value,textBox2.value).value(); }' –

+0

好東西,謝謝! – user3079832