在C#中,您可以将文件放在与其命名空间相对应的文件夹中,并在解决方案资源管理器中查看它们。
在F#中,似乎我必须将所有内容放在普通的特定排序列表中进行编译。当我达到~300级的规模时,它会让人感到有些困惑和混乱,我开始羡慕C#,并认为它可能是类型推断的代价。
有没有比拆分到多个装配更好的选择?
根据F#编译器来源判断它们已采用的路由但是我有相当大的互连组件系统(Controller - ViewModel - View,> 300类)我想要在一个程序集中因为循环依赖性,即使在级别为接口。
我应该忘记一个文件 - 一个类并创建一些巨大的文件吗?(例如,在F#编译器中,你有几个100kb到300kb范围内的源文件,一些自动生成1Mb左右!)
您对大型F#项目的体验是什么?
答案 0 :(得分:14)
你提到“循环依赖”,要清楚,F#永远不会让你在文件之间传播循环依赖。如果类型Foo
引用类型Bar
而类型Bar
引用类型Foo
,那么Foo
和Bar
必须同时定义文件位于F#中的type ... and ...
组中。
这里的问题是组织和导航问题,主要是关于工具。 VS解决方案资源管理器显示文件列表;通过文件夹,您可以“折叠”文件组,这样可以更轻松地整理您的想法或浏览许多文件的“远距离”。但是,对于导航,还有各种其他工具(转到定义,在当前项目中搜索文本,...),以便您导航到例如特定的类定义。 (希望这些工具在未来的版本中,特别是对于F#以及VS一般都会继续改进。)
无论如何,我坚信“相当大的互连组件系统(Controller - ViewModel - View,> 300类)”是一种代码气味。如果你不能解开这些,以便有一个archetectural分层,使得有些部分不依赖于其他部分(因此可以在F#中的先前文件中“首先”定义),那么你遇到的问题不仅仅是“如何整理你的F#代码“。我的观点可能是最好的表达here。
编辑(2018年):同时,工具已经改进,除了许多其他方面,在过去的几个中添加了定义,查找全部引用,标识符的全局重命名,文件夹支持,文件重组等。年份。对于需要在类之间进行相互引用的解决方案,已引入namespace rec
和module rec
来限制对type ... and ...
的需求。
答案 1 :(得分:5)
您也可以拥有folders in F# projects。这有点麻烦,但它确实有效。
我认为将多个类放入一个文件中是完全可以的,并且在F#中是非常的,如果这些类彼此密切相关。
我还没有参与过大型的F#项目,但我也对其他人的体验感兴趣。