lucenenet-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Jens Melgaard (JIRA)" <j...@apache.org>
Subject [jira] [Created] (LUCENENET-515) bring back TokenStream.GetAttribute(Type).
Date Fri, 07 Dec 2012 12:49:20 GMT
Jens Melgaard created LUCENENET-515:
---------------------------------------

             Summary: bring back TokenStream.GetAttribute(Type).
                 Key: LUCENENET-515
                 URL: https://issues.apache.org/jira/browse/LUCENENET-515
             Project: Lucene.Net
          Issue Type: Improvement
          Components: Lucene.Net Core
    Affects Versions: Lucene.Net 3.0.3
            Reporter: Jens Melgaard


I Have noticed that TokenStream.GetAttribute(Type) is gone in favor for TokenStream.GetAttribute<Type>();

Obviously TokenStream.GetAttribute<Type>(); but it should not replace TokenStream.GetAttribute(Type),
but instead compliment it... But this is a common pitfall, especially for non-.NET developers
and people who have not run into the implications of this..

In the case of Lucene.NET, it is properly unlikely that this will affect anyone, however,
I consider what has been done bad practice... now why is that?

Many would think like this:

Before I had to do this old thing...
TokenStream.GetAttribute(typeof(TermAttribute));
And god I hated that, so now I replaced it with the much more beautiful:
TokenStream.GetAttribute<TermAttribute>();
And deleted that old hag of a method taking a Type... And now I am happy...

BUT!...

What when...
Type myNotDefinedHereType = GetTypeFromSomeWhere();
TokenSteam.GetAttribute.... ?????!?!?!?... Uhm... What now???? 
Now you have to write a whole lot of reflection mess, use a dynamically compiled delegate
using IL-Emit or the Mono Compiler as a Service...
All of those 3 workarounds are generally just ugly... 

If you keept both...
Type myNotDefinedHereType = GetTypeFromSomeWhere();
TokenSteam.GetAttribute(myNotDefinedHereType);

While it might be unlikely that it will ever be used, there is always the off case, and API's
should support both...

So instead of:

public virtual T GetAttribute<T>() where T : IAttribute
    {
      Type key = typeof (T);
      if (!this.attributes.ContainsKey(key))
        throw new ArgumentException("This AttributeSource does not have the attribute '" +
key.FullName + "'.");
      else
        return (T) this.attributes[key].Value;
    }

Do:
public virtual T GetAttribute<T>() where T : IAttribute
{
   return (T) GetAttribute(typeof(T));
} 
public virtual IAttribute GetAttribute(Type key)
    {
      //Note: Since Type is required to implement IAttribute, I would properly check that
as well to be able to provide a more meaningfull error... However to speed things up, I would
do it inside the if bellow...
      if (!this.attributes.ContainsKey(key))
        throw new ArgumentException("This AttributeSource does not have the attribute '" +
key.FullName + "'.");
      else
        return (T) this.attributes[key].Value;
    }





--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Mime
View raw message