OOP是关于封装的全部
恩,那就对了。面向对象编程旨在将属性和方法封装到统一对象中,以便可以在对象上执行操作。整个目标是摆脱程序功能,这些功能不容易推理或证明是正确的。但是这个原则经常被违反,人们使用对象编写程序代码。这是一个经典的例子:
class Rectangle {
private Long length;
private Long breadth;
//gettters
//setters
//constructors
}
呼叫者通过以下方式计算面积:
Rectangle r = new Rectangle (3,4);
System.out.print("Area is: "+(r.getLength()*r.getBreadth());
这是滥用对象的一个非常糟糕的例子。事实上,这是程序性的,非封装的代码,恰好使用该对象。如果我们有一个空的构造函数,这个例子可能会更糟 Rectangle。
Rectangle r = new Rectangle();
r.setLength();
r.setBreadth();
再次,这是一个可怕的滥用对象。我们已经创建了一个关于其正确性/完整性无法推理的对象。我认为这种行为是鼓励的,因为我们一宣布一个类就开始编写一个空的构造函数和公共getter / setter。我意识到这确实是非常糟糕的做法。更重要的是,这是鼓励程序员违反构建OOP的基础的基础。
1.不要写空构造函数
不要让你的对象被创建statelesss。拥有空对象会使代码很难推理。你永远不能依赖于对象的状态。想象一下,发送你的朋友为你做点什么(例如煮咖啡),然后你的朋友去吧。但是等等,他不能走路,因为他没有腿,或者因为没有手而无法做好准备。看,你不能推理你的对象(朋友)的状态 - 除非有一个有效的,合理的场景(想到Jackson对象映射器)以避免使用空构造函数。
通过避免空构造函数,我们避免了对象可能处于不一致状态的情况。这也避免了程序员拥有公共设置者的情况。
2.不要在暴露所有吸气剂的情况下开始
通过暴露所有公众的吸气剂开始是非常方便和诱人的。但这严重违反了封装原则。我们可能真的需要一些公共吸气剂(toString想到),但只在严格要求时添加。
在你get离开一个物体之前,想一想为什么。你打算用这个价值做什么?你要计算一些东西吗?然后,将它建模为对象内的方法是不是更好。这将极大地提高代码中使用对象的一致性。
在上面的例子中,我们意识到我们需要Rectangle 在创建对象之后计算更长的区域 (一个有效的场景,我们不能总是有清晰的洞察力)。我们应该考虑是否可以通过仍然保持封装来获得,而不是获得长度和广度以及倍增。
良好封装的例子
class Rectangle{
private Long length;
private Long breadth;
public Rectangle(Long length, Long breadth){
this.length=length;
this.breadth=breadth;
}
public Long getArea(){
return this.length*this.breadth;
}
}
现在,这是相当好的封装。我们也没有空的构造函数和setter。我们可以公平地说,如果有一个矩形对象,它是一个一致且有效的对象。如果有人想要计算该对象的区域,则有一种一致的方法可以满足公共吸气剂的需求。
(想自学习编程的小伙伴请搜索圈T社区,更多行业相关资讯更有行业相关免费视频教程等待你来学习。完全免费哦! )