> On 21 Jan 2020, at 18:55, Jonathan Gibbons <[email protected]> 
> wrote:
> 
> Pavel,
> 
> All great feedback, and all points addressed, as described in the details 
> inline below.
> 
> New webrev, addresses all your comments, adds a couple of class-level doc 
> comments
> to the two new classes, and fixes a couple of inconsequential spelling 
> errors. Otherwise,
> no changes in all the other affected files.
> 
> http://cr.openjdk.java.net/~jjg/8237492/webrev.01/

Thanks for patiently addressing my comments. I see this code review as an
opportunity to get familiar with the javadoc code base.

> <snip>
> 
> The ongoing task is to draw lines around parts of the hodge-podge that is
> {Base,Html}Configuration, and to pull out those parts into separate, better
> defined abstractions.

A noble intent.

> <snip>
> 
>> 1. You have reintroduced a forgotten bounded wildcard to
>> 
>>     public Set<? extends Doclet.Option> getSupportedOptions()
>> 
>> Good. Compatibility-wise this should be benign. Hopefully, no one tries to 
>> put
>> anything into that set, which should be assumed unmodifiable anyway.
> 
> It's only an internal API, and we control the implementations. As they say,
> "No public API was affected in the making of this changeset."

StandardDoclet is a public SPI. Doclets may extend that class, but it's the
"container" that calls the `getSupportedOptions` method. A corner case where the
client calls `getSupportedOptions` would be an implementation of Doclet that
delegates calls to an internal instance of StandardDoclet:

    public class MyDoclet implements Doclet {

        private final StandardDoclet standardDoclet = new StandardDoclet();

        // ...

        @Override
        public Set<? extends Option> getSupportedOptions() {
            Set<Option> supportedOptions = standardDoclet.getSupportedOptions();
            supportedOptions.add(new MyOption()); // additional option
            // ...
            return supportedOptions;
        }

        private static class MyOption implements Doclet.Option {
            // ...
        }
        // ...
    }

Agreed, this is a somewhat contrived example made for the sake of the argument.

>> 2. You consistently used camelCase naming for fields that represent options.
>> This effectively "unlinks" them from their command-line names, which is not 
>> bad.
>> Fewer possibilities to mess this during (automated) future refactorings if 
>> you
>> ask me.
> 
> The option names are often horrible and do not provide a really good
> precedent.

Agreed.

> It's tempting to an an informational source-only annotation that identifies
> the options that affect each field, but without any checking, such annotations
> would be little better than comments ... which is why I added comments
> to identify the options for each value.

This could be addressed another way. Instead of having two separate 
abstractions,
options classes and option fields, we could use a single abstraction, types.

We could use some sort of a container [1]. The downside might be having more
types. A somewhat related design can be seen in java.net.SocketOption API [2].
That latter API tackles the need for more types by relying on option names, yet
still benefits from the type-safety.

That could allow for more collocation of the code related to command-line 
options.

> <snip>
> 
>> 6. AbstractMemberWriter's fields `printedSummaryHeader` and `nodepr` seem 
>> not to
>> be used. Can those be deleted?
> 
> Deleted

The `BaseOptions.docFileDestDirName` field doesn't seem to be accessed from
anywhere. Should it be deleted?

> <snip>
> 
>> While we are in this area, consider hyphenating "command line" where it is a
>> compound adjective rather than a noun (possibly, not an exhaustive list):
>> 
>>   * HtmlConfiguration: 54, 56
>>   * HtmlOptions: 68, 74, 87, 125, 132, 138, 144, 162
>>   * BaseConfiguration: 396, 693
>>   * BaseOptions: 178
>>   * IllegalOptionValue: 32
>>   * Main: 49, 58, 70, 83
>>   * javadoc.properties: 94
> I fixed all instances found by searching for "command line opt"

Thanks!


The below is not a criticism of the refactoring, but rather a commentary on
the current state of affairs.

I don't like that command-line options are represented by public fields that can
be freely accessed from any part of the code. What I find especially unsettling
is that some of the fields of the BaseOptions and HtmlOptions are written from
the outside of those classes. These fields include:

    BaseOptions.docEncoding,
    BaseOptions.javafx,
    HtmlOptions.charset

This field is written *only* from the outside of HtmlOptions:

    HtmlOptions.createOverview

All that points out that Configuration and Options are coupled more tightly than
we may think.

-Pavel

--------------------------------------------------------------------------------
[1] Effective Java, Second Edition by Joshua Bloch,
        Item 29: Consider typesafe heterogeneous containers
[2] See java.net.SocketOption, java.net.StandardSocketOptions,
java.net.Socket.supportedOptions, java.net.Socket.getOption, 
java.net.Socket.setOption

>> P.S. Thanks for being super careful and not only updating the javadoc 
>> comments
>> but also the commented out code in SourceToHTMLConverter!
>> 
>>> On 18 Jan 2020, at 01:51, Jonathan Gibbons <[email protected]> 
>>> wrote:
>>> 
>>> Please review a code-cleanup to reorganize the code to handle doclet 
>>> options.
>>> 
>>> Fundamentally, the change is to move the methods and fields to handle 
>>> option processing from BaseConfiguration and HtmlConfiguration out into new 
>>> abstractions BaseOptions and HtmlOptions.  As such, the dominant changes 
>>> are to these 4 files.
>>> 
>>> The impact on the rest of the doclet code is just to change where to access 
>>> the values for options: instead of accessing the values directly from the 
>>> *Configuration classes, the values are now obtained from the corresponding 
>>> *Option classes, which are in turn accessed from the *Configuration 
>>> classes. The reference to the Options objects are typically cached when 
>>> there are a large number of usages in the code. In a  number of cases, the 
>>> cache is in a supertype, which reduces the visible churn.
>>> 
>>> I've taken this opportunity to rename the fields for the values of options 
>>> into the standard camelCase convention. And, I've done some basic work to 
>>> clean up comments, although more could be done (later).
>>> 
>>> Fixing a bunch of spurious warnings uncoverable a real warning, that the 
>>> code was creating a sorted set of incomparable Option objects. This 
>>> changeset also fixes that issue, which mostly just shows up in the 
>>> signatures for internal collections of option objects.
>>> 
>>> There is no change in functionality here. All the tests pass without 
>>> change, except for one that was tunneling into an impl class, and which 
>>> needed to be updated.
>>> 
>>> There's probably a similar cleanup coming to the code to handle tool 
>>> options.
>>> 
>>> -- Jon
>>> 
>>> 
>>> JBS: https://bugs.openjdk.java.net/browse/JDK-8237492
>>> Webrev: http://cr.openjdk.java.net/~jjg/8237492/webrev/


Reply via email to