Deutsch English Français Italiano |
<20240626220932.62b9e27e@lud1.home> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Luc <luc@sep.invalid> Newsgroups: comp.lang.tcl Subject: Re: My hang-up about OOP (snit) Date: Wed, 26 Jun 2024 22:09:32 -0300 Organization: A noiseless patient Spider Lines: 124 Message-ID: <20240626220932.62b9e27e@lud1.home> References: <20240625180928.43fcc5c1@lud1.home> <ILKcnRhLs7Cl9eb7nZ2dnZfqnPqdnZ2d@giganews.com> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Injection-Date: Thu, 27 Jun 2024 03:09:33 +0200 (CEST) Injection-Info: dont-email.me; posting-host="45a762fadea9095f510d51d9df4273ce"; logging-data="2529711"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/fP8h3d+xm+sYvELc1jbXD4Z5K/2VPStU=" Cancel-Lock: sha1:v73rfRPE9NXNPyDFe5SXgVksXsM= Bytes: 4630 On Wed, 26 Jun 2024 01:00:40 +0000, Robert Heller wrote: >While the dog example is a bit silly and trivial, there are real world use >cases where this inheritence (delegation) game pays off handsomly. > >It is partitularly usefull for megawidgets. Tk's base widgets are already >written in an OO style. Also snit "compiles" the code to be far more >efficient than either a stack of if's (or a cascade of if ... elseif ... >else ...). In any case, something like: > >snit::type foo { > method a {} {...} > method b {} {...} > method c {} {...} > method d {} {...} > method e {} {...} > method f {} {...} > method g {} {...} > method h {} {...} > method i {} {...} > method j {} {...} >} > >is probably easier to read and debug than > >proc foo {fun args} { > if {$fun eq "a"} { > ... > } elseif {$fun eq "b"} { > ... > } elseif {$fun eq "c"} { > ... > } elseif {$fun eq "d"} { > ... > } elseif {$fun eq "e"} { > ... > } elseif {$fun eq "f"} { > ... > } elseif {$fun eq "g"} { > ... > } elseif {$fun eq "h"} { > ... > } elseif {$fun eq "i"} { > ... > } elseif {$fun eq "j"} { > ... > } else { > error ... > } >} > >The other thing is that the dog example has no instance variables (or >options) -- this seems to make the use of OO pointless. Once you add in >instance variables and options, and start having multiple instances of the >"type" (or more significantly, widgets), you will want to have the common >"code" in one shared place and you will want to have some way of keeping >track of instance variables / instance options and that is of course the >whole point of having reusable widgets in the first place... > >Single instance classes are pretty pointless -- so are classes where all >instances are totally identical (where all of the class instances are 100% >interchangable and carry no instance specific state). That would like >having a "type" 42 (the specific integer with the specific value of 42). > >There are sometimes "classes" like that: there are some specific use cases >-- see "ENSEMBLE COMMANDS" in man snitfaq. I also use this to create "main" >programs where I can encapsulate "global" program data / constants / >parameters (as type variables). I don't really *need* to do this, but it >keeps things tidy and I don't need to use either '::' (global decls) all >over the place and don't have to worry about stepping on some other code's >toes. This is a really good explanation that got me interested. I've been reading up on snit and I like what I see. But I am stuck in this: snit::widget TopWindow { hulltype toplevel delegate option * to hull component of constructor {args} { wm withdraw $win wm resizable $win 1 1 wm attributes $win -zoomed 1 wm geometry $win 60x10+0+0 wm title $win "test" tk appname "test" bind $win <Alt-q> {exit 0} bind $win <Alt-Q> {exit 0} set of [frame $self.of] pack $of -fill both -expand 1 $self configurelist $args puts "self is $self" } } TopWindow .toplevel puts [winfo children .] output: . The snit manual says: "The body of a type constructor is executed once when the type is defined, and never again." So the part that defines frame $self.of should have been executed, right? In which case, $self.of is a child of the toplevel widget, right? Then how come puts [winfo children .] only outputs "." with no mention of the frame? Oh, the 'wm withdraw $win' line doesn't seem to be executed either. The gray box still pops up. -- Luc >>