分类: Python/Ruby
2012-11-29 11:07:43
OOP, Object Oriented Programming,面向对象式程序设计。它是程序设计的一种方法,产生一些可重复使用的,可扩展的代码。Bioperl 就是使用这种方式编写的。
[]为什么要知道OOP?因为 Bioperl 本身是模块化的,面向对象的。虽然简单的使用未必需要面向对象的知识,但是了解一些有助于你理解 Bioperl 本身以及它的思想,以及帮助你写出自己需要的代码。 []你需要哪些基础知识?有一些基础的 Perl 语法知识就可以了,包括基本的数据类型,数组,hash,对数据的操作,还有子例程(subroutine),引用(reference)等等。可以参考 O'Reilly 的 。中文版目前有第三版,大多书计算机书店中应该都能找到,网上的 perl 教程也有相当不少。
[]OOP 的几个概念面向对象是一种写程序的方法,它包括几个要素:object(对象),class(类),method(方法),inheritance(继承),polymorphism(多态性)。当然,它们并不像听起来那么复杂。
简单来说:
现在用一个简单的例子来解释一下以上几个概念。比如现 在有一台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,有三件事情要做:
来看一个例子:
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"; []