📜  珀尔 | OOP 中的封装

📅  最后修改于: 2022-05-13 01:54:42.949000             🧑  作者: Mango

珀尔 | OOP 中的封装

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。
  • 可重用性:封装还提高了可重用性,并且易于随着新的需求而改变。
  • 测试代码很容易:封装的代码很容易测试单元测试。