Я в проекте давно использую почти аналогичный подход, только самописаный. Уже два года без нареканий и фрустраций, чего было много с Музом. Надо пробовать --- почти везде есть подводные камни.
9 декабря 2015 г., 6:36 пользователь Nikolay Mishin <[email protected]> написал: > > Кстати,насчет объектов в 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, "Михаил Шогин" <[email protected]>: > > Это конечно не 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 < > [email protected]> написал: > > Гм... > > 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 <[email protected]>: > > 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 > > [email protected] | http://moscow.pm.org > > > -- > Vladimir Timofeev <[email protected]> > -- > Moscow.pm mailing list > [email protected] | http://moscow.pm.org > > > > > -- > С уважением > Михаил Шогин. > ,-- > Moscow.pm mailing list > [email protected] | http://moscow.pm.org > > > > -- > С уважением > Николай Мишин > > > > -- > Moscow.pm mailing list > [email protected] | http://moscow.pm.org > >
-- Moscow.pm mailing list [email protected] | http://moscow.pm.org
