什么是 OOP?
OOP, Object Oriented Programming,面向对象式程序设计。它是程序设计的一种方法,产生一些可重复使用的,可扩展的代码。Bioperl 就是使用这种方式编写的。
[编辑]为什么要知道OOP?
因为 Bioperl 本身是模块化的,面向对象的。虽然简单的使用未必需要面向对象的知识,但是了解一些有助于你理解 Bioperl 本身以及它的思想,以及帮助你写出自己需要的代码。
[编辑]你需要哪些基础知识?
有一些基础的 Perl 语法知识就可以了,包括基本的数据类型,数组,hash,对数据的操作,还有子例程(subroutine),引用(reference)等等。可以参考 O'Reilly 的 《 Perl 语言入门》 。中文版目前有第三版,大多书计算机书店中应该都能找到,网上的 perl 教程也有相当不少。
[编辑]OOP 的几个概念
面向对象是一种写程序的方法,它包括几个要素:object(对象),class(类),method(方法),inheritance(继承),polymorphism(多态性)。当然,它们并不像听起来那么复杂。
简单来说:
- 一个 object 给你提供一个操作某些特定数据的途径,通过object你可以获取,修改或者保护某些数据。
- 一个 class 负责告诉你那些和它有关的object可以操作哪些数据,以及怎样操作它们。
- 一个 method 规定那些存在 object 中的数据如何被读取,操作和修改的。
- inheritance 的意思是某些已有的 class 和 object 可以升级,继续添加以前没有的功能。
- polymorphism 表示一些 object 可以根据它们所属的 class,而对同样的信息做出不同的反应。
现在用一个简单的例子来解释一下以上几个概念。比如现在有一台ATM机,它就具有面向对象的几个特性。它可以被看作是一个 object,它可以让你访问你一些数据(data),这些数据是封装好的(encapsulated),也就是说你无法随意访问这些保密的数据,只能通过它提供的接口(interface)。利用这个接口,你可以使用一些特定的方法(method),获取到这些信息(你的帐户,存款等数据),或者是修改它们(操作数据)。ATM机是一种标准型号的机器,它具有什么样的功能,内部包含什么类型的数据,这些都是由预先定义好的型号(class)所规定的。这种机器的型号也可以扩展,生产厂家可以在原有的型号基础上增添新的功能,或者替换掉不需要的功能(inheritance)。不同型号的ATM机,即使它们长得完全一样,往往也会做出不同的反应(polymorphism),即使你塞进去的是同一张卡。
好了,对于概念的讨论我们尽量简短,有个了解就足够了。还是进入更实用的环节吧。
[编辑]OOP 的 Perl 实现
Perl 并不是严格的面向对象的语言,Jason Stajich 说:"Perl OO is a type of hack, but it works!" 实际上 Perl OOP 对于使用者来说并不复杂,因为只是添加了很少的几个语法。
要实现OOP,有三件事情要做:
- 要创建一个 class,就建立一个 package。
- 要创建一个 method, 就写一个subroutine。
- 要创建一个 object, 就使用 bless 语法把 referent 变成object。
来看一个例子:
package Bug; # 第一步,建立一个 package
use strict;
sub new # 建立 subroutine
{
my ($class) = @_;
my $objref = {};
#其他的一些代码
bless $objref, $class; #用 bless 语法产生了一个 object
}
sub print_me # 又建立了一个subroutine
{
my ($self) = @_;
#实现功能的一些代码
}
注意:在 bless 语句中, $class就是这个类的名字(Bug),由 new 函数赋值,而 $objref 则自动被返回做为 new 函数的返回值。
现在,这样来使用它们:
#! /usr/bin/perl -w
use Bug;
use strict;
my $object = Bug->new(@args); #利用 @args 中的数据创立一个对象,它属于 Bug 这个 class
$object->print_me(); #调用Bug class 中定义的print_me()函数
这个基本的格局就是我们在 BioPerl 的使用当中最常看到的情形。往后看到更多实例的时候,大家会对它更加熟悉。
下面是一个更长一些的例子:
package MyPerson;
use strict;
#use warnings;
use vars qw(@ISA); # 这一句用于 inheritance,也可以省略
sub new {
my ($class, @args) = @_;
my ($first,$last,$id,$father,$mother) = @args;
my $self = bless {
'fname' => $first,
'lname' => $last,
'id' => $id,
'mother' => $mother,
'father' => $father,
}, $class;
return $self;
}
sub father {
my ($self,$val) = @_;
return $self->{'father'};
}
sub id { return shift->{'id'} }
1;
如何使用它呢?看这段代码:
#!/usr/bin/perl -w
use strict;
use MyPerson;
my $person = MyPerson->new('jimbo', 'gumbo', 1,2,3);
my @family = (undef,$person); # 0 index needs to be empty
push @family, MyPerson->new('mom', 'gumbo', 3, 0, 0);
push @family, MyPerson->new('dad', 'gumbo', 2, 0, 0);
my $dad = $family[$person->father];
print "father id is ", $person->father, "\n";
print "father obj id is $dad id is ", $dad->id,"\n";
[编辑]小结
阅读这样一小篇文章可能对你自己进行面向对象的编程没有太大帮助,不过我想,你至少应该已经了解了一些使用 Bioperl 的基本知识,包括:
- object,method,class的基本概念和基本实现,知道inheritance,polymorphism是怎么回事。
- 知道一个以 OOP 方式编写的package的基本结构。
- 知道如何创建一个 object,如何调用一个 method
知道这些就够了,其他的东西应该在实际使用中慢慢学习。
注:本文中的一些例子来自 Damian Conway 的 Manning Object Oriented perl 以及 Jason Stajich 的 Bioperl 教程,参见BioPerl参考资料