<div><br />Кстати,насчет объектов в Perl</div><div>вот говорят про Moose,а используют </div><div><span>Kelp::Base;</span></div><div> </div><div><span>https://github.com/mishin/kelp/blob/master/lib/Kelp/Base.pm</span></div><div> </div><div><a href="https://github.com/mishin/kelp/blob/master/t/base.t">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">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">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">Storable</a></span></div><div> </div><div> </div><div>15.10.2015, 13:52, "Михаил Шогин" <mshogin@gmail.com>:</div><blockquote type="cite"><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">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">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">vovkasm@gmail.com</a>><br /> </font></span><div><div>--<br /> Moscow.pm mailing list<br /> <a href="mailto:moscow-pm@pm.org">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>,<span>-- <br />Moscow.pm mailing list<br /><a href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org/">http://moscow.pm.org</a><br /></span></blockquote><div> </div><div> </div><div>-- <br />С уважением</div><div>Николай Мишин</div><div> </div><div> </div>