通过将功能放入一个函数中,单独构成一个封装示例还是需要使用对象进行封装?
我试图理解封装的概念.如果我从这样的事情出发,我的想法是:
n = n + 1
作为大量代码的一部分在野外执行,然后我把它,并把它放在像这样的函数中,然后我在一个方法中封装了这个加法逻辑:
addOne(n) n = n + 1 return n
或者更多的情况是,如果我从外部世界隐藏addOne的细节,它只是封装 - 就像它是一个对象方法,我使用私有/受保护的访问修饰符?
我将是第一个不同意似乎是答案趋势的人.是的,一个函数封装了一些实现.你不需要一个对象(我认为你用它来表示一个类).
见迈耶斯.
也许你将抽象与封装混淆,后者在更广泛的面向对象的背景下被理解.
封装正确包括以下所有三个:
抽象化
实施隐藏
责任分工
抽象只是封装的一个组成部分.在您的示例中,您已经从它曾经驻留的代码主体中抽象出了添加功能.您可以通过识别代码中的某些共性 - 在特定情况下识别概念(添加)(将第一个添加到变量n)来实现此目的.由于这种能力,抽象使封装组件 - 方法或对象 - 可重用.
对封装概念同样重要的是实现隐藏的想法.这就是在面向对象领域中讨论封装的原因.实现隐藏保护对象免受其用户的影响,反之亦然.在OO中,您可以通过向对象的用户提供公共方法的接口来实现此目的,而对象的实现则在私有方法中进行.
这有两个好处.首先,通过限制对对象的访问,可以避免对象的用户将对象置于无效状态的情况.其次,从用户的角度来看,当他们使用您的对象时,他们只是松散地耦合到它 - 如果您稍后更改您的实现,它们不会受到影响.
最后,在OO设计的更广泛的背景下,责任划分是必须考虑的因素,以正确地解决封装问题.封装随机函数集是没有用的 - 责任需要干净地和逻辑地定义,以便尽可能少地重叠或模糊.例如,如果我们有一个Toilet对象,我们将希望从Kitchen对象中消除其职责范围.
但是,在一个有限的意义上,你是正确的,一个函数,比方说,通过抽象来"模块化"一些功能.但是,正如我所说,作为一个术语的"封装"在更广泛的面向对象的背景下被理解为适用于满足上面列出的三个标准的模块化形式.
当然是啦.
例如,仅对其参数进行操作的方法将被认为比对全局静态数据进行操作的方法"更好地封装".
封装已经在OOP之前很久了:)