Fixed. Faster to fix yourself than send an email, no?

Kalle


On Thu, Sep 30, 2010 at 3:31 PM, Josh Canfield <[email protected]> wrote:
> typo in Copyright section:  "try to check the coyright date"
>
> On Thu, Sep 30, 2010 at 2:49 PM, <[email protected]> wrote:
>
>>    Developer 
>> Bible<https://cwiki.apache.org/confluence/display/TAPESTRY/Developer+Bible> 
>> Page
>> *added* by Howard M. Lewis 
>> Ship<https://cwiki.apache.org/confluence/display/~hlship>
>>
>> This is a semi-random outpouring of thoughts related to being a Tapestry
>> committer.
>> IDE IntelliJ
>>
>> It's a free license for all committers and it's just better. Yes, the first
>> few days
>> can be an unpleasant fumble because everything is almost, but not quite,
>> familiar. Pretty soon you'll love IDEA and
>> recognize that Eclipse has been bending you over and doing unspeakable
>> things.
>>
>> There are shared code formatting settings in *<support/idea-settings.jar*>.
>> This will prevent
>> unexpected conflicts due to formatting.
>> Eclipse
>>
>> Howard uses this ... because he can't manage to switch IDEs constantly (he
>> uses Eclipse for training). Lately
>> its gotten better.
>> Copyrights
>>
>> All source files should have a copyright comment on top, except where such
>> a comment
>> would interfere with its behavior. For example, component template files
>> omit the comment.
>>
>> The year on the copyright should be updated as a file changes. As you are
>> reviewing your changes
>> before checking them in, try to check the coyright date, and add the
>> current year to the list if not
>> present.
>> Commit Messages
>>
>> Always provide a commit message. I generally try to work off the JIRA, so
>> my commit message is often:
>>
>> TAP5-1234: Make the Foo Widget more Ajax-tastic!
>>
>> It is *very important* to include the JIRA issue id in the commit. This is
>> used in many places:
>> JIRA links issues to the SVN commits for that issue (very handy for seeing
>> what changed
>> as part of a bug fix). The Hudson CI server does as well, and will actually
>> link SVN commits to issues after
>> succesfully building.
>> JIRA Procedures
>>
>> All Tapestry committers should be registerred with JIRA and part of the
>> tapestry-developers JIRA group.
>>
>> I work the following JIRA list: JIRA Work 
>> Queue<https://issues.apache.org/jira/secure/IssueNavigator.jspa?mode=hide&requestId=12311597>
>> .
>>
>> Ideally, we would always work top priortity to low priority. I (Howard)
>> sometimes jump out of order,
>> if there's something cool to work on that fits in an available time slot.
>> Alternately, you are always
>> allowed to change the priority of a bug before or as you work it.
>> Starting work
>>
>> When you start to work on an issue, make sure it is *assigned to you* and
>> use the *start progress*
>> option.
>>
>> I often add comments about the state of the fix, or the challenges in
>> creating a fix. This often spurs the Issue's adder to
>> provide more details.
>>
>> I often update the issue description to make it more legible and more
>> precise, i.e., "NPE in CheckUpdates"
>> might become "NullPointerException when checking for updates to files that
>> have been deleted". Verbose is good.
>> Closing bugs
>>
>> Is it a bug fix without tests? *No.* In some cases, I write new tests to
>> prove that an issue is not valid and
>> then leave the tests in place – then close the bug as invalid.
>>
>> A good plan is to write a test that fails then work the code until the test
>> passes.
>> I'm also surprised by how often code works in a unit test but fails
>> unexpectedly in an integration test.
>> As the G-Man says *"Expect unforseen consequences"*.
>>
>> When you check in a fix, you should *close* the issue and make sure the *fix
>> release* is correct.
>>
>> We're playing fast and loose – a better procedure would be to mark the bug
>> resolved and verify
>> the fix before closing it. That's ok, we have a community to double check
>> our work .
>>
>> For anything non-trivial, wait for the Hudson CI server to build. It
>> catches a lot of things ... such as
>> files that were not added to SVN. And even IntelliJ has a bit of trouble
>> with wildly refactored code.
>> Hudson will catch all that.
>> Invalid issues and duplicates
>>
>> Always provide comments about why_ an issue is invalid (*"A Ruby
>> implementation of Tapestry is out of scope for the project."*), or at
>> least, a link to the duplicate issues.
>>
>> Close the issue but *make sure the fix release is blank*. Otherwise, the
>> issue _will be listed
>> in the release notes_, which we don't want.
>> Copyrights
>>
>> The ASF copyright must appear on all Java source files. Technically it
>> should appear on all non-binary
>> files in the repository.
>>
>> As you make changes to files, update the copyright to add the current year
>> to the list. The goal is that the copyright
>> notice includes the year in which files change. When creating a new file,
>> don't back date the copyright year ... starwith the current year. Try not to
>> change the copyright year on files that haven't actually changed.
>>
>> IntelliJ has a great comparison view: Cmd-9 to see the local changes, the
>> Cmd-D to see the differences.
>> I whip through the changes (using Cmd-forward arrow) and make sure
>> copyrights are up to date as I review the changes
>> prior to a commit.
>> Public vs. Private/Internal
>>
>> This is a real big deal. As long as code is in the internal package, we
>> have a high degree of carte-blanche
>> to change it. As soon as code is public, we become handcuffed to backwards
>> compatibility.
>>
>> *Interfaces are public, implementations are private*. You can see this is
>> the bulk of the code, where
>> org.apache.tapestry5.services is almost all interfaces and the
>> implementations are
>> in org.apache.tapestry5.internal.services.
>>
>> Many more services have both the interface and the implementation in
>> org.apache.tapestry5.internal.services.
>>
>> We absolutely *do not* want to make Page or ComponentPageElement public.
>> You will often see
>> public service facades that take a page name as a method parameter,
>> and convert it to a page instance before invoking methods
>> on internal services.
>> Evolving Components
>>
>> We do not have a specific plan for this yet. Future Tapestry 5 will add
>> features to allow clean renames
>> of parameters, and a way to deprecated and eventually remove components.
>> Evolving Interfaces
>>
>> Tapestry uses interfaces quite extensively.
>>
>> Interfaces fall into two categories: service interfaces called by user
>> code, and interfaces implemented by user code.
>>
>> Internal interfaces may be changed at any time. That's why so much is kept
>> internal.
>> Service Interfaces
>>
>> New methods may be added if absolutely necessary, but this should be
>> avoided if at all possible. Don't forget
>> the @since Javadoc annotation.
>>
>> Consider having a stable public facade service whose implementation calls
>> into one or more internal service.
>> User Interfaces
>>
>> These should be frozen, no changes once released. Failure to do so causes
>> *non-backwards compatible upgrade problems*;
>> that is, classes that implement the (old) interface are suddenly invalid,
>> missing methods from the (new) interface.
>>
>> Consider introducing a new interface that extends the old one and adds new
>> methods. Make sure you support both.
>>
>> You can see this with ServiceDef and ServiceDef2 (which extends
>> ServiceDef). Yes this can be a bit ugly.
>>
>> I actually have utility methods that convert from ServiceDef to
>> ServiceDef2, adding a wrapper implementation around
>> a ServiceDef instance if necessary:
>>  Use of @since
>>
>> When adding new classes or interface, or adding new methods to existing
>> types, add an @since Javadoc comment.
>>
>> Use the complete version number of the release in which the type or method
>> was added: i.e., *...@since 5.1.0.3*.
>> Code Style
>>
>> Yes, at one time I (Howard) used leading underscores for field names. I've
>> since changed my mind, but
>> I unfortunately infected other people; please try to make your code blend
>> in when modifying existing source.
>>
>> Long ago, Tapestry (3) code used the regrettable "leading-I-on-interfaces"
>> style. Don't do that. Everything's an interface.
>>
>> I prefer braces on a new line (and thus, open braces lined up with close
>> braces), so that's what the default
>> code formatting is set up for. I sometimes omit braces for trivial if
>> statements, such as {{ if (!test) return; }}.
>>
>> I use a lot of vertical whitespace to break methods into logical sections.
>>
>> We're coding Java, not Pascal; I'd much rather see a few checks early on
>> with quick returns or exceptions than
>> have ten-levels deep block nesting just so a method can have a single
>> return statement. In other words,
>> *else considered harmful*. Low code complexity is better, more readable,
>> more maintainable code.
>>
>> I don't bother alphabetizing things, because I have an IDE that lets me
>> jump around easily.
>>
>> *Final is the new private.* Final fields are great for multi-threaded
>> code. Especially when creating
>> service implementations with dependencies, store those dependencies into
>> final fields. Once we're all running
>> on 100 core workstations, you'll thank me. Seriously, Java's memory model
>> is seriously twisted stuff, and
>> assigning to a non-final field from a constructor opens up a tiny window of
>> non-thread safety.
>> Comments
>>
>> Comments are overwhelmingly important. Try to capture the *why* of a class
>> or method. Add lots
>> of links, to code that will be invoked by the method, to related methods or
>> classes, and so forth. For instance,
>> I'll often have an annotation, a worker class for the annotation, and a
>> related service all cross-linked.
>>
>> Comment the *interfaces* and don't get worked up on the *implementations*.
>> Javadoc does a perfectly
>> good job of copying interface comments to implementations, so this falls
>> under the *Dont Repeat Yourself*
>> guideline.
>>
>> Be very careful about documenting what methods can accept null, and what
>> methods may return null. Generally
>> speaking, people will assume that null is not allowed for parameter and
>> method will never return null, unless
>> it is explicitly documented that null is allowed (or potentially returned).
>> Documentation
>>
>> Try and keep the documentation up-to date as you make changes; it is *much
>> * harder to do so later. This is now much easier using the Confluence wiki
>> (you're reading it ).
>>
>> Documentation is the *#1 criticism* of Tapestry!
>> Class and Method Naming Conventions
>>
>> aming things is hard. Names that make sense to one person won't to another.
>>
>> hat being said, I've tried to be somewhat consistent with naming. Not
>> perfectly.
>> Factory, Creator
>>
>> A factory class creates new objects. Methods will often be prefixed with
>> "create"
>> or "new". Don't expect a Factory to cache anything, it just creates new
>> things.
>> Source
>>
>> A source is a level up from a Factory. It *may* combine multiple factories
>> together.
>> It *usually* will cache the result. Method are often prefixed with "get".
>> Find vs. Get
>>
>> For methods: A "find" prefix indicates that a non-match is valid and null
>> may be returned.
>> A "get" prefix indicates that a non-match is invalid and an exception will
>> be thrown
>> in that case (and null will never be returned).
>> Contribution
>>
>> A data object usually associated with a Tapestry IoC service's
>> configuration.
>> Filter
>>
>> Part of a pipeline, where there's an associated main interface,
>> and the Filter wraps around that main interface. Each main interface
>> method is duplicated in the Filter, with an extra parameter used
>> to chain the interface.
>> Manager
>>
>> Often a wrapper around a service configuration, it provides access
>> to the contributed values (possibly after some transformation).
>> To
>>
>> A method prefix that indicates a conversion or coersion from one type to
>> another. I.e., toUserPresentable().
>> Worker
>>
>> An object that peforms a specific job. Workers will be stateless, but will
>> be passed
>> a stateful object to perform some operation upon.
>> Builder
>>
>> An object whose job is to create other objects, typically in the context of
>> creating a core service implementation for a Tapestry IoC service (such as
>> PipelineBuilder
>> or ChainBuilder).
>> Support
>>
>> An object that provides supporting operations to other objects; this is a
>> kind of "loose aggregation".
>> Parameters
>>
>> A data object that holds a number of related values that would otherwise be
>> separate
>> parameter values to a method. This tends to streamline code (especially
>> when using
>> a Filter interface) and allows the parameters to be evolved without
>> changing the method signature.
>> Strategy
>>
>> An object that "plugs into" some other code, allowing certain decisions to
>> be deferred
>> to the Strategy. Often a Strategy is selected based on the type of some
>> object
>> being operated upon.
>> Context
>>
>> Captures some stateful information that may be passed around between
>> stateless services.
>> Constants
>>
>> A non-instantiable class that contains public static fields that are
>> referenced in multiple places.
>> Hub
>>
>> An object that allows listeners to be registered. Often includes a method
>> prefixed with "trigger"
>> that will send notifications to listeners.
>> Implement toString()
>>
>> Objects that are exposed to user code should generally implement a
>> meaningful toString() method.
>> And that method should be tested.
>> Subclassing
>>
>> You'll notice there isn't a lot of inheritance in Tapestry. Given the
>> function of the IoC container,
>> it is much more common to use some variation of *aggregation* rather than
>> *inheritance*.
>>
>> Where subclassing exists, the guideline for constructor parameters is: the
>> subclass should include all
>> the constructor parameters of the superclass, in the same positions. Thus
>> subclass constructor parameters
>> are appended to the list of super-class constructor parameters.
>>   Change Notification 
>> Preferences<https://cwiki.apache.org/confluence/users/viewnotifications.action>
>> View 
>> Online<https://cwiki.apache.org/confluence/display/TAPESTRY/Developer+Bible>
>>
>
>
>
> --
> --
> http://www.bodylabgym.com - a private, by appointment only, one-on-one
> health and fitness facility.
> --
> http://www.ectransition.com - Quality Electronic Cigarettes at a reasonable
> price!
> --
> TheDailyTube.com. Sign up and get the best new videos on the internet
> delivered fresh to your inbox.
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to