But that is my point precisely. We don't "offer" the impl classes to clients to extend. Only the classes in the API.

Scott

Scott

Cristi Toth wrote:
Well I think we don't see the problem in the same way.

What does good design mean in this case ...!?
Making some methods protected and remove the final for others doesn't hurt Trinidad itself at all.
So you can't say this is bad design.

If the bad design refers to what we offer the clients, than this is definitely wrong. Because a quite a lot of clients that me or some of my collaborators have interacted with,
have complained a lot about Trinidad code that's so CLOSED !!!
Many said that instead of trying a small feature to the trinidad table,
you better take the Tomahawk one, and add all the feature you need on it.
It's easier and cleaner.

The faces-config allows you to override any renderer for any component, right !?
So renderers are meant to be overriden. (by the JSF spec)
This is the beauty of JSF, because it's so flexible and customizable.
How do you expect to override Trinidad renderers?
Copying all the code and make some small changes?
Imagine that overriding some behaviour of some larger renderers,
you have to override the whole renderer hierarchy (i.w. LabelAndMessageRenderer).

Between duplicating the whole renderer code
and just having some protected renderer methods,
which sounds better in design?

If we talk about backwards compatibilty,
then imagine a whole duplicated renderer which isn't aware of any other updated renderers...
And if a custom renderer developer gets a compile error after an update,
I assume it won't take him to much time to fix it...

If a renderer is not in the API, this means that it shouldn't be overriden !? Let's think a bit out of the box and try to figure what's best for the client.
Because that's what matters most...

regards,

On Thu, Apr 10, 2008 at 11:34 PM, Scott O'Bryan <[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>> wrote:

    The overuse of final is largely irrelevant in impl packages.  The
    reason is that removing a final allows the class to remain binary
    compatible and only items inside of the impl package should be
    extending the class.

    In some cases, final helps ensure an implied contract.  In other
    words, if something is final, you know it's implemented nowhere
    else.  In API's I agree with Andy, final should be used only to
    enforce a contract that should not (can not) change.  Most
    commonly this is used on immutable classes/api but it has some
    other uses.

    Scott


    Andy Schwartz wrote:

        Hi Andrew -

        On Thu, Apr 10, 2008 at 4:36 PM, Andrew Robinson
        <[EMAIL PROTECTED]
        <mailto:[EMAIL PROTECTED]>> wrote:
            I wasn't suggesting blind removal.

        Okay.  The use of the word "most" gave me that impression. :-)

            IMO final should rarely ever be used, for open source it
            almost never does
            anyone any good.

        Final should be used for its intended purpose.  Sure, in some
        cases
        final may be abused, but then those cases should be corrected.
         That
        doesn't mean that final should rarely be used - it should be
        used when
        appropriate.

        Again, I don't see how open vs. closed source comes into play
        here.
        Good API design is good API design, whether open or closed source.

            I would suggest a renderer-by-renderer approach though,
            not method-by-method
             as that would take too long to file that many bugs.

        I am not sure I understand the difference between these
        approaches.
        At some point somebody will need to evaluate specific methods to
        determine whether changes are required.

        Personally I prefer the approach that Blake alluded to, which
        is to
        open things up as the need arises.  (I may have missed it, but
        I don't
        remember seeing the particular offending cases which triggered
        this
        discussion.)

             Right now Trinidad and facelets are by far the most
            inflexible open
             source code I have worked with. Both over-use final and
            both assume
             that out-of-the box behavior is enough fore everyone's
            needs. For
             Trinidad renderers, many only expose encodeAll as
            protected then do
             most of the work in private methods. As a result a person
            needing to
             customize a renderer has to use copy & paste (generate an
            entirely new
             renderer using the source of the core one) which really
            sucks for
             maintenance.

        I don't understand this at all.  Why would anyone do that, vs.
        log an
        issue, submit a patch, fix the problem, revel in the magic of open
        source?

        Is the issue here really that the renderers as a whole are
        considered
        off-limits to subclassing, due to the fact that they are
        located in
        trinidadinternal (not trinidadapi)?

        Andy




--
Cristi Toth

-------------
Codebeat
www.codebeat.ro <http://www.codebeat.ro>

Reply via email to