This is what I do. This way the sub-classes automatically get variables
defaults from the parent-class and when using the module you should only
have to call the parent class; as long as you have defined all your
parameters that are used by any sub-model in the parent class.
class module (
$var0 = $::module::params::var0,
$var1 = $::module::params::var1,
) inherits ::module::params {
include module::file
include module::package
}
class module::file (
$var0 = $::module::var0
) { }
class module::package (
$var1 = $::module::var1
) { }
On Wed, Sep 17, 2014 at 7:49 AM, jcbollinger <[email protected]>
wrote:
>
>
> On Wednesday, September 17, 2014 3:15:44 AM UTC-5, François Lafont wrote:
>>
>> Le 17/09/2014 04:26, Sebastian Otaegui a écrit :
>> > As far as I know "inner classes" are an anti pattern(for the lack of a
>> > better term)
>> >
>>
>
>
> Nested classes are poor form, but multiple classes in the same module are
> fine.
>
>
>
>> > Each class should live in its own file.
>> >
>> > More than one class per file is discouraged
>>
>>
>
> More specifically, nesting classes or defined types inside other classes
> is widely considered poor form these days, and it *will* cause you grief
> unless you know exactly what you're doing or you get very, very lucky.
> Putting multiple un-nested classes or definitions in the same file (or
> otherwise arranging classes and definitions differently than the autoloader
> is prepared to handle) is even worse form, and even if you know what you're
> doing you probably cannot make that work smoothly without resorting to
> near-deprecated 'import'.
>
>
>
>> I agree. It's better to define "inner classes" in separate files
>>
>
>
> I prefer the terminology "module classes", as distinguished from the
> "module main class" or "main module class". The term "inner class" carries
> too much baggage, and anyway, sometimes module classes are not intended to
> be private to the module.
>
>
>
>> (my_module::internal1 in my_module/internal1.pp, my_module::internal2
>> in my_module/internal2.pp etc).
>>
>> But this is not really my question. My question is: which pattern should
>> I use:
>> a) to define inner classes (indeed in a specific file)
>> b) and to call inner classes in the "my_module" class (which is the
>> "top level" class called by the user of my_module)
>>
>> knowing that a inner class needs to use variables defined in
>> my_module::params, but among these variables, maybe severals
>> variables are parameters of the my_module class with a different
>> value of the default value proposed in my_module::params.
>>
>>
>
> Do not get hung up on class inheritance, and especially do not confuse the
> usage of the terms "class" and "inheritance" in Puppet context with the
> usage of the same terms in OOP context. Puppet classes are not classes in
> the OO sense, and Puppet class inheritance has significant dissimilarities
> from typical OO class inheritance.
>
> Moreover, with respect to your actual question, it is important to
> understand the purpose of class inheritance as it applies to the params
> class pattern: its *only* purpose in that context is to ensure that the
> ::params class is evaluated (and thus its variables assigned their values)
> before the parameter list of the inheriting class is evaluated. That makes
> it safe for variables of the ::params class to be used as class parameter
> defaults in the inheriting class. Note, too, that that effect is merely a
> side effect of class inheritance, not its true purpose.
>
> If a given module class uses variables of the module's ::params class, but
> none of them as (its own) parameter defaults, then it can 'include
> my_module::params' in its body instead of inheriting from the params
> class. If a module class does use ::params class variables as default
> values for its own parameters, however, then it should inherit from the
> params class both for documentary and for self-containment purposes.
>
>
>
>> For instance with:
>>
>> class my_module (
>> $var1 = $my_module::params::var1,
>> $var2 = $my_module::params::var2,
>> $var3 = $my_module::params::var3,
>> ) inherits my_module::params {
>> # The body of the class
>> }
>>
>> and:
>>
>> class my_module::params {
>>
>> ## API of the module ##
>> $var1 = default_value1
>> $var2 = default_value2
>> $var3 = default_value3
>>
>> ## shared variables between the classes of my_module
>> ## but they are not part of the API module
>> $foo1 = default_value_foo1
>> $foo2 = default_value_foo2
>> $foo3 = default_value_foo3
>> ...
>> }
>>
>> Imagine I want to define an inner class "internal" which
>> needs to use $var2, $var3, $foo1 and $foo2. Which pattern
>> should I use to define my "internal" class.
>>
>> This one?
>>
>> class my_module::internal (
>> $var2,
>> $var3,
>> ) inherits my_module::params {
>>
>> notify { "value of foo1 -> $foo1": }
>> notify { "value of foo2 -> $foo2": }
>>
>> }
>>
>
>
> No, if only because you are using the variables $my_module::params::foo1
> and $my_module::params::foo2 without qualifying their names. It works, but
> it is poor form. In this particular case it is also confusing, because
> class parameters $my_module::internal::var2 and $my_module::internal::var3
> have the same unqualified names as variables of class my_module::params,
> but they are completely separate variables.
>
>
>>
>> This one?
>>
>> class my_module::internal (
>> $var2,
>> $var3,
>> ) {
>>
>> require my_module::params
>> notify { "value of foo1 -> $my_module:params::foo1": }
>> notify { "value of foo2 -> $my_module:params::foo2": }
>>
>> }
>>
>>
>
> It would be better to use 'include' than 'require' in this case, and you
> mis-typed a couple of your namespace separators, but basically that's fine.
>
>
>
>> Or maybe another one...?
>>
>>
>
> You could also do this:
>
> class my_module::internal (
> $var2,
> $var3,
> ) inherits my_module::params {
> notify { "value of foo1 -> $my_module::params::foo1": }
> notify { "value of foo2 -> $my_module::params::foo2": }
> }
>
> I'm not a big fan of the ::params class pattern in the first place, but if
> you use it then there is some maintenance advantage in keeping all your
> code consistent that way.
>
>
> John
>
> --
> You received this message because you are subscribed to the Google Groups
> "Puppet Users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/puppet-users/a76e0b14-9719-4d18-843c-6ecea3ec1e3e%40googlegroups.com
> <https://groups.google.com/d/msgid/puppet-users/a76e0b14-9719-4d18-843c-6ecea3ec1e3e%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>
> For more options, visit https://groups.google.com/d/optout.
>
--
Perfection is just a word I use occasionally with mustard.
--Atom Powers--
--
You received this message because you are subscribed to the Google Groups
"Puppet Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/puppet-users/CAF-H%3DOkTk4E3i%3DnP9qrXHYandV92fWCdiR6wLULYnzHr6CtRsQ%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.