[ 
https://issues.apache.org/jira/browse/HIVE-3394?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13437715#comment-13437715
 ] 

Carl Steinbach commented on HIVE-3394:
--------------------------------------

@Tim: Thanks for taking time to look into this.

I recommended using the builder pattern because these constructors are 
unreadable due to the large number of input parameters. Replacing a twenty-one 
parameter constructor (i.e. CreateTableDesc()) with a builder object that takes 
21 input parameters doesn't really solve the problem. Here's a quote from 
chapter2 of Bloch's Effective Java book:

{quote}
Instead of making the desired object directly, the client calls a constructor 
(or static factory) with all of the the *required parameters* and gets a 
builder object. Then the client calls setter-like methods on the builder object 
to set each *optional parameter* of interest. Finally, the client calls a 
parameterless build() method to generate the object, which is *immutable*.
{quote}

Taking CreateTableDesc as an example, I think the only *required* parameters 
are tableName and cols. Everything else should have a default value that can 
optionally be overridden using a setter exposed by the Builder.

Another problem with many of these objects (including CreateTableDesc) is that 
they should be immutable, but currently aren't. This is a consequence of the 
fact that many of the getters return references to mutable instance variables. 
For example, CreateTableDesc.getPartCols() returns a reference to the internal 
list, which means that if I add an element to the list I actually modified the 
internal state of the CreateTableDesc object. The workaround for this problem 
is to return a copy of the internal list instead of the list itself.

Also, I saw a lot of raw types on the LHS (e.g. ArrayList instead of List).

                
> Refactor a few classes' constructors with creational patterns
> -------------------------------------------------------------
>
>                 Key: HIVE-3394
>                 URL: https://issues.apache.org/jira/browse/HIVE-3394
>             Project: Hive
>          Issue Type: Bug
>            Reporter: Gang Tim Liu
>            Assignee: Gang Tim Liu
>            Priority: Minor
>         Attachments: HIVE-3394.patch.1
>
>
> It's good to refactor the following classes' constructors with 
> builder/factory pattern. This should be done before HIVE-3072 so that 
> HIVE-3072 can refresh according and extend it to skewed use case:
> 1. MStorageDescriptor.java
> 2. ColumnInfo.java
> 3. ParseContext.java
> 4. CreateTableDesc.java
> 5. ExprNodeColumnDesc.java

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to