Module 在D项目中组织模块
我来自Java背景,包装问题如下: 我可以在同一个包下有许多文件,比如Module 在D项目中组织模块,module,coding-style,naming-conventions,d,Module,Coding Style,Naming Conventions,D,我来自Java背景,包装问题如下: 我可以在同一个包下有许多文件,比如com.parobay.io。然后,我可以将其作为库分发,用户将像这样使用它: import com.parobay.io.Input; import com.parobay.io.Output; 或 因此,我可以有一个“模块”(com.parobay.io)和在多个文件中定义的类 那么如何在D中实现同样的效果呢?我是否必须创建一个目录com\parobay\io,然后放置两个名为Input.D和Output.D的文件,或者
com.parobay.io
。然后,我可以将其作为库分发,用户将像这样使用它:
import com.parobay.io.Input;
import com.parobay.io.Output;
或
因此,我可以有一个“模块”(com.parobay.io
)和在多个文件中定义的类
那么如何在D中实现同样的效果呢?我是否必须创建一个目录com\parobay\io
,然后放置两个名为Input.D
和Output.D
的文件,或者有更聪明的方法吗
在Java中,规则非常严格,因此很难出错。在D中,有很多可能性。那么是否有任何约定,比如每个文件一个类,或者文件名等于类名?您可以选择与Java基本相同的方式,但请记住以下几点:
- 导入
在D中不起作用,但您可以在手动列出foo.*
等的目录中创建一个名为public import foo.Input;public import foo.Output;
的文件,以便导入整个包package.D
- 始终在导入的任何文件的顶部放置
或任何行。不要期望它仅根据目录结构和文件名工作。目录结构实际上并不是严格必需的,只是一种很容易找到文件的惯例。顶部的模块com.parobay.io.Input;
行带有名称是编译器检查的权威性内容模块
- D模块通常都有小写名称,但如果您愿意,可以使用大写名称。我认为使用像类名这样的小写名称很好,因此您可以调用模块
和类io.input
。这种约定的原因是有时在从系统到系统传输时,文件名大小写会丢失但开发人员非常清楚这种情况,所以在实践中,两种方法都应该有效input
- 每个文件一个类可以很好地工作,或者您可以将两个紧密耦合的类放在同一个文件中(如果它们在同一个文件中,则可以访问彼此的私有成员)
有关更多信息,请参见本页:尤其是搜索标题“Package Module”D社区有三个广为接受的备选方案
all.d
的模块,其中包括包中的所有模块。(字面意思是“*”-->“all”)。然后只需执行import com.paroboy.io.all;
\
来实现这一点。因此,他们为此编写了一个名为\.D
的模块。与#1类似,您需要导入com.paroboy.io。
package.D
模块,可用于导入包。有关此模块的详细信息,请参阅以下DIP:。如果我记得很清楚,DMD从v2.064开始就支持它。(文档:)导入
仅适用于模块!??"
虽然没有什么能阻止你在每个类中使用单独的模块,但我不推荐它。D是真正的模块化语言,所以要充分利用它。把你所有的类型都集中在一个D模块中。这是我的建议,这就是“D方式”
注意:
Java“模块”之间存在(很大)语义差异“还有一个D模块,你可能已经注意到了。我主要是一名Java程序员,因此我知道这对正在使用同一个包中的D.Java类的Java程序员来说可能是多么令人困惑。Java类经常利用包级访问。但是,同一模块内的类在C++中的行为类似于“朋友”。
说到这里,它们本来应该与Java8(真正的模块!)一起提供,但是它们是POSPON的,有望包含在Java9中
更新:在与一些会员聊天后,我们得出结论,现在使用
包
属性确实是安全的。它的行为如规范所述。不要将两个单独的文件用于输入
和输出
类。相反,将这两个类放在一个文件中,parobay/io.d
(对应于模块parobay.io
)
每个文件只允许一个类,这绝对不是惯例。D模块用于将相关功能的代码分组在一起。当有人导入parobay.io时他们希望得到所有的类、实用程序函数和其他相关的东西。它类似于Java的import com.parobay.io.*代码>
如果有人真的想导入模块的特定部分,他们可以使用选择性导入:
关于这一点,还有几点需要注意
- 包和模块名称通常都是小写的
- 如果文件的路径与其完整的模块名完全匹配,那么每个人的生活都会更轻松。例如,模块
foo.bar.baz
应位于文件foo/bar/baz.d
中
- 根据我的经验,D模块很少以域名命名。如果您真的想,您可以在模块名称前面加上
com
或org
或net
,但这与Java中的情况不同
在显式模块声明和类成员可见性方面有一些优点。它也非常值得一读。“还没有确定D的包保护属性的作用…”你为什么这么说?据我所知,它的定义非常明确。“包扩展了private,以便可以访问包成员
import com.parobay.io.*; // to import everything
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.