2016-03-07 95 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