Yes, I think I agree that it was a mistake. Also try to recall that
one thing that was considered at the time was to support Concerns on
Property methods, and using Property subtypes was a path forward on
that (although we never get to implement it).

On Fri, Jul 1, 2011 at 1:14 PM, Rickard Öberg <[email protected]> wrote:
> Hi,
>
> In looking at things to simplify, I am now checking the support for Property
> subtypes. Example:
>    @MaxLength( 50 )
>    interface Name
>        extends Property<String>
>    {
>    }
> ---
> The idea here is that you can declare "Name name()" in many places, and it
> will apply the same constraints, i.e. "it's a string property with max
> length 50".
>
> When looking through the code I find two issues with this:
> 1) It is REALLY hard to separate between the notion of "value" and "property
> of value". One of the key usages, for example, is by Niclas in the logging
> library, where he himself confuses this and so created a Property<LogType>
> even though LogType is a property subtype already. A simple enum performed
> the same task, but much clearer.
>
> 2) It is also not clear how clients are supposed to instantiate these for
> setting the properties. With the above, you cannot really create a LogType
> unless you first create a value with it, set it, and then take the
> property-with-value from the LogType. But then taking it gets all
> complicated when an Entity-internal LogType property is to be updated with a
> LogType property coming from an external Value. Messy beyond belief.
>
> And so, there seems to be at least three better ways to accomplish what
> Property subtypes were supposed to do:
> 1) Use enums
> 2) Use composite domain-specific constraints:
>    @ConstraintDeclaration
>    @Retention( RetentionPolicy.RUNTIME )
>    @MaxLength(50)
>    public @interface Name {}
> Which then is used as:
>    @Name Property<String> name();
> or in method calls:
>   void changeName(@Name String newName);
>
> 3) Create a ValueComposite:
>   interface Fullname
>      extends ValueComposite
>   {
>      @Name Property<String> givenName();
>      @Name Property<String> surName();
>   }
> ---
>
> So, considering this I am therefore removing the support for Property
> subtyping. This will also make it easier to see in code exactly what a
> method is for ("Property<String> name()" is immediately identified as a
> Property declaration, whereas "Name name()" isn't).
>
> I hope this is ok with everyone.
>
> /Rickard
>
> _______________________________________________
> qi4j-dev mailing list
> [email protected]
> http://lists.ops4j.org/mailman/listinfo/qi4j-dev
>



-- 
Niclas Hedhman, Software Developer
http://www.qi4j.org - New Energy for Java

I live here; http://tinyurl.com/3xugrbk
I work here; http://tinyurl.com/24svnvk
I relax here; http://tinyurl.com/2cgsug

_______________________________________________
qi4j-dev mailing list
[email protected]
http://lists.ops4j.org/mailman/listinfo/qi4j-dev

Reply via email to