Sanesh writes:
> Recently I completed a project that was done using SERVLETS.
>
> I need some help in documenting the application. What is the standard
> way or methods in documenting?

     A few months back, a technical writer on another mailing list I'm
on asked a similar question.  Keep in mind that the following answer
is an ideal; obviously the closer you get to it, the better, but "no
project is ever released; it escapes."

> My company has recently completed a visual basic/java application
> and we now need to document the code. (All we've done so far is print
> out the code itself.) Does anyone out there have experience with this?

     Depends, of course, on what "document the code" means.  Peter, Jim
and Bruce gave excellent advice.  Here's a bit more perspective, assuming
you're talking about documenting the source to help a programmer later
modify, maintain, or analyze the code.

     The program consists of one or more object classes, each of which
has one or more methods that interact with each other and other
objects.  You should document at four levels:

     The first level, the overview, should describe each object, what
it does, and which of the other objects it interacts with, and how.

     The second level should describe each object in terms of the
methods and the object variables, and what purposes they serve, and
which methods call other methods.  This section should look at the
code more as a whole, not in the components.  It should document the
flow of execution and the relationships (method calls) among the
objects, not simply list each object and the methods and variables
associated with it.

     The third level should describe each method in general terms, the
general structure of the method, which other methods and variables it
calls, and even which methods it expects to be called from (this last
is most likely to get changed over time, but at least it will give the
reader an idea of what the method was designed for).  The arguments to
the method should be described, specifically what they *mean*, where
they're probably set elsewhere in the program, and what the method
will do to them or use them for.

     The fourth level is comments in the source code of the objects
and methods themselves.  Focus on why something is being done, and not
just what is being done.  "Decrement the counter" as a comment isn't
terribly useful.  Knowing where the counter is from, where it was set,
what it's counting, and why it needs to be decremented would be
better.

     Part of the "documentation" at the fourth level is simply code
style for legibility & comprehensibility.  A good indentation style,
grouping things so they can be easily understood.  Put the accessor
methods at the beginning of the object.  Put the mutator methods next.
Then probably the handful of methods that do most of the work, and are
called by the accessors and mutators.  Then specialized methods
(usually rather short and singular of purpose, and only called from
the handful of methods that do most of the work).

     Name methods and variables appropriately so it's easy, having
read the read of the code, to guess what a method is doing.  Also
name them so they make it explicit what they are.  For example, if
a variable is a static configuration variable then name it so it
reflects that, and unless they're commonly used throughout the
program, include a comment when you use it, so the reader can understand
what method initializes the variable, and also note where that method
was invoked from.

     The documentation should be incorporated into the source code, so
it will always be where the code is.  The compiler will remove it when
it's compiled.  The third level stuff should be at the beginning of
each method.  The second level stuff should be at the beginning of
each object.  The first level stuff should probably be at the
beginning of the main object.  All of the levels will overlap to a
degree.

     Changes should be noted in comments at the point the code is
changed, including a date/time stamp, and in a master list of changes
at the beginning of the main object (with pointers to the location
in the code where the change was made).

     To give something of a brief example of the multi-level approach:

   First level description of the XYZZY thesaurus server:

     xyzzy - the main object, starts the program, instantiates
          configuration (which instantiates thesaurus), instantiates
          a pool of portlisteners, which listen at the configured port
          for a request and then look up synonyms in the thesaurus object.

     configuration - loads the configuration file, parses it, sets all of
          the configuration variables, and instantiates the thesaurus.

     thesaurus - the thesaurus data, a static object globally available
          to the rest of the program, instantiated by the configuration
          object.

     portlistener - instantiated in a pool by xyzzy, takes turns
          listening at the port to serve the next request.

   Second level description:

              xyzzy.java is the main object; execution starts when you
         load the class and the main() method is invoked.

              xyzzy.main() method calls the xyzzy.load_config()
         method, which instantiates configuration.java (invoking
         configuration.init()), and saves the returned values as
         object variables.

              configuration.init() loads in the config file, sets all
         of the configuration options, including file locations, how
         many port listener objects to maintain in the pool, port to
         listen on, permissions, etc, see configuration file or
         configuration.java source for details on which options are
         configurable.  Then init() invokes
         configuration.load_thesaurus().

              configuration.load_thesaurus() instantiates the
         thesaurus object as a static class variable, passing the
         thesaurus data file in from the configuration file.

              configuration.init() returns references to the the
         configuration options and the thesaurus object to
         xyzzy.main().

              xyxxy.main() instantiates a pool of portlistener objects
         and invokes portlistener.listen() with the port number as an
         argument on the first portlistener.

              portlistener.listen() listens on a port until it gets a
         request, whereupon it relinquishes the port back to
         xyzzy.main() to assign a new portlistener, and invokes
         portlistener.do_request() to asnwer the request.

              portlistener.dorequest() invokes thesaurus.lookup(),
         passing the arguments of the request...

   Third level description:
         .
         .
         .
         etc.


     If you produce a printed form of this, it helps to use some sort
of visual cue (indentation, boxes, colors, whatever) to delineate the
methods that are internal to an object.  In code source, indentation
usually piles up too quickly and you end up indenting 40 spaces, which
just gets too unwieldly.

     Note: The configuration file mentioned above should include
copious comments before each configuration option, explaining what it
means, what the various options are, and recommending a course of
action for the user.  The "default" configuration should work, if
there are things that can't be left to the default, the installation
program should figure them out or explain the question to the user and
get the data and set the configuration.

Steven J. Owens
[EMAIL PROTECTED]
[EMAIL PROTECTED]

___________________________________________________________________________
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff SERVLET-INTEREST".

Archives: http://archives.java.sun.com/archives/servlet-interest.html
Resources: http://java.sun.com/products/servlet/external-resources.html
LISTSERV Help: http://www.lsoft.com/manuals/user/user.html

Reply via email to