Perl中的封装是包装数据的过程, 以保护数据免受外部源的侵害, 这些外部源不需要访问代码的那部分。封装是其中的一部分
面向对象编程
, 它用于绑定数据和用于处理该数据的子例程。
以另一种方式, 封装是一种保护性屏蔽, 可防止该屏蔽之外的代码访问数据。
- 从封装技术上讲, 一个类的变量或数据对任何其他类都是隐藏的, 并且只能通过声明了它们的自身类的任何成员函数来访问。
- 与封装一样, 一个类中的数据对其他类是隐藏的, 因此也称为数据隐藏.
- 封装可以通过以下方式实现:通过导入用于设置和获取变量值的包, 将类中的所有变量声明为类的局部和获取方法。
考虑一个封装的真实示例, 在公司中, 有不同的部分, 例如帐户部分, 财务部分, 销售部分等。财务部分处理所有财务交易并保留与财务相关的所有数据的记录。同样, 销售部门处理所有与销售有关的活动, 并保留所有销售记录。现在可能会出现这样的情况:出于某种原因, 财务部门的官员需要特定月份的所有销售数据。在这种情况下, 不允许他直接访问销售部分的数据。他将首先必须联系销售部门的其他人员, 然后要求他提供特定数据。这就是封装。在这里, 销售部门和可以操纵它们的员工的数据被包装在一个单独的名称"销售部门"下。
例子:
# Declaration and definition of Base class
use strict;
use warnings;
package Student;
sub new
{
# shift will take package name 'Student'
# and assign it to variable 'class'
my $class = shift ;
my $self = {
'name' => shift , 'age' => shift , 'roll_no' => shift
};
# Bless function to bind object to class
bless $self , $class ;
# returning object from constructor
return $self ;
}
# Method for displaying the details
sub get_details
{
my $self = shift ;
print "Name is: $self->{'name'}\n" ;
print "Age is: $self->{'age'}\n" ;
print "Roll_no is: $self->{'roll_no'}" ;
}
# Object creation and calling
my $obj1 = Student->new( "Rahul" , 25, 12);
$obj1 ->get_details();
输出如下:
Name is: Rahul
Age is: 25
Roll_no is: 12
在上面的代码中, 如果需要访问类的数据进行任何修改或仅打印类的数据, 则无法直接完成。需要创建该类的对象, 然后使用get_details()方法访问数据。此过程称为数据封装.
封装的优点:
- 资料隐藏:用户将不了解类的内部实现。用户将看不到类如何在变量中存储值。他只知道我们正在将值传递给访问器, 并且变量已被初始化为该值。
- 更高的灵活性:我们可以根据需要将类的变量设置为只读或只写。如果我们希望将变量设置为只读, 则只需在代码中使用Get Accessor。如果我们希望将变量设置为只写, 则只需要使用Set Accessor。
- 可重用性:封装还提高了可重用性, 并易于根据新要求进行更改。
- 测试代码很容易:封装的代码易于进行单元测试。