Documentation and Documentation Generators

Steven J Zeil

Last modified: Sep 14, 2017
Contents:
1 Source Code Documentation
1.1 Comments
1.2 Self-Documenting Code
1.3 Charting
2 API Documentation
2.1 javadoc
2.2 doxygen
2.3 Other API Documentation Generators
3 Project Reports
3.1 Test Reports
3.2 Static Code Analyzers
3.3 Configuration Reports
4 Project Websites
4.1 Publishing to a website
4.2 Forges

… because everyone loves writing documentation.

Abstract

In this lesson we will examine several common categories of program documentation:

We’ll explore the reasons why source code comments and many traditional forms of charting have declined in perceived value, and why there is increasing emphasis on API documentation and project reports.

We will look at automated tools for generating and publishing API documentation and project reports.

1 Source Code Documentation

1.1 Comments

1.1.1 Do Comments Matter?

McConnell has a good & balanced discussion on this.

Modern focus has shifted considerably away from commenting bodies towards API documentation.

1.1.2 Which is better?

double m; // mean average
double s; // standard deviation
double meanAverage
double standardDeviation

1.1.3 Which is better?

// Sum up the data
double sum = 0.0;
double sumSquares = 0.0;
// Add up the sums
for (double d: scores)
{
   sum += d;
   sumSquares += d*d;
}

// Compute the average and standard
//  deviation
double meanAverage = sum / numScores;
double standardDeviation =
   sqrt ((sumSquares - numScores*sum*sum)
            /(numScores - 1.0));

// Subtract the average from each data
// item and divide by the standard
// deviation.
for (int i = 0; i < numScores; ++i)
{
   scores[i] = (scores[i] - meanAverage)
       / standardDeviation;
}

// Compute summary statistics
double sum = 0.0;
double sumSquares = 0.0;

for (double d: scores)
{
   sum += d;
   sumSquares += d*d;
}

double meanAverage = sum / numScores;
double standardDeviation =
   sqrt ((sumSquares - numScores*sum*sum)
            / (numScores - 1.0));

// Normalize the scores
for (int i = 0; i < numScores; ++i)
{
   scores[i] = (scores[i] - meanAverage)
       / standardDeviation;
}

1.1.4 Which is better?

// Compute summary statistics
double sum = 0.0;
double sumSquares = 0.0;

for (double d: scores)
{
   sum += d;
   sumSquares += d*d;
}

double meanAverage = sum / numScores;
double standardDeviation =
   sqrt ((sumSquares - numScores*sum*sum)
            /(numScores - 1.0));

// Normalize the scores
for (int i = 0; i < numScores; ++i)
   scores[i] = (scores[i] - meanAverage)
       / standardDeviation;

void computeSummaryStatistics (
   const double* scores,      // inputs
   int numScores,
   double& meanAverage,       // outputs
   double& standardDeviation)
{
  double sum = 0.0;
  double sumSquares = 0.0;
  for (double d: scores)
  {
	 sum += d;
	 sumSquares += d*d;
  }

  meanAverage = sum / numScores;
  standardDeviation =
	 sqrt ((sumSquares - numScores*sum*sum)
			  /(numScores - 1.0));
}


void normalizeData (double* data,
                    int numData,
                    double center,
					double spread)
{
  for (int i = 0; i < numData; ++i)
    data[i] = (data[i] - center) / spread;
}

    ⋮

double meanAverage;
double standardDeviation;
computeSummaryStatistics (scores, numScores,
    meanAverage, standardDeviation);
normalizeData (scores, numScores,
    meanAverage, standardDeviation);

1.1.5 Which is better?

void computeSummaryStatistics (
   const double* scores,      // inputs
   int numScores,
   double& meanAverage,       // outputs
   double& standardDeviation)
{
  double sum = 0.0;
  double sumSquares = 0.0;

  for (double d: scores)
  {
	 sum += d;
	 sumSquares += d*d;
  }

  meanAverage = sum / numScores;
  standardDeviation =
	 sqrt ((sumSquares - numScores*sum*sum)
			  /(numScores - 1.0));
}


void normalizeData (double* data,
                    int numData,
                    double center,
					double spread)
{
  for (int i = 0; i < numData; ++i)
	 data[i] = (data[i] - center) / spread;
}
    ⋮

double meanAverage;
double standardDeviation;
computeSummaryStatistics (scores, numScores,
    meanAverage, standardDeviation);
normalizeData (scores, numScores,
    meanAverage, standardDeviation);
void computeSummaryStatistics (
   const double* scores,      // inputs
   int numScores,
   double& meanAverage,       // outputs
   double& standardDeviation)
{
  double sum = accumulate(
     scores, scores+numScores);
  double sumSquares = accumulate(
     scores, scores+numScores,
     [](double x, double y)
	   {return x + y*y;});

  meanAverage = sum / numScores;
  standardDeviation =
	 sqrt ((sumSquares - numScores*sum*sum)
			  /(numScores - 1.0));
}


    ⋮

// Normalize the scores
double meanAverage;
double standardDeviation;
computeSummaryStatistics (scores, numScores,
    meanAverage, standardDeviation);
transform (
    scores, scores+numScores,
	scores,
    [] (double d) {
	  return (d - meanAverage)
	           / standardDeviation});

