Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Module 在D项目中组织模块_Module_Coding Style_Naming Conventions_D - Fatal编程技术网

Module 在D项目中组织模块

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的文件,或者

我来自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
的文件,或者有更聪明的方法吗


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

您可以选择与Java基本相同的方式,但请记住以下几点:

  • 导入
    foo.*
    在D中不起作用,但您可以在手动列出
    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开发人员使用
    \
    来实现这一点。因此,他们为此编写了一个名为
    \.D
    的模块。与#1类似,您需要
    导入com.paroboy.io。

  • D编程语言中新增的相对较新的模块是
    package.D
    模块,可用于导入包。有关此模块的详细信息,请参阅以下DIP:。如果我记得很清楚,DMD从v2.064开始就支持它。(文档:)

  • 我自己使用#1方法,因为这是显而易见的。而#2和#3可能会让阅读D源文件的人感到困惑,尤其是第三个。有人可能会问一个有效的问题:“我到底在导入什么,包?”??但是,
    导入
    仅适用于模块!??"

    虽然没有什么能阻止你在每个类中使用单独的模块,但我不推荐它。D是真正的模块化语言,所以要充分利用它。把你所有的类型都集中在一个D模块中。这是我的建议,这就是“D方式”

    注意: Java“模块”之间存在(很大)语义差异“还有一个D模块,你可能已经注意到了。我主要是一名Java程序员,因此我知道这对正在使用同一个包中的D.Java类的Java程序员来说可能是多么令人困惑。Java类经常利用包级访问。但是,同一模块内的类在C++中的行为类似于“朋友”。 说到这里,它们本来应该与Java8(真正的模块!)一起提供,但是它们是POSPON的,有望包含在Java9中


    更新:在与一些会员聊天后,我们得出结论,现在使用
    属性确实是安全的。它的行为如规范所述。

    不要将两个单独的文件用于
    输入
    输出
    类。相反,将这两个类放在一个文件中,
    parobay/io.d
    (对应于模块
    parobay.io

    每个文件只允许一个类,这绝对不是惯例。D模块用于将相关功能的代码分组在一起。当有人导入parobay.io时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.