当前位置:  开发笔记 > 编程语言 > 正文

为什么域驱动设计似乎只受C#和Java等静态语言的欢迎?

如何解决《为什么域驱动设计似乎只受C#和Java等静态语言的欢迎?》经验,为你挑选了3个好方法。

域驱动设计已成为我的首选架构.我已经能够在ASP.net框架中找到大量的书籍和教程来应用DDD原理.它似乎主要来自Java开发人员现在所做的一段时间.

对于我的个人项目,我开始更倾向于Python,即使我发现很难放弃静态类型.我希望能够找到使用动态语言应用DDD的大量帮助.关于Python和DDD似乎没有什么.这是为什么?显然DDD可以很好地应用于Python.人们不会在Python中承担大量项目吗?或者在动态类型中使用DDD简单地应用DDD因此减少了所需的学习量?

也许我的问题是由于我缺乏Python经验.您可能对我提出的任何建议将不胜感激.



1> George Mauer..:

我认为它在其他地方肯定很受欢迎,特别是功能语言.但是,与大蓝皮书相关的某些模式在动态语言中并不适用,而像Rails这样的框架往往会导致人们远离有限上下文的思想

然而,DDD无处不在的语言的真正推动力在动态语言中肯定很普遍.Rubyist在构建领域特定语言时特别喜欢 - 想想黄瓜特征最终看起来如何,就像DDD一样!

请记住,DDD根本不是一个新想法,它只是以一种从C#和Java家伙那里得到好评的方式重新打包.在不同的旗帜下,这些想法也在其他地方.



2> valignatev..:

这个问题困扰了我很长时间,因此我决定收集有关此主题的所有有价值的数据。最后,我得到了这个github repo。

也有一些代码示例:

1)在Django上

2)在烧瓶上

3)在Ruby上

还有更多。但是绝对不够。



3> fabricioriss..:

我认为用动态语言编写好的DDD项目是完全可能的,但是比静态项目难维护。为什么?

工装

对于静态类型的语言,工具通常更强大。这就是为什么有人使用TypeScript而不是plain的JS原因,因为它可以帮助您通过简化重构来扩展代码。维护DDD代码时,重构总是存在的,因为业务有时会发生变化,并且您对模型的知识每天都在发展,有了这种知识,您的代码也必须发展。我的大部分经验都与C#有关,并且我已经用它建立了许多DDD项目。现在,我正在用Ruby编写的DDD项目中工作,而我最想念的事情之一就是缺少强大的IDE。在Ruby或Python中,人们习惯于使用文本编辑器,而不是IDE。我很难看到人们正在编写某些IDE或文本编辑器应该为我编写的东西(即)。很难看到人们在Vim中搜索文件的完整路径只是为了打开它并窥视方法或类的详细信息-例如,在VS Code或Visual Studio中,只需单击一下就F12足以转到定义类或方法,没有文件歧义。而且我什至没有谈论调试经验,看到人们binding.pry在他们的代码中编写(对于非红宝石开发人员来说,这有点像js中的“ debugger”关键字)让我在终端中进行调试,而不仅仅是设置它,这让我很伤心线上的断点。列表比这个要大,但是我认为足以说明“工具”。

OOP表现力

在诸如Python和Ruby之类的动态语言中,您没有接口和抽象类之类的所有OOP功能。有时在使代码表达和清晰方面带来一些困难。

单元测试

您需要编写更多的单元测试来替换编译器可以为您完成的工作。

动态打字

如果要进行某种类型检查,则需要使用鸭子类型。编译器没有帮助。

动态类型语言的好处

避免典型地狱

在OOP动态语言还是静态语言之间进行选择时,总会有权衡取舍。在诸如C#和Java之类的静态类型语言中,一个常见的问题是,有时类型系统会使代码表现得非常缺乏表达力和冗长。一些开发人员倾向于陷入泛型类型的地狱。但并非所有静态类型的语言都存在此问题(F#是其中一种-由于强类型推断)。

测试中

在某些情况下,例如当您不想创建仅用于注入类并使其可测试的接口时,不使用静态类型也有帮助。在这些情况下,接口不利于可读性,实际上会损害可读性,因为您需要创建一个哑巴文件(接口),该哑巴文件不代表测试代码的欲望。在Ruby中,您可以通过多种方式来执行此操作而无需创建接口,其中一个示例是:

class DispatchOrderService
  def initialize(overrides = {})
    @repository = overrides.fetch(:repository) do
      ::Infra::OrderRepository.new
    end

    @mail_service = overrides.fetch(:mail_service) do
      ::Infra::MailService.new
    end
  end

  def dispatch(order)
    order.dispatched
    repository.save(order)
    mail_service.notify_order_dispatched(order)
  end
end

是的,通过这种方法,我们打破了简洁的体系结构,因为该类知道具体的“ infra”实现。但它是可以与依赖注入来解决(Ruby的这些框架总是打破干净架构太或太丑陋有人想用它,在我们的项目中,我们通过实例的依赖关系做了我们自己的DI容器的一个问题手动上项目启动)。

结论

综上所述,我认为即使在静态语言中比较困难的情况下,也可以在Ruby中编写良好的“企业” DDD应用程序。我当前的项目就是一个例子(6万行代码并且仍可维护)。

@GeorgeMaueris提到的观点也很重要。您可能会在框架中实施DDD时遇到问题,这些问题使您无法组织代码。因此,在这里我们选择使用Hanami而不是Rails,但即使Hanami也是我们想要的“意见”。我真的不建议任何人寻找“框架”来构建DDD。设计/体系结构随应用程序的不同而变化,并且也在不断发展。当您选择“ DDD”框架时,有时您会面临与之抗争的情况(执行变通办法或修补程序)。

因此,也许您可​​以问我为什么我们完全选择红宝石。在这里使用Ruby的要点是,几乎100%的团队都是由Ruby开发人员组成的,我们不想重复这些困难:学习DDD +一种新的编程语言。更具战略意义而非纯粹的技术决定。没有它,公司(一家初创公司)可能不会走得那么远。

编辑2018:

对于基于DDD方面的项目,我们放弃了Ruby和Python。现在我们正在使用Kotlin,感到非常满意。主要的好处在这里列出:

IntelliJ的最佳IDE支持。这使我们的重构速度大大提高,在编译时产生了错误,并且减少了为编译器可以为我们做的事情编写测试的工作。

良好且流行的依赖注入,ORM,函数式编程框架

语言本身的另一个好处(空安全性,数据类等)

编辑2019:

我们写了一系列关于从Ruby到Kotlin的文章。你可以在这里看到它。

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有