c# - CompilationUnit 对象是否应该具有保存自身并编译到磁盘的方法?

标签 c# java oop dependency-injection

当我稍后想要将这种数据结构保存在磁盘上时,我永远不知道如何正确地对情况进行建模。

例如,我目前正在开发一个小型代码生成器。总体想法是,我会在某个地方想要存储类的限定名称及其相关内容,稍后我会想要将 .java 文件保存到磁盘并通过 javac 编译它。 。目前尚不完全清楚我是否想要执行这两项操作,即以 .java 形式保存到磁盘并通过 javac 进行编译。只是一个 Action 。我想有时我可能只想将 .java 文件写入磁盘而不进行编译。

class CompilationUnit {
    String qualifiedName;
    String contents;
}

现在,我的问题是如何对此进行建模。我应该有一个CompilationUnitIFileSystem 作为参数和IJavaCompiler ,所以每次我“手里”都有一个CompilationUnit我拥有执行这两个操作所需的一切,或者我应该尝试将编译逻辑保留在类之外,成为 CompilationUnit只是一个数据对象?

一方面,有一种面向对象的信念,应该将状态和行为保留在同一个对象上,这将有利于将限定名称及其内容与将编译单元写入磁盘并编译它的可能性保持在一起。

尽管如此,我还是对拥有 CompilationUnit 的想法感到不舒服。两者皆取IFileSystemIJavaCompiler依赖关系,尽管我很难解释为什么会这样。

我(理想主义者?)的直觉是数据对象应该易于实例化,从这个角度来看,必须传递 IFileSystem 不得不感到尴尬。和IJavaCompiler每次我想将限定名称及其内容存储在一起时。这意味着负责生成此数据的人也必须有权访问 IFileSystemIJavaCompiler ,这有点奇怪。

我不确定我是否真的回答了自己的问题。

该系统将进行测试,因此正确处理依赖关系问题至关重要。

谢谢!

最佳答案

如果将服务注入(inject)实体值对象,则很可能会破坏Single Responsibility Principle 。虽然我不知道这个域的详细信息,但 IFileSystemIJavaCompiler 对我来说听起来很像服务 - 它们并不是真正的一部分对象的状态,但它可以使用服务。

关于c# - CompilationUnit 对象是否应该具有保存自身并编译到磁盘的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9307758/

相关文章:

java - 配置 Hazelcast 和 Shiro

model-view-controller - 使用MVC,OO和设计模式进行软件设计入门

java - 进行外部流程调用时的设计优化

c# - 从定义数量的文件中进行并行读取

c# - SELECT 似乎阻止了 UPDATE 语句

c# - 你如何在 Windows 应用程序中显示 HTML?

ruby-on-rails - Rails - 参数数量错误(2 个代表 0..1)错误

c# - 通过一些 html

java - 我需要在java中找到一棵树的节点总数

java - Bean 生命周期 - afterPropertiesSet()