[Cascavel-pm] Duvida modelagem

Donato Azevedo donatoaz em gmail.com
Segunda Junho 4 11:53:14 PDT 2007


On 6/1/07, Luis Motta Campos <luismottacampos em yahoo.co.uk> wrote:
>    Em outras palavras: me mostra os detalhes sujos, por favor, ou eu
> não vou conseguir dizer nada que presta sobre isso.
>    Seja claro e conciso na tua especificação, para que eu consiga
> enxergar o que vem e o que volta do seu programa. Assim, posso usar
> os meus 10 anos de experiência de modelagem para ajudar a obter uma
> solução Top-Model (elegante e esbelta) para você.

Hehe, desculpa o trabalhão aí!

Bem, vou tentar explicar denovo:

Eu tenho de preparar as bases para a integração do software da empresa
onde trabalho com o software de uma outra empresa. A interface para
integração com o software desta outra empresa é o seguinte:
Eles fornecem um daemon que fica constantemente verificando um
diretório em busca de arquivos de texto. Estes arquivos de texto
contém dados para serem processados.
O Daemon pega estes arquivos, repassa para o software deles e então
cospe os resultados em outro diretório também como um arquivo de
texto.

Esta outra empresa trabalha com envio de mensagens sms, de modo que
cada arquivo de entrada define uma mensagem e diversos destinatários.

A minha idéia é que na hora de integrar ao software da empresa onde
trabalho, seja algo bem simples, tipo isso:

<code>
use SMSFile;
my $smsfile = SMSFile->new;
$smsfile->message("Esta é a mensagem");
$smsfile->add( { name=>'donato',
                 phone=>'3199999999',
                 code=>'led',
                 sender_phone=>'(31) 5555 5555' } );
print $smsfile;
</code>

Eu estou percebendo que eu nunca havia programado em perl OO, de modos
que algumas coisas devem estar violando algum conceito ou coisa do
tipo....

O que eu fiz até agora foi o seguinte, criei uma objeto simples, do
tipo Destinatário:

<code>
package SMSRecipient;
use base qw( Class::Accessor );
SMSRecipient->mk_accessors(qw( name phone code sender_phone ));
sub new {
    my $class = shift;
    my $self = bless {}, $class;

    if ( @_ == 1 )
    {
        my $params = shift;
        for (qw/ name phone code sender_phone /)
        {
            $self->{$_} = $params->{$_};
        }
    }

    return $self;
}
</code>

e um objeto que encapsula os arquivos de entrada do software da outra
empresa, que basicamente implementa alguns acessores, verificação em
cima dos dados de entrada e a impressão em um arquivo de saída:

<long code...>
package SMSFile;
use strict;
use warnings;

use overload ( '""' => \&stringify );
use Carp;

use base qw(Class::Accessor);
SMSFile->mk_accessors(qw( config_file company_name layout_version message ));

my $Debugging = 0;

sub new {
    my $class = shift;
    my $config_file = shift;

    my $self = bless {}, $class;
    $self->{config_file} = $config_file || './smsparserrc';
    $self->parse_config_file;

    $self->{messages} = [];

    return $self;
}

sub add
{
    my $self = shift;
    if ( ref($_[0]) eq 'SMSRecipient' )
    {
        # input isa SMSRecipient object
        push (@{ $self->{messages} }, shift);
    }
    elsif ( ref($_[0]) eq 'HASH' )
    {
        # input is a hashref
        my $msg = SMSRecipient->new(shift);
        push (@{ $self->{messages} }, $msg);
    }
    elsif ( @_ == 4 )
    {
        my $msg = SMSRecipient->new;
        map { $msg->{$_} = shift; } (qw/ name phone code sender_phone /);
        push (@{ $self->{messages} }, $msg);
    }
    else
    {
        croak "Usage: add( [ SMSRecipient object | HASHREF | LIST ] )";
    }
}

sub stringify {
    my $self = shift;

    unless ( $self->company_name ) { confess "Nome da companhia
incorreto: verifique o atributo company_name\n"; }
    unless ( $self->layout_version ) { confess "Nome da companhia
incorreto: verifique o atributo layout_version\n"; }
    unless ( $self->message ) { confess "Nome da companhia incorreto:
verifique o atributo message\n"; }

    # 1a linha
    my $file_string = pack('A1 A8 A25 A10', 1, '20070604',
$self->company_name, $self->layout_version) . "\n";
    # 2a linha
    $file_string .= pack('A1 A135', 2, $self->message) . "\n";
    # 3a linha
    $file_string .= pack('A1 A135', 4, $self->message) . "\n";

    for my $recipient ( @{$self->{messages}} )
    {
        for ( 'phone', 'name', 'code', 'sender_phone' )
        {
            unless ( $recipient->{$_} ) { confess "invalid parameter $_\n"; }
        }

        $file_string .= pack('A1 A10 A30 A30 A20', 3,
$recipient->phone, $recipient->name, $recipient->code,
$recipient->sender_phone) . "\n";
    }

    print $file_string;
}

sub parse_config_file {
    my $self = shift;

    open(my $fh, '<', $self->{config_file});
    while (<$fh>) {
        chomp;
        next if /^[\#\n]/;
        my ($key, $val) = split '=', $_, 2;
        $self->{$key} = $val;
    }
    close $fh;
}

sub debug {
    my $self = shift;
    confess "usage: thing->debug(level)"    unless @_ == 1;
    my $level = shift;
    if (ref($self))  {
        $self->{"_DEBUG"} = $level;		# just myself
    } else {
        $Debugging        = $level;         # whole class
    }
}

sub message {
    my $self = shift;
    if ( @_ ) { $self->{message} = substr(shift, 0, 134); }
    return $self->{message};
}
</code>


Mais detalhes sobre a lista de discussão Cascavel-pm