On Thu, 11 Nov 2010 11:07:42 -0500, Per Ångström <d-n...@autark.se> wrote:

On 2010-11-11 15:51, Jacob Carlborg wrote:
First you have to import ITeacher in Student.d (if I'm reading this
right).

No, the code works fine as is, but if I move the import of ITeacher from IStudent.d to Student.d, IStudent.d won't compile:

IStudent.d(4): Error: identifier 'ITeacher' is not defined
IStudent.d(4): Error: ITeacher is used as a type

Second, D has (generally) no problems with circular references.

No, but I have! ;-) To be honest, I would have wanted D to outright outlaw circular references.

First, you can't forward-declare classes in one file that are defined in another file, instead of importing. The reason is because in D, the module is the namespace that the class is declared in.

So for instance, when you define IStudent in IStudent.d, it's full name is IStudent.Istudent

if you did something like:

interface IStudent;

in ITeacher.d, then it's full name would be ITeacher.IStudent, not IStudent.IStudent. So it's not the same.

Second, you are only having fits about forward declarations because you aren't used to it :) That being said, D has had many forward reference bugs (I believe there are still a few active ones), so it doesn't always *just work*. Plus there's the issue of circular imports causing code to fail at runtime due to module construction dependencies.

But in any case, you shouldn't worry about it, just import away, and the compiler can take it.

You only get problems when two modules is a part of a circular reference
and both have module constructors. If you porting C++ code you will not
have this problem since C++ doesn't have module constructors.

Actually, I'm more thinking whether D would be a good language for building really big systems. If the language more or less requires many modules to import each other, that's a big drawback in my opinion, since that makes a mess of the dependency graph. It also makes independent testing of individual modules a lot harder.

um... Java anyone? I think there's been one or two big systems built with Java, but I might be guessing :)

BTW, you generally don't separate your interface and implementation in D
(you can to that if you want to hide your implementation).

I think information hiding is essential for a large-scale design to be comprehensible as a whole. Agreed, the module system in D hides a lot of implementation detail from being included in each compilation unit, but we must also consider not overloading the programmer with needless information.

But then again, maybe I just need to stop thinking in C++.

Yes :)

-Steve

Reply via email to