這個問題與一般的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;
}
}
這也有其優點,它可以注入到窗體構造函數中。
任何意見是非常感謝。
這將是有益的,如果你給一個具體的例子 - 這聽起來像你將對象的狀態與其他需要*處理的狀態混淆*。 (例如,日期格式化程序需要知道它意圖使用的格式,但它會通過「日期格式化」,而且這不是對象本身狀態的一部分。) –
那麼,這些是兩種不同的方式達到相同的結果 - 但是,您是否真的希望將文本框的值作爲類的一部分?你認爲在所有的情況下,他們應該是? –
你使用的是什麼定義的「封裝」會暗示它是通過使用方法參數「繞過」的? –