Phango
Bill Baxter
dnewsgroup at billbaxter.com
Sun Nov 18 13:16:03 PST 2007
Lars Ivar Igesund wrote:
> Bill Baxter wrote:
>
>> torhu wrote:
>>> Lars Ivar Igesund wrote:
>>> >> Mixed case package/module names are avoided because there needs to be
>>> >> a
>>>>> 1:1 correspondence between file names and package/module names, and not
>>>>> all file systems are case sensitive (like FAT32 and NTFS, for a couple
>>>>> widely used examples).
>>>> As I said elsewhere in the thread, other FS _are_ case sensitive, and
>>>> thus
>>>> you need to be aware of which case you use in either case, rendering the
>>>> argument moot. Early on in D history, I encountered several cases of
>>>> modules being saved on Windows, then not working on Linux with their
>>>> intended module names due to this. And this can only happen if the
>>>> Windows
>>>> programmer typed in a file name with upper case letters, even though the
>>>> module name was all lower case.
>>>>
>>> I believe Walter's point is that "all package and module names are lower
>>> case" is a simple rule that will help us avoid this problem, given that
>>> everyone does their best to adhere to the rule. I don't know how much
>>> it matters, since I've never run into the problem myself. But I just
>>> tried it, and it shouldn't be hard to track down the problem based on
>>> the compiler's error messages. Not a big deal either way, it seems.
>> There is another issue. Often a module has basically only one main
>> class in it. If the main class is called Foo, and that's all that's in
>> the module, some version of "Foo" is the logical name for the package
>> too. But then if you use fully qualified names you end up with
>> Package.Foo.Foo when referring to the class in the module, which just
>> look *so* silly that it's easy to forget the second Foo. But
>> package.foo.Foo looks more reasonable, since it's clear the second to
>> last "foo" is not a class name.
>>
>> --bb
>
> Using fully qualified class names are very seldom necessary in D, I find
> using renaming imports are much more useful.
Ok, but then the most obvious name for the renamed import is the last
component of the dot-separated module name:
import Foo = Package.Name.Too.Long.Foo;
...
Foo.Foo
Of course you could rename the module lower-case 'foo', but you could
also just have named it in lowercase from the beginning. Or you could
come up with some other convention.
But anyway, I agree that in Tango the package names are so long that
static import is impractical. But for other libraries that's not the
case, and I think what a lot of people are after here is a convention
that's universally applicable. I use static import all the time in my
code because Phobos' flatter naming works well with that, and my own
code also is usually only 1 or 2 levels deep. But I also use renamed
and selective imports too, depending how much stuff I plan to use from
the module.
[As an aside I really wish I could do renamed and selective importing on
one line, like import mod=some.long.module : Foo, Bar; ]
Saying "don't use static import" isn't a very strong argument for the
Tango naming convention in my opinion.
> I'd like to turn your argument
> the other way round: If you do
>
> import package.Foo;
>
> then it make a lot of sense that you can just use your class Foo.
If that were the only way to do imports in D, then that would make a lot
of sense. But we also have static, renamed, and selective imports and
their use should be encouraged. They help keep the top-level namespace
clean, and help make code more readable by specifying explicitly where
symbols are coming from.
> I
> understand that this may have been uncommon for those coming from C, but I
> know of several C++ libraries (Object oriented) using header files with
> capitalized names, Qt and Coin3D (Open Inventor) comes to mind. Qt wasn't
> always this way, but changed with version 4. OI I think always did this,
> and it is 15+ years old. Indeed, its top level package is "Inventor"!
> FWIW, I think SGI and TrollTech is two of very few companies that have
> created truly good library API's in C++.
The comparison with C++ is not valid because in C++ namespaces and file
names are decoupled. So in C++ something like
#include<Package/SubPackage/ClassName.h> will generally put the
ClassName into the Package::SubPackage namespace. Or sometimes just the
Package namespace. I've never seen anyone create a
Package::SubPackage::ClassName namespace to enclose a class called
ClassName. But in D you don't have a choice. The full path always
becomes part of the namespace.
> I could of course also pull in Java and C# as examples, but those are
> weirdly enough disregarded in this debate.
I don't remember enough about how Java imports worked to comment, and
I've never touched C#.
--bb
More information about the Digitalmars-d
mailing list