[Moscow.pm] refactoring

Oleg Alexeenkov proler на gmail.com
Ср Дек 9 04:24:10 PST 2015


Akzhan Abdulin <akzhan.abdulin на gmail.com> писал(а) в своём письме Wed, 09  
Dec 2015 10:20:38 +0300:

> Storable меняем,  где можем,  на CBOR::XS или JSON::XS

А почему CBOR а не msgpack ?

> 09 дек 2015 г. 6:38 пользователь "Nikolay Mishin" <mi на ya.ru> написал:
>
>>
>> Кстати,насчет объектов в Perl
>> вот говорят про Moose,а используют
>> Kelp::Base;
>>
>> https://github.com/mishin/kelp/blob/master/lib/Kelp/Base.pm
>>
>> https://github.com/mishin/kelp/blob/master/t/base.t
>> получается типа
>>
>>
>> package Ftree::Name;
>> use Kelp::Base;
>> attr title => undef;
>> attr prefix => undef;
>> attr first_name => undef;
>> attr mid_name => undef;
>> attr last_name => undef;
>> attr suffix => undef;
>> attr nickname => undef;
>>
>> attr full_name => sub {
>> my $self = shift;
>> my @name_array = ( $self->last_name, $self->first_name, $self->mid_name  
>> );
>> join( ' ', @name_array );
>> };
>>
>> package main;
>> use Test::More;
>>
>> my $o = Ftree::Name->new;
>>
>> isa_ok $o, 'Ftree::Name';
>>
>> can_ok $o, qw/title prefix first_name mid_name last_name suffix suffix/;
>>
>> $o->first_name('Николай');
>> is $o->first_name, 'Николай', 'set name is ok';
>> $o->last_name('Мишин');
>> $o->mid_name('Алексеевич');
>> is $o->full_name, 'Мишин Николай Алексеевич', 'fullname ok';
>>
>> done_testing;
>>
>> perl object_example.t
>> ok 1 - An object of class 'Ftree::Name' isa 'Ftree::Name'
>> ok 2 - Ftree::Name->can(...)
>> ok 3 - set name is ok
>> ok 4 - fullname ok
>> 1..4
>>
>>
>>
>> так хорошо писать?
>>
>> https://github.com/mishin/presentation/blob/master/kelp/object_example.t
>>
>>
>>
>>
>> как замену
>> https://github.com/mishin/Ftree-cpan/blob/master/lib/Ftree/Person.pm
>>
>> да и Class::Std::Storable устарел меняем его на просто Storable
>> <https://metacpan.org/pod/Storable>
>>
>>
>> 15.10.2015, 13:52, "Михаил Шогин" <mshogin на gmail.com>:
>>
>> Это конечно не Perl, но все тоже самое можно написать и на Perl-e
>>
>> class NonePerson(BasePerson):
>>
>>     def get_id():
>>         return None
>>
>>
>> class Person(BasePerson):
>>
>>     def get_father():
>>         return self.father or NonePerson()
>>
>>     def get_mother():
>>         return self.mother or NonePerson()
>>
>>     def get_date_of_birth():
>>         return self.birthday  # datetime object
>>
>>     def get_date_of_birth_as_a_very_custom_string():
>>         date = self.birthday.day or ""
>>
>>         if self.birthday.month:
>>             date . = "/" + self.birthday.month
>>
>>         if self.birthday.year:
>>             date . = "/" + self.birthday.year
>>
>>         return date
>>
>>
>> class PersonRowBuilder():
>>
>>     def build(self, person):
>>         row = ()
>>         row.append(person.get_father().get_id())
>>         row.append(person.get_mather().get_id())
>>         row.append(person.get_email())
>>         row.append(person.get_homepage())
>>
>>         return row
>>
>> ##################################
>> def info():
>>     person = Person()
>>     birthday = person.get_date_of_birth_as_a_very_custom_string()
>>
>>
>> def method_related_to_db_usage():
>>     builder = PersonRowBuilder()
>>     row = builder.build(Person())
>>
>>
>> 15 октября 2015 г., 11:58 пользователь Vladimir Timofeev <
>> vovkasm на gmail.com> написал:
>>
>> Гм...
>>
>> push @person_row, $person->get_father_id, $person->get_mother_id,
>> $person->get_email, $person->get_homepage;
>>
>> my $date = $person->get_display_date_of_birth;
>>
>> package Person;
>>
>> sub get_father_id {
>>   my $self = shift;
>>   if (my $self->get_father) {
>>     return $self->get_father->get_id;
>>   }
>>   return;
>> }
>>
>> ... и  т.д.
>>
>> Это раз.
>>
>> Можно пойти дальше и объединить построение @person_row в  один метод:
>>
>>   push @person_row, $person->get_person_fields
>>
>> Хотя использование массива здесь выглядит очень подозрительно, но это
>> уже к вопросу не относится.
>>
>> С датами, помимо выноса в отдельный метод кода форматирования, можно
>> потом вынести код форматирования в класс даты. Потом можно переписать
>> код форматирования даты, так, чтоб работал корректно во всех случаях.
>> А то сейчас можно сделать "3/" к примеру (задан только месяц).
>>
>>
>>
>>
>> 2015-10-15 5:43 GMT+03:00 Nikolay Mishin <mi на ya.ru>:
>> > Hi Moscow.PM!
>> >
>> > Существует ли какой-либо сбособ сделать более читаемым такой код?:
>> >
>> >     push @person_row, (defined $person->get_father()) ?
>> $person->get_father()->get_id() : undef;
>> >     push @person_row, (defined $person->get_mother()) ?
>> $person->get_mother()->get_id() : undef;
>> >     push @person_row, ($person->get_email(), $person->get_homepage());
>> >
>> >     my $date = "";
>> >     if(defined $person->get_date_of_birth()) {
>> >       my $date_of_birth = $person->get_date_of_birth();
>> >       $date .= defined $date_of_birth->day ? $date_of_birth->day."/" :
>> "";
>> >       $date .= defined $date_of_birth->month ?  
>> $date_of_birth->month."/"
>> : "";
>> >       $date .= defined $date_of_birth->year ? $date_of_birth->year :  
>> "";
>> >     }
>> >
>> > источник
>> https://github.com/mishin/Ftree-cpan/blob/master/lib/Ftree/Exporters/ExcelExporter.pm#L53
>> >
>> > --
>> > С уважением
>> > Николай Мишин
>> >
>> > --
>> > Moscow.pm mailing list
>> > moscow-pm на pm.org | http://moscow.pm.org
>>
>>
>> --
>> Vladimir Timofeev <vovkasm на gmail.com>
>> --
>> Moscow.pm mailing list
>> moscow-pm на pm.org | http://moscow.pm.org
>>
>>
>>
>>
>> --
>> С уважением
>> Михаил Шогин.
>> ,--
>> Moscow.pm mailing list
>> moscow-pm на pm.org | http://moscow.pm.org
>>
>>
>>
>> --
>> С уважением
>> Николай Мишин
>>
>>
>>
>> --
>> Moscow.pm mailing list
>> moscow-pm на pm.org | http://moscow.pm.org
>>


Подробная информация о списке рассылки Moscow-pm