Beefy Boxes and Bandwidth Generously Provided by pair Networks
There's more than one way to do things
 
PerlMonks  

Re: Mutator chaining considered harmful

by toma (Vicar)
on Dec 29, 2004 at 09:13 UTC ( #417951=note: print w/ replies, xml ) Need Help??


in reply to Mutator chaining considered harmful

Chained mutators can

  • Save typing
  • Create symmetry
  • Result in clearer code.
Here's a snippet from my own code. This probes a real-time audio application with a five channel OpenGL oscilloscope:
my $s= Scope->new('probe' => $netlist) ->anatrace('in', 'System input', 'active', 1) ->anatrace('out_1', 'Lpf bank1', 'active', 1) ->anatrace('out_2', 'Lpf bank2', 'active', 1024) ->anatrace('out', 'System output', 'active', 1) ->anatrace('bank2', 'Switch pos', 'active', 1) ->generate();
Want to see another channel? Call anatrace again.

I don't think that features with potential downsides should be 'considered harmful'.

It is possible to create a 'little language' out of chained method calls. I avoid creating little languages because I have seen a few of them grow into voracious blood-sucking monsters. I can enjoy chaining method calls without fear of triggering a science-related memetic disorder.

It should work perfectly the first time! - toma


Comment on Re: Mutator chaining considered harmful
Download Code
Re^2: Mutator chaining considered harmful
by kappa (Chaplain) on Dec 29, 2004 at 14:11 UTC
    This gives you almost nothing in comparison with:
    ... $s->anatrace('bank2', 'Switch pos', 'active', 1); $s->generate();
    And when the objects have long names or are expressions you can always:
    for (Scope->new('probe' => $netlist)) { $_->anatrace('in', 'System input', 'active', 1); ... $_->generate(); }
    --kap
Re^2: Mutator chaining considered harmful
by Aristotle (Chancellor) on Dec 29, 2004 at 19:39 UTC

    Apart from kappa's points: read my root node update. Here's what that would look like with a good interface:

    my $s = Scope->new( 'probe' => $netlist ); $s->anatrace( in => [ 'System input', 'active', 1 ], out_1 => [ 'Lpf bank1', 'active', 1 ], out_2 => [ 'Lpf bank2', 'active', 1024 ], out => [ 'System output', 'active', 1 ], bank2 => [ 'Switch pos', 'active', 1 ], ); $s->generate();

    Makeshifts last the longest.

      I suppose I could also use this :-)
      my $s = Scope->new( probe => $netlist ) ->anatrace( in => [ 'System input', 'active', 1 ], out_1 => [ 'Lpf bank1', 'active', 1 ], out_2 => [ 'Lpf bank2', 'active', 1024 ], out => [ 'System output', 'active', 1 ], bank2 => [ 'Switch pos', 'active', 1 ], ) ->generate();
      The => after the first arguments look nice, especially since the first arguments are instance handles, and I use them as a hash key.

      In this example the arguments to anatrace really aren't mutators, they are constructors of sub-objects. They are waveforms being added to a scope display.

      update
      Is the problem that you perceive just with mutators, or does it also apply to sub-object constructors? Can you provide examples of acceptable method chaining, and contrast it with problematic method chaining?

      It should work perfectly the first time! - toma

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://417951]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others chilling in the Monastery: (6)
As of 2015-07-05 07:57 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (61 votes), past polls