1.1.6 Kinds of Comments

1.2 Self-Documenting Code

Self-Documenting code relies on good programming style to perform most of the documentation.

1.2.1 Characteristics of Self-Documenting Code

Classes

Routines

Data Names

Data Organization

Control

Layout

Design

(McConnell, ch 32)

1.3 Charting

How many forms of software documentation charting do you know?

1.3.1 From Code to Charts

1.3.2 From Charts to Code

A hallmark of so-called CASE (Computer-Aided Software Engineering) systems

2 API Documentation

API documentation tools are now more common

2.1 javadoc

Perhaps the best known tool in this category

2.1.1 Javadoc Comments


Common Javadoc Markup


Running javadoc

<javadoc packagenames="edu.odu.cs.*" 
         destdir="target/javadoc" 
         classpathref="javadoc.classpath" Author="yes" 
         Version="yes" Use="yes" defaultexcludes="yes">
   <fileset dir="." defaultexcludes="yes">
      <include name="extractor/src/main/java/**" />
      <include name="generatedSource/gen-src/**" />
      <exclude name="**/*.html" />
   </fileset>
   <doctitle><![CDATA[<h1>ODU CS Extract
                    Project</h1>]]></doctitle>
</javadoc>

2.2 doxygen


Running doxygen

2.3 Other API Documentation Generators

Because a documentation generator needs to module and function structure and function parameters, a distinct parser is needed for each programming language.

This leads to a variety of language-specific tools, e.g.,

3 Project Reports

3.1 Test Reports

We’ve already looked JUnit, which can be used to generate test reports like this one.

This is generated in ant via the junitreport task:

junitreport.xml.listing
<project name="code2html" basedir="." default="build">

  <record name="ant.log" action="start" append="false" />

  <taskdef classpath="JFlex.jar" classname="JFlex.anttask.JFlexTask" name="jflex" />
	
  <echo>loading build-${os.name}.paths</echo>
  <include file="build-${os.name}.paths"/>
	

  <target name="generateSource">
    <mkdir dir="src/main/java"/>
    <jflex file="src/main/jflex/code2html.flex"
	   destdir="src/main/java"/>
  	<jflex file="src/main/jflex/code2tex.flex"
  	       destdir="src/main/java"/>
    <jflex file="src/main/jflex/list2html.flex"
	   destdir="src/main/java"/>
  	<jflex file="src/main/jflex/list2tex.flex"
  	       destdir="src/main/java"/>
  </target>
  

  <target name="compile" depends="generateSource">
    <mkdir dir="target/classes"/>
    <javac srcdir="src/main/java" destdir="target/classes"
	   source="1.6" includeantruntime="false"/>
  </target>

  <target name="compile-tests" depends="compile">
    <mkdir dir="target/test-classes"/>
    <javac srcdir="src/test/java" destdir="target/test-classes"
	   source="1.6" includeantruntime="false">
      <classpath refid="testCompilationPath"/>
    </javac>
  </target>

  <target name="test" depends="compile-tests">
  	<property name="mypath" refid="testExecutionPath"/>
  	<echo>testExecutioPath is ${mypath}</echo>
  	<echoproperties/>
    <mkdir dir="target/test-results/details"/>
    <junit printsummary="yes" 
	   haltonfailure="yes" fork="no"
	   >
        <classpath refid="testExecutionPath"/>
      <formatter type="xml"/>
      <batchtest todir="target/test-results/details">
	     <fileset dir="target/test-classes">
	        <include name="**/*Test*.class"/>
	     </fileset>
      </batchtest>
    </junit>
    <junitreport todir="target/test-results">
      <fileset dir="target/test-results/details">
        <include name="TEST-*.xml"/>
      </fileset>
      <report format="frames" todir="target/test-results/html"/>
    </junitreport>
  </target>

  <target name="build"  depends="test">
  	<jar destfile="codeAnnotation.jar" basedir="target/classes">
  	    <manifest>
  		    <attribute name="Main-Class"
  		               value="edu.odu.cs.code2html.Code2HTML"/>
  		</manifest>
  	</jar>
  </target>

  <target name="clean">
    <delete dir="target"/>
  </target>

  
</project>

Other common test reports

3.2 Static Code Analyzers

Many tools that we will cover later for analyzing code can produce useful (or at least, impressive) documentation as a side effect.

3.3 Configuration Reports

Configuration managers (to be covered later) generate reports about the dependencies among the software components.

Examples:

4 Project Websites

4.1 Publishing to a website

You can also add instructions to your build manager to post files to a website.

Common cases:

  1. The web server is on the same file system as the development machine.

    e.g., You are developing on atria.cs.odu.edu and can publish web pages on http://www.cs.odu.edu/~yourName by simply placing files in ~yourName/public_html.

  2. The web server is on the a separate file system, possibly a spearate local network, from the development machine.

    • You will need an account on the web server through which you can do ftp or sftp file transfers.

  3. Continuous Integration servers often integrate web services for automatically generated reports.

We’ll look at examples of the first two cases now, and the third later n the semester.

4.1.1 Shared File System

4.1.2 Copy over network

4.2 Forges

A software forge is a collection of web services for the support of collaborative software devlopment:


Forge Examples

Among the best known forges are

The CS 350 course has its own forge