Oop 在什么情况下应该使用公共字段而不是属性?
可能重复:Oop 在什么情况下应该使用公共字段而不是属性?,oop,encapsulation,public-fields,Oop,Encapsulation,Public Fields,可能重复: 在什么情况下应该使用公共字段,而不是属性或getter和setter方法(在不支持属性的情况下)?具体建议在哪里使用它们,以及为什么,或者,如果不是,为什么它们仍然被允许作为一种语言特性?毕竟,它们打破了允许并鼓励使用getter和setter的面向对象封装原则。如果有一个常量需要公开,那么最好将其设置为公共字段,而不是为其创建getter属性 除此之外,就良好的OOP原则而言,我认为没有必要 它们是存在的,是允许的,因为有时候你需要灵活性 如果有一个常量需要是公共的,那么最好将其
在什么情况下应该使用公共字段,而不是属性或getter和setter方法(在不支持属性的情况下)?具体建议在哪里使用它们,以及为什么,或者,如果不是,为什么它们仍然被允许作为一种语言特性?毕竟,它们打破了允许并鼓励使用getter和setter的面向对象封装原则。如果有一个常量需要公开,那么最好将其设置为公共字段,而不是为其创建getter属性 除此之外,就良好的OOP原则而言,我认为没有必要
它们是存在的,是允许的,因为有时候你需要灵活性 如果有一个常量需要是公共的,那么最好将其设置为公共字段,而不是为其创建getter属性 除此之外,就良好的OOP原则而言,我认为没有必要
它们是存在的,是允许的,因为有时候你需要灵活性 如果编译器没有优化getter和setter调用,那么对属性的访问可能比读写字段(调用堆栈)更昂贵。如果您执行很多很多调用,这可能是相关的 但是,老实说,我不知道哪种语言是正确的。至少在.NET和Java中,这都得到了很好的优化 从设计的角度来看,我不知道推荐使用字段的情况 干杯
Matthias如果编译器没有优化getter和setter调用,那么对属性的访问可能比读取和写入字段(调用堆栈)更昂贵。如果您执行很多很多调用,这可能是相关的 但是,老实说,我不知道哪种语言是正确的。至少在.NET和Java中,这都得到了很好的优化 从设计的角度来看,我不知道推荐使用字段的情况 干杯
Matthias这很难说,但在我看来,公共字段只有在使用结构时才有效
struct Simple
{
public int Position;
public bool Exists;
public double LastValue;
};
但不同的人对以下方面有不同的想法:
这很难说,但在我看来,公共字段只有在使用结构时才有效
struct Simple
{
public int Position;
public bool Exists;
public double LastValue;
};
但不同的人对以下方面有不同的想法:
让我们首先看看为什么需要访问器(getter/setter)的问题?您需要它们能够在分配新值/读取值时覆盖行为。您可能希望添加缓存或返回计算值,而不是属性
你的问题现在可以形成,就像我总是想要这种行为一样?我能想到这样做根本没有用的情况:结构(C中的
struct
s)。传递一个或一个包含多个值的类以插入到中的情况实际上不需要访问器:对象仅仅是变量的容器。让我们先看看为什么需要访问器(getter/setter)?您需要它们能够在分配新值/读取值时覆盖行为。您可能希望添加缓存或返回计算值,而不是属性
你的问题现在可以形成,就像我总是想要这种行为一样?我能想到这样做根本没有用的情况:结构(C中的struct
s)。传递一个或一个包含多个值的类以插入到中的情况实际上不需要访问器:对象只是变量的容器。使用get而不是public字段有一个原因(*):延迟求值。也就是说,您想要的值可能存储在数据库中,或者计算时间可能很长,并且不希望您的程序在启动时对其进行初始化,但仅在需要时进行初始化
为什么使用set而不是public字段只有一个原因(*):其他字段修改。即,当您更改目标字段的值时,您会更改其他字段的值
强制在每个领域使用get和set是与原则相矛盾的
如果要从对象中公开字段的值,请公开它!创建一个具有四个独立字段的对象,并强制所有字段都使用get/set或properties访问,这是完全没有意义的
*:其他原因(如可能的数据类型更改)是没有意义的。事实上,无论您在哪里使用a=o.get\u value()
而不是a=o.value
,如果您更改get\u value()
返回的类型,每次使用时都必须更改,就像您会更改value的类型一样,使用get而不是公共字段有一个原因(*)那就是惰性评估。也就是说,您想要的值可能存储在数据库中,或者计算时间可能很长,并且不希望您的程序在启动时对其进行初始化,但仅在需要时进行初始化
为什么使用set而不是public字段只有一个原因(*):其他字段修改。即,当您更改目标字段的值时,您会更改其他字段的值
强制在每个领域使用get和set是与原则相矛盾的
如果要从对象中公开字段的值,请公开它!创建一个具有四个独立字段的对象,并强制所有字段都使用get/set或properties访问,这是完全没有意义的
*:其他原因(如可能的数据类型更改)是没有意义的。事实上,无论您在哪里使用a=o.get\u value()
而不是a=o.value
,如果您更改get\u value()
返回的类型,每次使用时都必须更改,就像您会更改value
的类型一样,主要原因与OOP封装无关(尽管人们经常说是这样),以及与版本控制有关的所有内容
事实上,从OOP的立场来看,可以说字段是