Chinaunix首页 | 论坛 | 博客
  • 博客访问: 156654
  • 博文数量: 42
  • 博客积分: 972
  • 博客等级: 准尉
  • 技术积分: 382
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-17 10:59
文章分类

全部博文(42)

文章存档

2014年(2)

2013年(5)

2012年(35)

我的朋友

分类: Python/Ruby

2012-11-29 11:07:43


什么是 OOP?

OOP, Object Oriented Programming,面向对象式程序设计。它是程序设计的一种方法,产生一些可重复使用的,可扩展的代码。Bioperl 就是使用这种方式编写的。

[]为什么要知道OOP?因为 Bioperl 本身是模块化的,面向对象的。虽然简单的使用未必需要面向对象的知识,但是了解一些有助于你理解 Bioperl 本身以及它的思想,以及帮助你写出自己需要的代码。 []你需要哪些基础知识?

有一些基础的 Perl 语法知识就可以了,包括基本的数据类型,数组,hash,对数据的操作,还有子例程(subroutine),引用(reference)等等。可以参考 O'Reilly 的  。中文版目前有第三版,大多书计算机书店中应该都能找到,网上的 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,有三件事情要做:

  1. 要创建一个 class,就建立一个 package。
  2. 要创建一个 method, 就写一个subroutine。
  3. 要创建一个 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"; []
阅读(1030) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~