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

Simon Willnauer commented on LUCENE-2308:
-----------------------------------------

Hey guys, why don't we put plain old immutable java objects with a single ctor 
into core and add a builder API into modules / sandbox? This keeps things 
simple in core and if users want to use it they can grab it out of a module? 

bq. Can we avoid the builder API? I think we shouldnt invite accidental 
creation of lots of FieldType instances during indexing... why not just a 
single ctor in fieldtype that takes all the parameters the base class cares 
about? then it serves double-duty as the 'expert' fieldtype anyway, subclasses 
like TextField are just the sugar.

so I haven't seen a single technical argument against a builder here. I 
personally think that a builder has many advantages:

* simple to add new fields, doesn't need deprecation if you add another field 
to a type
* simple to use since lots of people are use to chaining
* provides immutability by design
* represents a small but clear DSL to build a field type. you could do things 
like providing setters for TV only if you chain it with a call to indexed() 
like: {code} builder.indexed().storeTV(); {code} which would not be visible 
otherwise. 
* a ctor call will require many parameters that you don't want to set, but 
you're forced to pass a value for them anyway
* since most of the parameters are booleans long sequences of identically typed 
parameters can cause subtle bugs. If the user accidentally reverses two such 
parameters, the compiler won't complain, but the program will misbehave at 
runtime. That sucks! especially if you spend hours of indexing and realize that 
your TV has not been stored because you missed to set indexed = true
* builder code is easy to write and, more importantly, to read.
* a builder simulates named optional parameters like in python and other 
languages which java is lacking.

I think the Builder pattern is a good choice when designing classes whose 
constructors would have more than a handful of parameters, especially if most 
of those parameters are optional. Client code is much easier to read and write 
with builders than with the traditional telescoping constructor pattern.



> Separately specify a field's type
> ---------------------------------
>
>                 Key: LUCENE-2308
>                 URL: https://issues.apache.org/jira/browse/LUCENE-2308
>             Project: Lucene - Java
>          Issue Type: Improvement
>          Components: core/index
>            Reporter: Michael McCandless
>            Assignee: Michael McCandless
>              Labels: gsoc2011, lucene-gsoc-11, mentor
>             Fix For: 4.0
>
>         Attachments: LUCENE-2308-10.patch, LUCENE-2308-11.patch, 
> LUCENE-2308-12.patch, LUCENE-2308-13.patch, LUCENE-2308-14.patch, 
> LUCENE-2308-15.patch, LUCENE-2308-16.patch, LUCENE-2308-17.patch, 
> LUCENE-2308-18.patch, LUCENE-2308-19.patch, LUCENE-2308-2.patch, 
> LUCENE-2308-20.patch, LUCENE-2308-21.patch, LUCENE-2308-3.patch, 
> LUCENE-2308-4.patch, LUCENE-2308-5.patch, LUCENE-2308-6.patch, 
> LUCENE-2308-7.patch, LUCENE-2308-8.patch, LUCENE-2308-9.patch, 
> LUCENE-2308-branch.patch, LUCENE-2308-final.patch, LUCENE-2308-ltc.patch, 
> LUCENE-2308-merge-1.patch, LUCENE-2308-merge-2.patch, 
> LUCENE-2308-merge-3.patch, LUCENE-2308.branchdiffs, 
> LUCENE-2308.branchdiffs.moved, LUCENE-2308.patch, LUCENE-2308.patch, 
> LUCENE-2308.patch, LUCENE-2308.patch, LUCENE-2308.patch
>
>
> This came up from dicussions on IRC.  I'm summarizing here...
> Today when you make a Field to add to a document you can set things
> index or not, stored or not, analyzed or not, details like omitTfAP,
> omitNorms, index term vectors (separately controlling
> offsets/positions), etc.
> I think we should factor these out into a new class (FieldType?).
> Then you could re-use this FieldType instance across multiple fields.
> The Field instance would still hold the actual value.
> We could then do per-field analyzers by adding a setAnalyzer on the
> FieldType, instead of the separate PerFieldAnalzyerWrapper (likewise
> for per-field codecs (with flex), where we now have
> PerFieldCodecWrapper).
> This would NOT be a schema!  It's just refactoring what we already
> specify today.  EG it's not serialized into the index.
> This has been discussed before, and I know Michael Busch opened a more
> ambitious (I think?) issue.  I think this is a good first baby step.  We could
> consider a hierarchy of FIeldType (NumericFieldType, etc.) but maybe hold
> off on that for starters...

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@lucene.apache.org
For additional commands, e-mail: dev-h...@lucene.apache.org

Reply via email to