Парадигма программирования — это совокупность подходов, методов, стратегий, идей и понятий, определяющая стиль написания программ и в современной индустрии программирования очень часто определяется набором инструментов программиста (язык программирования и операционная система).
Парадигма программирования представляет (и определяет) то, как программист видит выполнение программы. Например, в объектно-ориентированном программировании программист рассматривает программу как набор взаимодействующих объектов, тогда как в функциональном программировании программа представляется в виде цепочки вычисления функций.
1) Процедурный стиль
sub max_int {
my ($x, $y) = @_;
return $x > $y ? $x : $y;
}
sub max_str {
my ($x, $y) = @_;
return $x ge $y ? $x : $y;
}
say max_int( 1, 2 );
say max_str( 'A', 'B' );
2) Объектный стиль: классика
sub Cow::speak {
say "a Cow goes moooo!";
}
sub Horse::speak {
say "a Horse goes neigh!";
}
sub Sheep::speak {
say "a Sheep goes baaaah!";
}
Cow::speak;
Horse::speak;
my @pasture = qw(Cow Cow Horse Sheep Sheep);
foreach $animal (@pasture) {
$animal->speak;
}
Наследование и полиморфизм:
package Human;
sub new {
my $class = shift;
my $self = {};
$self->{FULLNAME} = shift;
bless ($self, $class);
return $self;
}
sub get_fullname {
return shift->{FULLNAME};
}
package Woman;
@ISA = qw(Woman);
sub get_fullname {
my $self = shift;
return 'Госпожа '.$self->SUPER::get_fullname;
}
package main;
my $woman = new Woman( 'Василиса Петровна' );
say $woman->get_title;
ООП: Moose
Moose — A postmodern object system for Perl 5
package Point;
use Moose; # automatically turns on strict and warnings
has 'x' => (is => 'rw', isa => 'Int');
has 'y' => (is => 'rw', isa => 'Int');
sub clear {
my $self = shift;
$self->x(0);
$self->y(0);
}
package Point3D;
use Moose;
extends 'Point';
has 'z' => (is => 'rw', isa => 'Int');
after 'clear' => sub {
my $self = shift;
$self->z(0);
};
ООП: Moo
Moo — Minimalist Object Orientation
package Cat::Food;
use Moo;
use Sub::Quote;
sub feed_lion {
my $self = shift;
my $amount = shift || 1;
$self->pounds( $self->pounds - $amount );
}
has taste => (
is => 'ro',
);
has brand => (
is => 'ro',
isa => sub {
die "Only SWEET-TREATZ supported!" unless $_[0] eq 'SWEET-TREATZ'
},
);
has pounds => (
is => 'rw',
isa => quote_sub q{ die "$_[0] is too much cat food!" unless $_[0] < 15 },
);
3) Функциональный стиль
Non-blocking HTTP client с помощью IO::Lambda
use IO::Lambda qw(:all);
use IO::Socket;
use HTTP::Request;
sub talk
{
my $req = shift;
my $socket = IO::Socket::INET-> new( PeerAddr => 'www.perl.com', PeerPort => 80);
lambda {
context $socket;
writable {
# connected
print $socket "GET ", $req-> uri, "\r\n\r\n";
my $buf = '';
readable {
sysread $socket, $buf, 1024, length($buf) or return $buf;
again; # wait for reading and re-do the block
}
}
}
}
...
4) Бесструктурный стиль
perl -MData::Dumper -e 'my$hs;
do { chomp; @a=split/\./,
$_; $hs->{$a[-1]}++; } for
<>; print "$_ $hs->\n"
for sort { $hs-> <=> $hs-> }
keys %$hs'