Анализ генетического теги


Я недавно туда и обратно несколько раз на мой стиль программирования на Perl, когда дело доходит до модуля подпрограммы. Если у вас есть объект и вы хотите вызвать метод - бар без аргументов, то вы можете сделать $фу->бар() или $фу->бар. В один момент я начала в пользу последнего, потому что я чувствовал, что это подчистил код и сделал его более читабельным. Правда, иногда я сомневаюсь, будет ли это лучше, чтобы быть полностью откровенными, особенно учитывая возможность того, что кто-то будет смотреть на мой код позже — кто-то, кто почти наверняка не быть экспертом в Perl программист.

Например, рассмотрим этот блок кода. Для вызовов методов, которые требуют аргументов (get_tag_values и has_tag), нет сомнений в скобках. Но что насчет next_feature и primary_tag? Это удобочитаемость я получу от падения скобкой стоит терять явного синтаксиса? Это один лучше, чем другой для долгосрочных ремонтопригодность? Или это просто субъективное суждение?

while( my $feature = $gff3->next_feature )
{
  if($type eq "cds")
  {
    if( $feature->primary_tag eq "mRNA" )
    {
      my($gene_id) = $feature->get_tag_values("Parent");
      my($mRNA_id) = $feature->get_tag_values("ID");
      next unless( $list eq '' or $genes_to_extract->{$gene_id} );
      $subseq_locations->{ $feature->seq_id }->{ $mRNA_id } = Bio::Location::Split->new();
    }
    elsif( $feature->primary_tag eq "CDS" )
    {
      my($mRNA_id) = $feature->get_tag_values("Parent");
      if( $subseq_locations->{ $feature->seq_id }->{ $mRNA_id } )
      {
        $subseq_locations->{ $feature->seq_id }->{ $mRNA_id }->add_sub_Location( $feature->location );
      }
    }
  }
  else
  {
    if( $feature->primary_tag eq $type )
    {
      my $feat_id;
      if( $list ne '')
      {
        ($feat_id) = $feature->get_tag_values("ID") if($feature->has_tag("ID"));
        next unless( $feature->has_tag("ID") and $genes_to_extract->{$feat_id} );
      }
      $subseq_locations->{ $feature->seq_id }->{ $feat_id } = Bio::Location::Split->new();
      $subseq_locations->{ $feature->seq_id }->{ $feat_id }->add_sub_Location( $feature->location );
    }
  }
}


446
9
задан 21 февраля 2011 в 08:02 Источник Поделиться
Комментарии
4 ответа

Потому что ни с технической точки зрения, вы правы, что это вопрос стиля и просто при выборе кодирования конвенции.

Однако, я думаю, что вы попали в очень важный момент. Так что несколько других языков, которые используют скобки для функции функция без параметров вызов без скобок, что он может быть весьма удивительно для разработчиков, незнакомых с Perl.

Этот момент бы склонить меня в пользу всегда через них и, действительно, я всегда так делаю по привычке, потому что я использую много других языков, и это естественно.

10
ответ дан 21 февраля 2011 в 10:02 Источник Поделиться

Я предпочитаю делать различия на семантическом уровне: нет никаких функций или методов, но вместо этого есть свойства и действия. Каждое свойство объекта (в реальном смысле) и действие сделано на объекте. Хорошая мнемоника является, вероятно, читать () , как это сделать!.

Рассмотрим переменную:

$document

Вы знаете имя объекта, так как это существительное.

$document->author

Хотя автор наверное функция/метод, автором является объектом и существительным, так это свойство и при этом ни скобки здесь.

$document->send()
$document->author->write_book()

Опять же, отправить и write_book функции/методы, но поскольку эти действия (как обозначается глаголами), мы пишем скобки за ними.

$document->author_count
$document->has_reviews

Опять же, функция/метод, а свойство объекта document, а не действие, поэтому без скобок. Логическое значение или целое число, строго говоря не реальный объект, но это скорее как объект, чем действие.

13
ответ дан 22 февраля 2011 в 10:02 Источник Поделиться

По мне, так это и ежу понятно (для всех это вопрос стиля); оставить пустые скобки для вызова функции.

Язык я использовал, что позволяет (требует?) функции без аргументов называть без скобок был Паскаль, и я всегда находил такие призывы толку - вдвойне при вызове в списке аргументов другой функции.

На Perl не требует & в функции, как это было раньше. Я думаю, что это все-таки стоит различать ссылку на переменную и функцию вызова путем предоставления в скобках, по крайней мере, когда вызов может быть перепутал с ссылкой на переменную.

3
ответ дан 21 февраля 2011 в 10:02 Источник Поделиться

Это зависит от цели. Я предпочитаю скобочки для "реальных" методов, делать что-то. Для свойства с небольшой геттер/сеттер и простой проверки я использую более короткий вариант.

2
ответ дан 22 февраля 2011 в 09:02 Источник Поделиться