我来自Java背景,包装问题如下:
我可以在同一个包下有很多文件,比如com.parobay.io
。然后我可以将其作为库分发,用户将使用它:
import com.parobay.io.Input;
import com.parobay.io.Output;
或
import com.parobay.io.*; // to import everything
所以我可以在一个"模块(com.parobay.io
)和多个文件中定义的类。
那么如何在D中实现同样的目标呢?我是否必须创建一个目录com\parobay\io
并在那里放置两个名为Input.d
和Output.d
的文件,还是有更聪明的方法?
在Java中,规则非常严格,因此很难弄错。在D中有很多可能性。那么有没有任何约定,比如每个文件一个类,或者文件名等于类的名称?
答案 0 :(得分:7)
您可以选择与Java基本相同,但请记住以下项目:
导入foo.*
在D中不起作用,但您可以在目录中创建一个名为package.d
的文件,该文件会手动列出public import foo.Input; public import foo.Output;
等,这样您就可以导入整个包。
始终在导入的任何文件的顶部放置module com.parobay.io.Input;
或任意行。不要期望它只是根据目录结构和文件名工作。目录结构实际上并不是必需的,只是容易找到文件的惯例。顶部带有名称的module
行是编译器检查的权威内容。
D模块通常具有全部小写名称,但如果您愿意,可以使用大写名称。我认为使用类名等小写名称会很好,因此您可以调用模块io.input
和类Input
。这种约定的原因有时在从系统转移到系统时文件名丢失。但开发人员非常了解情况,因此在实践中,无论哪种方式都应该有效。
每个文件一个类可以正常工作,或者您可以将两个紧密耦合的类放在同一个文件中(如果它们位于同一个文件中,它们可以访问彼此的私有成员)。
有关详细信息,请参阅此页:http://dlang.org/module特别是搜索标题"包模块"
答案 1 :(得分:3)
不要为Input
和Output
类使用两个单独的文件。相反,将两个类放在一个文件parobay/io.d
中(对应于模块parobay.io
)。
绝对不约定将每个文件仅限于一个类。 D模块用于将相关功能的代码分组在一起。当有人import parobay.io;
时,他们希望获得所有的parobay.io
- 类,实用函数以及其他任何相关的函数。它与Java的import com.parobay.io.*;
类似。
如果有人真的想要导入模块的特定部分,他们可以使用选择性导入:
import parobay.io: Input; // Just the Input class of the parobay.io module.
import parobay.io: Output; // Just the Output class.
import parobay.io: Input, Output; // Just the Input and Output classes.
还有一些值得注意的事项。
foo.bar.baz
应位于文件foo/bar/baz.d
。com
或org
或net
为模块名称添加前缀,但不会像Java中那样预期模块名称。Adam D. Ruppe's answer对显式模块声明和类成员可见性有一些很好的观点。同样值得阅读module上的style和the official D website页面。
答案 2 :(得分:2)
D社区有三种被广泛接受的替代方案。
编写一个名为all.d
的模块,其中包含软件包中的所有模块。 (字面意思'*' - >'全部')。之后,您只需执行import com.paroboy.io.all;
我发现D开发人员越来越多地使用_
。因此,他们为此目的编写了一个名为_.d
的模块。与#1类似,您执行import com.paroboy.io._;
D编程语言的相对新增功能是package.d
模块,可用于导入包。有关此内容的更多信息,请参阅以下DIP:http://wiki.dlang.org/DIP37。如果我记得很清楚,DMD从v2.064开始支持它。 (文件:http://dlang.org/module#PackageModule)
我自己使用#1方法,因为很明显发生了什么。虽然#2和#3可能会让阅读D源文件的人感到困惑,尤其是第三个。有人可能会问一个有效的问题:“我导入的是什么,包裹?但是import
仅适用于模块!??”
虽然没有什么可以阻止你在每个班级有单独的模块,但我不推荐它。 D是真正的模块化语言,所以要充分利用它。在单个D模块中将所有类型分组。这是我的建议,那就是“D路”。
注意:强> 您可能已经注意到,Java“模块”和D模块之间存在(大)语义差异。我主要是一个Java程序员,所以我知道这对于正在玩D的Java程序员来说是多么令人困惑。在同一个程序包中的Java类经常利用包级访问。但是,同一模块中的类在C ++中的行为类似于“朋友”。
谈到Java modules,它们应该带有Java 8(真正的模块!),但是它们被推迟了,并且有望被包含在Java 9中。
更新:我们FreeNode (IRC)与D-Programming-Language的某些成员聊天后得出结论,现在使用package
确实安全属性。它表现得像规范所说的那样。