Hi All:

I think naming things as best we can is important, so I'd like to talk
about the following.

We have in HttpCore 5:

package org.apache.hc.core5.io;

import java.io.Closeable;

/**
 * Process or endpoint that can be gracefully closed.
 *
 * @since 5.0
 */
public interface GracefullyCloseable extends Closeable {

    /**
     * Closes this endpoint and releases any system resources associated
     * with it. If the endpoint is already closed then invoking this
     * method has no effect.
     */
    void shutdown(ShutdownType shutdownType);

}

- The interface is called GracefullyCloseable and it extends Closeable (which
implements close() of course)
- The only method in GracefullyCloseable is Javadoc'ed as "Closes ..."
- And yet the method is _not_ called close(ShutdownType). which feels odd
to me.

IMO, either the interface name or the method name needs to change...

Then we have:

/**
 * Shutdown type.
 *
 * @since 5.0
 */
public enum ShutdownType {

    IMMEDIATE, GRACEFUL

}

If an object is "gracefully closeable":
- it does not sound right to ask it to close "immediately", which is not
graceful, and
- it sounds redundant to ask it to close gracefully since it is you already
told me it is "gracefully closeable" which now sound like the object is
only _optionally_ gracefully closeable.
- then, there is the third option of calling close() which becomes a
implementation dependent mystery as to close() meaning close(IMMEDIATE) or
close(GRACEFUL). I suppose the Javadoc for an implementation of close()
should tell me that ;-)

This tells me that the interface is misnamed. This interface offers
graceful shutdown as an _option_, not a given. IOW it could also be called
ImmediatelyCloseable which would be just as confusing.

So for me I would like the interface name to tell me that the object is
closable but can do so with options and in this case the options are on how
cleanly or politely (I suppose) we are tidying things up.

How about TypedCloseable? StyledCloseable? ParameterizedCloseable? It's
hard to find a better name! ;-)

Another oddity is that Closeable.close() throws an IOException and our
close(ShutdownType) throws nothing. So does that mean I can safely ignore
IOExceptions from close()?

Thank you ,
Gary

Reply via email to