组织D项目中的模块

时间:2014-05-28 11:25:33

标签: module coding-style naming-conventions d

我来自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.dOutput.d的文件,还是有更聪明的方法?

在Java中,规则非常严格,因此很难弄错。在D中有很多可能性。那么有没有任何约定,比如每个文件一个类,或者文件名等于类的名称?

3 个答案:

答案 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)

不要为InputOutput类使用两个单独的文件。相反,将两个类放在一个文件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
  • 根据我的经验,D模块以域名命名的情况很少见。如果您确实愿意,可以使用comorgnet为模块名称添加前缀,但不会像Java中那样预期模块名称。

Adam D. Ruppe's answer对显式模块声明和类成员可见性有一些很好的观点。同样值得阅读module上的stylethe official D website页面。

答案 2 :(得分:2)

D社区有三种被广泛接受的替代方案。

  1. 编写一个名为all.d的模块,其中包含软件包中的所有模块。 (字面意思'*' - >'全部')。之后,您只需执行import com.paroboy.io.all;

  2. 我发现D开发人员越来越多地使用_。因此,他们为此目的编写了一个名为_.d的模块。与#1类似,您执行import com.paroboy.io._;

  3. D编程语言的相对新增功能是package.d模块,可用于导入包。有关此内容的更多信息,请参阅以下DIP:http://wiki.dlang.org/DIP37。如果我记得很清楚,DMD从v2.064开始支持它。 (文件:http://dlang.org/module#PackageModule

  4. 我自己使用#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确实安全属性。它表现得像规范所说的那样。