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