|
From: Brent Y. <br...@cu...> - 2001-10-29 14:21:43
|
Hello all -
You may want to think about just redefining what you want the different
objects/text-formats to do ... w/o defining subclasses of different
names. I just fixed something I was trying to figure out w/ the help of
dbreslau and others at curl and this seems like it'd work fine and would
be applied nicely here, unless I'm missing something.
Instead of having a package which you import which defines all of your
MyVBox and MyCommandButton overrides, why not just define VBox and
CommandButton to do what you want in the first place - this way you can
actually have different "styles" in different packages.
Try this to see what I mean:
--------------------------------------------------------------
{import * from CURL.GUI.BASE}
{define-class VBox {inherits CURL.GUI.BASE.VBox}
{constructor {default ...}
{construct-super ..., color = "blue"}
}
}
{VBox "this is blue", "because it's my vbox"}
-------------------------------------------------------------
So without changing any existing code, you can instantly redefine what
the objects do simply by importing a package which contains the above
definition. (i think).
Cheers,
Brent
gh...@nc... wrote:
> I'm happy to report that I am now in a position to put together a
> working foundation class library fairly quickly. I would be
> embarassed to say how long it took me to get this far but suffice it
> to say that it has been a very good learning experience. There was
> a bit of a learning curve to working with code in packages.
>
> In this post I want to explain what I propose to do and ask for
> comments to see if there is a consensus on it and related issues.
>
> Ok, let's start with some sample foundation class library code.
> Here is the current Foundation.curl.
> ------------------------------------------------------------------
> ||foundation class for curl-email project
> {curl 1.6 package}
> {package ORG.CURL-EMAIL.FOUNDATION,
> author="",
> version="0.1"}
>
> {import * from CURL.GUI.BASE}
> {import * from CURL.GUI.CONTROL-BASE}
> {import * from CURL.GUI.CONTROLS}
> {import * from CURL.GUI.EXTRAS}
> {import * from CURL.GUI.SINGLETON}
> {import * from CURL.GUI.STANDARD}
> {import * from CURL.GUI.TEXT-EDIT}
> {import * from CURL.GUI.TEXT-FORMATS}
>
> {define-class public MyVBox {inherits VBox}
> {constructor public {default ...}
> {construct-super ...}
> }
> }
>
> {define-proc public {my-vbox ...}:MyVBox
> {return {MyVBox ...}}
> }
>
> {define-class public MyHBox {inherits HBox}
> {constructor public {default ...}
> {construct-super ...}
> }
> }
>
> {define-proc public {my-hbox ...}:MyHBox
> {return {MyHBox ...}}
> }
>
> {define-class public MyCommandButton {inherits
> CommandButton}
> {constructor public {default ...}
> {construct-super ...}
> }
> }
>
> {define-proc public {my-commandbutton
> ...}:MyCommandButton
> {return {MyCommandButton ...}}
> }
>
> {define-class public MyTextField {inherits
> TextField}
> {constructor public {default ...}
> {construct-super ...}
> }
> }
>
> {define-proc public {my-textfield
> ...}:MyTextField
> {return {MyTextField ...}}
> }
> ------------------------------------
> This is largely based on examples from the curl
> basic docs for using rest arguments and the curl
> gui docs for building custom controls.
>
> Here is code that exercises the package above.
> -------------------------------------------
> {curl 1.6 applet}
> {import * from ORG.CURL-EMAIL.FOUNDATION,
> location="file:///c:/cvs/curlmail/curl-
> email/Foundation.curl"}
>
> {value
> {MyVBox "test", background="pink", font-size=14}
> }
>
> {value
> {my-vbox "test", background="yellow", font-
> size=14}
> }
>
> {value
> h:MyHBox = {my-hbox
> background="blue"}b:MyCommandButton = {my-
> commandbutton}
> {h.add b}
> {h.add {my-commandbutton}}
> {h.add {my-textfield width=3in}}
> }
> -----------------------------------------
> (some of the code lines probably got wrapped in
> odd places but hopefully the intent is clear)
>
> I suppose it is obvious that these rasise a
> swarm of questions/issues.
>
> I have worked with vendor supplied class
> libraries prior to curl and one of the golden
> rules that I have accepted is that you never
> create an object in code that inherits directly
> from a vendor library object. Instead all
> objects inherit from your own objects in your
> own libraries. Hence the idea of a foundation
> class library that holds all your lowest level
> objects that inherit directly from vendor
> library objects. The result is that you can
> make global changes in any of your objects by
> changing the corresponding ancestor object in
> your foundation class.
>
> So with the sample code above, instead of having
> VBox objects throughout your code you would have
> MyVBox objects. I've seen the advantages of
> doing this on some fairly large projects and it
> is hard to contemplate the alternative.
> Ultimately you would probably have several other
> objects in a UI package that inherit from MyVBox.
>
> You have probably read Dan Breslau's post where
> he suggests that the golden rule cited above may
> not be warranted and for sure suggests that
> objects should be named according to their
> function. My intent here is to get a feel how
> the rest of the team thinks on these issues and
> not to suggest that mine is the only way to go.
>
> I am new to programming in curl and suspect most
> of the team are relatively new to it too. My
> experience with this type of situation is that
> about the time we get the project finished is
> when we'll know how we wish we had done it from
> the beginning. Having a foundation class object
> underneath all our objects will give us the
> chance to go in and do some of the things we
> wished we had done in the beginning with the
> least amount of effort.
>
> The base class objects are the most generic
> objects of a given type that we will have. In
> the spirit of giving them descriptive names we
> could use GenericVBox instead of MyVBox or maybe
> GenVBox. I am personally not fussy about the
> exact name buy do prefer something rather short
> and consistent. Note in the package code above
> I have written a function for each class that
> returns an object of the given class. This
> would add a layer of indirection that may prove
> valuable and I like it because the curl naming
> conventions mean that function names are all
> lower case. So whether to create all objects
> through a function, directly from the class
> name, or a mix of the two is a related question.
>
> Finally a few smaller questions to think about.
> The location specifier in the package
> declaration above is specific to my computer so
> we need to find a way to deal with that.
> And how about author and version in the package
> declaration. Are we going to use our own names
> or a team name and what version to use for now?
> And what about the file name Foundation.curl?
> Do we want to think about standards for file
> names and indentifier names? Also points of
> style such as spaces around assignment
> operators, etc.
>
> I'm ready to move quickly on building a
> foundation class which for starters would hold
> all the visual GUI classes that I can come up
> with. Foundation classes can also be valuable
> for non-visual objects but it depends a lot on
> what you're doing with them.
>
> Your comments are requested and appreciated.
>
> Gene H.
>
> _______________________________________________
> curl-email-news mailing list
> cur...@li...
> https://lists.sourceforge.net/lists/listinfo/curl-email-news
--
------------------------
Brent A. Young
Technology Evangelist
Curl Corporation
(W) 415.625.5148
(F) 415.625.5142
Tri hard
|