Is there are good DRY fix for this painful design pattern?

Rick Johnson rantingrickjohnson at gmail.com
Mon Feb 26 16:12:20 EST 2018


On Monday, February 26, 2018 at 8:44:14 AM UTC-6, Steven D'Aprano wrote:
> I have a class with a large number of parameters (about
> ten) assigned in `__init__`. The class then has a number of
> methods which accept *optional* arguments with the same
> names as the constructor/initialiser parameters. If those
> arguments are None, the defaults are taken from the
> instance attributes.
>
> An example might be something like this:
>
> class Foo:
>     def __init__(self, bashful, doc, dopey, grumpy,
>                        happy, sleepy, sneezy):
>         self.bashful = bashful  # etc
>
>     def spam(self, bashful=None, doc=None, dopey=None,
>                    grumpy=None, happy=None, sleepy=None,
>                    sneezy=None):
>         if bashful is None:
>             bashful = self.bashful
>         if doc is None:
>             doc = self.doc
>         if dopey is None:
>             dopey = self.dopey
>         if grumpy is None:
>             grumpy = self.grumpy
>         if happy is None:
>             happy = self.happy
>         if sleepy is None:
>             sleepy = self.sleepy
>         if sneezy is None:
>             sneezy = self.sneezy
>         # now do the real work...
>
>     def eggs(self, bashful=None, # etc...
>                    ):
>         if bashful is None:
>             bashful = self.bashful
>         # and so on


Steven... even if this example code is absolutely atrocious
(because it is!), and even *IF* i have a uneasy suspicion
that this "inquiry" masks some dastardly malicious plan
(because i do!), I must admit, I am happy to see that you
are _finally_ embracing the OOP paradigm.

For starters, I would suggest replacing those ugly if-
clauses with some short-circuit or'd-logic. But obviously
you need to run that "paragraph of arguments" through a
single helper function, as the point of "DRY" is "Don't
Repeat Yourself".

</pesos count="2">




More information about the Python-list mailing list