当我稍后想要将这种数据结构保存在磁盘上时,我永远不知道如何正确地对情况进行建模。
例如,我目前正在开发一个小型代码生成器。总体想法是,我会在某个地方想要存储类的限定名称及其相关内容,稍后我会想要将 .java 文件保存到磁盘并通过 javac
编译它。 。目前尚不完全清楚我是否想要执行这两项操作,即以 .java 形式保存到磁盘并通过 javac
进行编译。只是一个 Action 。我想有时我可能只想将 .java 文件写入磁盘而不进行编译。
class CompilationUnit {
String qualifiedName;
String contents;
}
现在,我的问题是如何对此进行建模。我应该有一个CompilationUnit
以 IFileSystem
作为参数和IJavaCompiler
,所以每次我“手里”都有一个CompilationUnit
我拥有执行这两个操作所需的一切,或者我应该尝试将编译逻辑保留在类之外,成为 CompilationUnit
只是一个数据对象?
一方面,有一种面向对象的信念,应该将状态和行为保留在同一个对象上,这将有利于将限定名称及其内容与将编译单元写入磁盘并编译它的可能性保持在一起。
尽管如此,我还是对拥有 CompilationUnit
的想法感到不舒服。两者皆取IFileSystem
和IJavaCompiler
依赖关系,尽管我很难解释为什么会这样。
我(理想主义者?)的直觉是数据对象应该易于实例化,从这个角度来看,必须传递 IFileSystem
不得不感到尴尬。和IJavaCompiler
每次我想将限定名称及其内容存储在一起时。这意味着负责生成此数据的人也必须有权访问 IFileSystem
和IJavaCompiler
,这有点奇怪。
我不确定我是否真的回答了自己的问题。
该系统将进行测试,因此正确处理依赖关系问题至关重要。
谢谢!
最佳答案
如果将服务注入(inject)实体或值对象,则很可能会破坏Single Responsibility Principle 。虽然我不知道这个域的详细信息,但 IFileSystem
和 IJavaCompiler
对我来说听起来很像服务 - 它们并不是真正的一部分对象的状态,但它可以使用服务。
关于c# - CompilationUnit 对象是否应该具有保存自身并编译到磁盘的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9307758/