[LLVMdev] RFC: variable names
Xinliang David Li
xinliangli at gmail.com
Mon Oct 13 20:07:15 PDT 2014
For lambdas, you have more contexts to confuse yourself, so why would a
discriminator like '_' not be helpful here?
David
On Mon, Oct 13, 2014 at 5:10 PM, Chandler Carruth <chandlerc at google.com>
wrote:
>
> On Mon, Oct 13, 2014 at 4:42 PM, Richard Smith <richard at metafoo.co.uk>
> wrote:
>
>> On Mon, Oct 13, 2014 at 4:25 PM, Xinliang David Li <xinliangli at gmail.com>
>> wrote:
>>
>>> On Mon, Oct 13, 2014 at 4:00 PM, Chris Lattner <clattner at apple.com>
>>> wrote:
>>>
>>>> On Oct 13, 2014, at 3:44 PM, Chandler Carruth <chandlerc at google.com>
>>>> wrote:
>>>> > I actually have a particular allergy to member variable names and
>>>> function names having similar styles:
>>>> >
>>>> > bool x = i->isMyConditionTrue;
>>>> >
>>>> > Did I mean to write 'isMyConditionTrue()'? Or 'bool &x =
>>>> I->isMyConditionTrue'? Or something else? I have no idea. Warnings and
>>>> other things can help reduce the likelihood of this becoming a live bug,
>>>> but it still makes the code harder to read IMO.
>>>>
>>>> This is exactly why I was making the wishy-washy statement about
>>>> instance variables. This is the pattern that I tend to prefer:
>>>>
>>>>
>>>> class Something {
>>>> bool IsMyConditionTrue;
>>>>
>>>> …
>>>>
>>>> bool isMyConditionTrue() const { return IsMyConditionTrue; }
>>>> }
>>>>
>>>> If you make instance variables be lower camel case, then you get
>>>> serious conflict between ivars and methods. Doing this also deflates some
>>>> of the ammunition used by advocates of _ for ivars :-)
>>>>
>>>
>>> trailing or leading _ for ivars seem to be a common practice. What is
>>> the reason it s not used in LLVM?
>>>
>>
>> [s/ivar/non-static data member/g; we're not using Objective-C ;-)]
>>
>> Leading _ is incompatible with leading capital (it gives you a reserved
>> identifier and thus undefined behavior). I have seen this cause inscrutable
>> compilation failures in practice. (With Chandler's approach for initialisms
>> we may still get leading capitals.)
>>
>> Trailing _ is better, but still suffers from bugs where the wrong entity
>> is used:
>>
>> class A {
>> bool m_;
>> A(bool m) : m_(m_) {} // oops, but we diagnose
>> };
>>
>> Capitalizing member names has the same problems as capitalizing local
>> variable names:
>>
>> struct MyRAIIThing {
>> Sema &Sema; // =(
>> };
>>
>
> In addition to all of this, I disagree that it is reasonable to try to
> differentiate between member and local variables.
>
> struct MyClass {
> static int x;
> int y;
>
> void MyFunction(MyClass a, MyClass b) {
> int c;
>
> std::sort(......, [] {
> std::ptrdiff_t d = ...;
> ++c;
> // ...
> f(a.x);
> g(x);
> h(y);
> });
> }
> };
>
> Between arguments, lambda captures, non-static and static locals, I have
> no idea how to usefully distinguish between x, y, a, b, c and d here. I
> don't think it is meaningful to try. They are *all* variables.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20141013/0c3da05b/attachment.html>
More information about the llvm-dev
mailing list