in reply to Re^2: Moose: I want builder method to run every time I call an attribute
in thread Moose: I want builder method to run every time I call an attribute
Two perfect examples of how Moose encourages bad OO design.
- tye
|
---|
Replies are listed 'Best First'. | |
---|---|
Re^4: Moose: I want builder method to run every time I call an attribute (ugh)
by boftx (Deacon) on Sep 27, 2013 at 04:47 UTC | |
tye, in all seriousness, would you expand on that (rather broad) statement? I realize this could touch off a "tastes better/less filling" discussion with regard as to what proper OO design is, but I would like to know the basis for your statement. especially since chromatic has a much better claim to knowing what he is talking about than I do in this community. :)
On time, cheap, compliant with final specs. Pick two.
| [reply] |
by tye (Sage) on Sep 27, 2013 at 06:04 UTC | |
chromatic's suggestion was the example of good OO design. I've talked about this to significant lengths. But I'll let those interested do the searching (it isn't hard) if they want more than the below rehash. The original question was an example of how Moose's emphasis on object attributes (with the emphasis on method generation, constructor generation, emphasis away from non-accessor use of attributes from within methods, etc.) just further encourages a problematic focus on class design as "select what attributes you want to store in your objects and which of those you want to have accessors for vs. which you just want transparently exposed via constructor arguments". IME, good OO design comes from first deciding on the methods you want your class to provide and only after that deciding on the attributes that you want to use in order to implement those methods and keeping the attributes as internal aspects of the design that are not directly exposed in the interface. But it took years for me to recognize the pattern of class designs eventually going further and further wrong and distilling out that this was an important common element of many of these problematic designs. Objects as "bags of attributes" encourages designs that end up leaking/forcing object behavior into the code that uses the objects like this trivial example:
The original question shows a person so focused on "what accessors to what attributes should I design into my class?" that they didn't even recognize when they had a simple use-case for a simple, vanilla method (the very thing that should be the focus of the design). So they had to conceive of that as "an accessor but that invokes a builder". Of course, people often deride "blame the tool". It isn't like Moose forces you to design classes badly. But I couldn't resist when I saw somebody who didn't even recognize the need for "just a method". The second bad example is using "around" code. Not wanting to misquote, I found a prior summary I wrote that I think sums it up nicely so I'll just repeat it, slightly modified:
I prefer to not write idiotic code. I prefer to not come close to writing idiotic code. So I won't be using even one "around" method. The idea of an "around method" just doesn't even make sense in my classes. You can see the code. If you need to add code, you add it where it needs to go and the flow is obvious. And if you later realize that the order of things matters and is wrong, then you fix that by moving lines of code up or down within a subroutine. - tye | [reply] [d/l] |
by davido (Cardinal) on Sep 27, 2013 at 06:23 UTC | |
This is golden. My first thought when I saw the question was, "Has Moose made use forget how to write a method? It generally starts with some variation on, 'sub methodname { my $self = shift; ... }'."
(From http://en.wikipedia.org/wiki/Indirection.) All these layers of abstraction can become a shell game. Eventually someone's got to actually write some code. Spaghetti code can be written without ever using goto. ;) Dave | [reply] [d/l] [select] |
by BrowserUk (Patriarch) on Sep 27, 2013 at 06:34 UTC | |
by italdesign (Novice) on Sep 27, 2013 at 14:14 UTC | |
| [reply] |
by Anonymous Monk on Sep 27, 2013 at 07:42 UTC | |
I have these bookmarked/tagged with oop and tye and in proximity to each other
And tye in the cb around the same time( 2011-06-18 06:23:39 UTC ) the Moose will bite you in the end I also bookmarked https://metacpan.org/source/ZBY/WebNano-0.007/webnano_article.html/http://cpansearch.perl.org/src/ZBY/WebNano-0.007/webnano_article.html meaning to ask something about coupling controllers, but I don't remember I also remember that tye is writing a oop/ood book(let?) , can't wait for 50 shades of tyed oops | [reply] |