Stories
Slash Boxes
Comments
NOTE: use Perl; is on undef hiatus. You can read content, but you can't post it. More info will be forthcoming forthcomingly.

All the Perl that's Practical to Extract and Report

The Fine Print: The following comments are owned by whoever posted them. We are not responsible for them in any way.
 Full
 Abbreviated
 Hidden
More | Login | Reply
Loading... please wait.
  • conditional checks in OO code prove themselves to be code smells.

    Thanks for the heuristic! I never realized that before! I think this will help improve my coding.

    (If there's a larger source where you picked that up, I'd be benefitted by a pointer.)

    --
    J. David works really hard, has a passion for writing good software, and knows many of the world's best Perl programmers
    • I figured a concrete example would help. Imagine this awful method from some Catalyst code I was working on:

      sub _set_group_by : Private {
          my ( $self, $c ) = @_;
          my $group_by = 'day';
          my $period = $c->stash->{report_metadata}{period};

          my $report_range
                  = $c->stash->{report_metadata}{start}->day_month_year
                  . ' – '
               

      • sub report : Chained('somewhere?') PathPart('') CaptureArgs(0) {
            my ( $self, $c, @args ) = @_;
            $c->action->chain->[-1]->name =~ /\Areport_for_(.*)\z/
                or die 'Chain ends at action with malformed name';
            $c->stash->{report_metadata}{period} = $1;
            $c->forward('_set_start_and_end_dates'); # inline this?
        }

        sub report_day : Chained('report') PathPart('') CaptureArgs(0) {
            my ( $self, $c, @args ) = @_;
            $c->stash->{group_by} = 'hour';
            $c->stash->{report_range}
              = $c->stash->{report_metadata}{start}->day_month_year;
        }

        sub report_month : Chained('report') PathPart('') CaptureArgs(0) {
            my ( $self, $c, @args ) = @_;
            $c->stash->{group_by} = 'day';
            $c->stash->{report_range}
              = $c->stash->{report_metadata}{start}->day_month_year
                . ' – '
                . $c->stash->{report_metadata}{end}->day_month_year;
        }

        BEGIN {
            my %report = (
                today     => 'day',
                yesterday => 'day',
                last7days => 'month',
                month     => 'month',
            );

            while ( my ( $period, $type ) = each %report ) {
                eval(
                    "sub report_for_$period :"
                    . " Chained('report_$type')"
                    . " PathPart('$period')"
                    . ' Args(0) {}'
                );
            }
        }