函数参数是否违反封装?

时间:2016-03-07 08:41:12

标签: function parameters arguments encapsulation getter-setter

这个问题一般与OOP实践有关。 假设我们有一个带有公共函数的类,它接受来自对象外部的参数传递。这不是对封装本身的侵犯吗?另一方面,为什么这种做法如此广泛使用?在所有类和成员变量的构造函数都是" by-pass"在调用函数时。作为OOP的一个相对较新的程序员和我对封装的理解,我的函数参数通过setter传递给对象,因此我只使用传入的成员变量保留所有函数而不使用任何参数。 我知道某些参数可以通过构造函数传递(BTW,我使用依赖注入),但是如果这些参数在实例化对象后发生了变化呢?必须有一种方法可以在创建对象后更改这些值。到目前为止,我发现除了使用setter来完成这项任务之外别无其他选择,但是程序员之间有一个长期的讨论,关于getter和setter是" evil"或者至少认为没有良好的编程习惯。 任何人都可以告诉我在哪里错过了这一点以及如何以一种干净的方式解决这个难题? 非常感谢任何支持。

以下是使用C#的具体非常简单的示例:

我们在Windows窗体项目中有一个表单,其中包含3个文本框,名为textBox1,textBox2和textBox3。

任务是添加textBox1和textBox2的值,并使用由事件处理程序实例化的类AddTextboxValues将结果返回到textBox3,只要textBox1或textBox2的值发生更改:

我经常看到的方式并询问是否违反了封装:

 DirectoryInfo dInfo = new DirectoryInfo(@"C:\Test");
 var allDirs = dInfo.GetDirectories();
 var matchingDirs = allDirs.Where(info => Regex.Match(info.Name, "[0-9]", RegexOptions.Compiled).Success);   

根据我对封装的理解,这是我目前使用的方式:

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

这样做的好处是可以将它注入到表单构造函数中。

任何评论都非常感谢。

2 个答案:

答案 0 :(得分:0)

非常感谢Jon Skeet,你是​​一个真正的专业人士。 你确切地诊断了我的问题,并且因缺乏了解并找到解决我自己的问题的知识而睁开眼睛。这确实是对封装和对象状态"的更深入理解。它构建了我的谜题的缺失部分。 对我来说,现在一切似乎都是逻辑清晰的,我希望它在将来能帮助其他人。

答案 1 :(得分:0)

这两个例子都不是面向对象的编程。它们是程序编程的例子。

事实上,第一个“类”只是一个命名空间包装TextBoxValueSum函数。 第二个“类”只是一个带有公共字段的结构(getter-setters和public字段之间没有区别)。

如果你想使用真正的面向对象编程,你应该考虑对象,它们是 thing 的表示。 在你的情况下,我会编写课程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; }
}