11.01.2017, 21:55, "Geoffrey Garen" <gga...@apple.com>:
> I’m open to auto, but skeptical.
>
> (1) Research-ability. I read a lot of code that is new to me, that I have 
> never written. I find type statements to be useful as documentation for where 
> to look for more information about how data structures and algorithms relate 
> to each other. Traversing a tree or list of data structures by type name 
> while reading code is a common task for me. But I can’t select and search for 
> auto, auto*, or auto&.
>
> (2) Mechanics. It’s totally true that if you loop over one collection and put 
> the values into another collection, subject to some filter, the types 
> involved aren’t really interesting to reviewing the filter. But if you want 
> to review low-level mechanics like object lifetime and thread safety, 
> suddenly the types are really important. I think the “I changed RefPtr to 
> auto and then crashed” examples in this thread are about mechanics.
>
> I find it strange that, as JavaScript authors adopt tools like TypeScript 
> because they find type-less programming to be unmaintainable, C++ authors 
> move toward type-less programming. Perhaps the grass is always greener on the 
> other side. Or perhaps we can strike a balance and put types where they help 
> us.
>
> Two arguments made in favor of auto don’t fully convince me:
>
> (1) You were always able to hide the types of certain expressions.
>
> I’m hoping the point of this argument is not to say “in for a penny, in for a 
> pound”, but rather to raise our awareness that we’ve been OK with certain 
> type-less expressions all along. I agree: I'm OK with hiding types in some 
> places, especially if surrounding code already provides some kind of type 
> foothold.

Please don't confuse dynamic typing and static typing with type deduction.

>
> At the same time, I sometimes break expressions into statements to improve 
> clarity and research-ability or to achieve certain mechanics.
>
> Maybe this answers Darin’s question:
>
>>  Here’s one thing to consider: Why is it important to see the type of 
>> foundSource->value, but not important to see the type of 
>> shifts.take(source)? In both cases they need to be Vector<ShufflePair>.
>
> In the cited code, ‘shifts’ is declared as HashMap<Arg, Vector<ShufflePair>>, 
> and HashMap ’take' is well understood to return its value type, so no further 
> comment about type is necessary for me on this line.
>
> Following this logic, I might be OK with eliding the type of 
> foundSource->value. But we’re starting to reach a limit. Each time we do this 
> we create an auto link in the type chain. If I have to trace back three autos 
> deep in order to understand a type, I’m gonna have a bad time. Each type 
> declaration is a stopping point for research. Therefore, I don’t prefer the 
> fully auto version of this code.
>
> Following this logic, I would be OK with const auto& a little later in this 
> algorithm:
>
>>              bool isRotate = false;
>>              for (const ShufflePair& pair : currentPairs) {
>>                  if (pair.dst() == originalSrc) {
>>                      isRotate = true;
>>                      break;
>>                  }
>>              }
>
> Might as well use const auto& for ‘pair’: The type of currentPairs is 
> well-documented locally. If currentPairs were a data member, and not declared 
> in the same screenful of code, I would want to write out a type for ‘pair’. 
> Otherwise, I would have to open another file to understand this line.
>
> But somebody said we don’t like const auto&? Is this a gotcha somehow?
>
> (2) You can’t be sure of the stated type, since a type conversion may have 
> happened.
>
> Knowing that a value is equivalent to a certain type still provides a 
> foothold for research and understanding mechanics.
>
> We only allow automatic type conversion when we consider types to be 
> reasonably equivalent. We consider it bad style to convert willy-nilly, and 
> we use the explicit keyword to avoid errant conversions. For example, we 
> don’t allow RefPtr to automatically convert to raw pointer.
>
> Geoff
> _______________________________________________
> webkit-dev mailing list
> webkit-dev@lists.webkit.org
> https://lists.webkit.org/mailman/listinfo/webkit-dev

-- 
Regards,
Konstantin
_______________________________________________
webkit-dev mailing list
webkit-dev@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-dev

Reply via email to