8
回答
都说private等,除了public外是安全的声明,请问怎么安全了
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

都说private是等非public是安全的声明,因为外部访问不到,但是请问怎么安全了?

如 private  外部是无法 访问到 private 声明的 变量的。

但是 外部如果需要使用到  就 需要 写 set  get方法 

写了  set  get 外部还是可以访问到的 ,那么请问  此时 这种情景 还是安全的吗

再问一个 小问题    如何 制造一些 不安全的场景   来证明  public 会带来 哪些危险

举报
浮生若梦e
发帖于9个月前 8回/463阅

比如游戏里面一个人的血量,血量最大值1000,最小是0.

假如我们在外界随意访问它,修改它,会造成很多的逻辑错误。

classs one

private static int blood

public set blood {

 if (blood> 1000)
      {
          blood= 1000;
      }
 if (blood<0)

   {

    blood= 0;

   }  
}

public get blood() {return blood}

主要是把逻辑错误处理掉了,这样的话,外界无法访问里面的blood变量,只能通过这些set get方法来调用增加血量,减少错误,否则外界类直接 blood=blood+10000  blood=blood-150000,这样造成很多逻辑问题, 这也是封装的一种方法,大大减少外界逻辑代码量的判断,否则你得每次判断是否大于1000,是否小于0,这样便于构架设计。

在很多人设计的时候,这种方式就有用处了,一个是防范别人随意修改引起各种逻辑错误,一个减少代码量。

比如下面的一个类:

class one {

private static int blood

}

 

import one

class Action {

public setEatPig(){

one.blood=one.blood+100 //这里需要判断是否大于1000 

if (>1000){}

 }

public setEatBread(){

one.blood=one.blood+30 //这里需要判断是否大于1000 

if (>1000){}

 }

public setHurt(){

one.blood=one.blood-15// 受到伤害,判断时候小于0

if (<0){}

 } 

}

进行这些动作

你是不是每步得判断是否大于1000,小于0? 但是setblood已经限制了这一步。

 

set/get是获取设置的当前实例。

如果是static类型当我没说

--- 共有 1 条评论 ---
浮生若梦epublic 声明的变量 和 get得到的private 外部 都可以 得到 变量 请问 有什么不同呢 9个月前 回复

这完全和“安全”八竿子打不着

public/private是用于控制内部变量的可见性,目的是限制对这个类的使用方式,避免产生错误的逻辑。

--- 共有 4 条评论 ---
乌龟壳 回复 @浮生若梦e : 代码写到后面越来越多,包括多人开发也是一样,约束、类型都是为了让代码更清晰,并且避免人为错误。 9个月前 回复
乌龟壳 回复 @浮生若梦e : 比如你类里有一个init()函数,只用在初始化,如果public,别人在你类跑到半截不小心又初始化了一次就不好了。比如你的类里有一个数据库连接字符串string a,它只需要在初始化的时候设置一次,然后你把a设置成public,结果a在运行中被改了,这样比如通过分析a得到的数据库信息和通过sql在数据库执行的效果,就不一致了。 9个月前 回复
浮生若梦e限制对这个类的使用方式 可以详细些吗 9个月前 回复
浮生若梦e但是 网上 private 安全 相关的话题 还是挺多的 9个月前 回复

变量设置private,通过get set方法提供可以让变量可控,假如有个年龄的变量,直接public的话,别人就有可能把它写成负值,但如果是提供一个方法,你可以在方法中增加判断条件,不满足条件的都不让修改,程序也就更可控了,尤其是多人协作的时候,别人不一定知道你的参数有没有约束,所以什么情况都有可能发生

引用来自“大洋的顶端”的评论

比如游戏里面一个人的血量,血量最大值1000,最小是0.

假如我们在外界随意访问它,修改它,会造成很多的逻辑错误。

classs one

private static int blood

public set blood {

 if (blood> 1000)
      {
          blood= 1000;
      }
 if (blood<0)

   {

    blood= 0;

   }  
}

public get blood() {return blood}

主要是把逻辑错误处理掉了,这样的话,外界无法访问里面的blood变量,只能通过这些set get方法来调用增加血量,减少错误,否则外界类直接 blood=blood+10000  blood=blood-150000,这样造成很多逻辑问题, 这也是封装的一种方法,大大减少外界逻辑代码量的判断,否则你得每次判断是否大于1000,是否小于0,这样便于构架设计。

在很多人设计的时候,这种方式就有用处了,一个是防范别人随意修改引起各种逻辑错误,一个减少代码量。

比如下面的一个类:

class one {

private static int blood

}

 

import one

class Action {

public setEatPig(){

one.blood=one.blood+100 //这里需要判断是否大于1000 

if (>1000){}

 }

public setEatBread(){

one.blood=one.blood+30 //这里需要判断是否大于1000 

if (>1000){}

 }

public setHurt(){

one.blood=one.blood-15// 受到伤害,判断时候小于0

if (<0){}

 } 

}

进行这些动作

你是不是每步得判断是否大于1000,小于0? 但是setblood已经限制了这一步。

 

感谢回答。

所谓的安全,只是代表你是否需要再次对这个的值做验证,public可被其它人更改,所以每次用都要检查,私有的就没这问题,就算更改了,也是在你的规则之下,所以才会安全,反射不讨论

--- 共有 1 条评论 ---
浮生若梦e恩 是的 8个月前 回复

get()和set()里如果只写一个赋值语句,那private确实和public没两样,set里面加上条件限制应该就是安全的。只写一个简单的赋值,从代码上看确实没有private的意义。

--- 共有 1 条评论 ---
浮生若梦e 8个月前 回复
顶部