Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Class 通过getter和setter(accessor)函数访问私有变量有什么意义?_Class_Oop_Object_Encapsulation - Fatal编程技术网

Class 通过getter和setter(accessor)函数访问私有变量有什么意义?

Class 通过getter和setter(accessor)函数访问私有变量有什么意义?,class,oop,object,encapsulation,Class,Oop,Object,Encapsulation,在类中,变量通常是私有的,用于封装,将变量限制在一定范围内可以更好地控制错误和减少bug。这是有道理的,因为可以访问变量的位置越少,该变量出现错误的位置就越少 然而,我总是看到变量变为私有,然后使用getter和setter函数检索该值(有时甚至是指向该变量的指针!)。例如,inta是私有的,以防止公共访问,但是getA()和setA()允许直接访问它们 那么,getter函数和setter函数不反对私有化吗?我的意思是带有访问器函数的私有变量与公共变量相同,只是访问它们的代码发生了变化。(ob

在类中,变量通常是私有的,用于封装,将变量限制在一定范围内可以更好地控制错误和减少bug。这是有道理的,因为可以访问变量的位置越少,该变量出现错误的位置就越少

然而,我总是看到变量变为私有,然后使用getter和setter函数检索该值(有时甚至是指向该变量的指针!)。例如,
inta
是私有的,以防止公共访问,但是
getA()
setA()
允许直接访问它们

那么,getter函数和setter函数不反对私有化吗?我的意思是带有访问器函数的私有变量与公共变量相同,只是访问它们的代码发生了变化。(object.variable vs object.getVariable())

人们使用访问器函数将变量设置为私有,这有什么原因吗?与公开相比有什么优势吗


我一般说的是编程,但大部分是C语言(即C、C++、C、Obj-C).< /P> < P>,因为如果你改变了那个变量的内部表示,或者在设置或检索时想做更多的事情,它不会破坏使用它的所有其他类(如果它是一个库,你就不必改变你的API)。


这还意味着您可以轻松设置断点,以查看何时使用它(尽管大多数语言/调试器都有某种类型的数据断点)。

可能您希望在库的下一个版本中添加一些检查(或在有人读取值时执行某些操作),以及变量是否在当前版本中是公共的,升级库版本将花费大量工作。

这里的关键词和标签是“封装”。您正在隐藏
a
的详细信息,同时仍使其可用。我喜欢已经列出的原因,还有很多。还有一个问题,您正在调试,发现
a
的值不正确。如果
a
是公共的,您必须检查
a
访问的每个地方。如果
a
对于setter方法是私有的,那么您知道
a
唯一可以更改的地方就是调用
setA()
-这将是放置断点的好地方;)

类定义了行为,成员是对象的状态……因此有一个setter和一个getter定义了类的封装行为,即让其他人发现/更改对象状态


换句话说,区别在于让你的邻居进入你家,拿走他想要的东西(公开课堂上的所有对象)…或者确保邻居来问我他想要什么,我给他(有一个getter/setter…)

为什么需要封装?为什么需要oop?难道C编程语言不能做我们今天所做的事情吗?问你自己。或者,如果您在拥有数百万行代码的大型系统上工作过。您所使用的是关键数据结构的公共变量,可从程序的每个模块访问。

当我开始学习面向对象编程时,我想到了同样的问题,因为在大多数书籍中,他们只是将变量设置为私有,并添加公共方法(Getter/setter)来访问它们,所以我在想,如果我可以通过公共的方法访问这个变量,那么让这个变量私有又有什么意义呢

当我开始实现实际的业务应用程序时,我得到了答案

让我们考虑一个班级学生,包括学生姓名,卷号,3个科目的标记< /P>
Class Student {

   private  int rollno;
    private int java_marks;
    private int cpp_marks;
    private int unix_marks;
    private int percentage;


    public int getJava_marks() {
        return java_marks;
    }
    public void setJava_marks(int java_marks) {
        if (java_marks > 100) {
            System.out.println("Marks value should be less than 100");
            //throw exception
        }
        this.java_marks = java_marks;
    }
    public int getCpp_marks() {
        return cpp_marks;
    }
    public void setCpp_marks(int cpp_marks) {
        if (cpp_marks > 100) {
            System.out.println("Marks value should be less than 100");
            //throw exception
        }
        this.cpp_marks = cpp_marks;
    }
    public int getUnix_marks() {

        return unix_marks;
    }
    public void setUnix_marks(int unix_marks) {
        if (unix_marks > 100) {
            System.out.println("Marks value should be less than 100");
            //throw exception
        }
        this.unix_marks = unix_marks;
    }
    public int getPercentage() {
        this.percentage = (this.cpp_marks + this.unix_marks + this.java_marks) /3;
        return percentage;
    }

    public int getRollno() {
        return rollno;
    }
    public void setRollno(int rollno) {
        this.rollno = rollno;
    }

} 
这里使用私有变量有两个原因

  • 验证: 如果用户为标记提供无效值,则学生对象不应使用无效数据创建,并引发相应的错误/异常。 在标记为公共变量的情况下,用户可以为其设置任何值,因此我添加了验证/安全性,以确保创建的severy student对象具有正确的数据

  • 保安 在百分比的情况下,用户不能设置自己的百分比。百分比是在内部计算和设置的。这里我没有为百分比提供setter方法,所以用户只能通过getter方法获取/读取百分比值


  • 这将导致抽象中的安全性,而抽象中的安全性仅限于(只读)访问类变量。

    这实际上取决于语言。在限制性OO语言(C++,java)中,GETSt/Stter是一个常见的习惯用法,而在C++这样的更自由的语言中,它们通常是很差的。问题是答案。根据处理器(如x86),调试器可以在任何写入变量上设置数据断点(或跟踪点),这将完成相同的事情。