如何在Visual Studio中组织大型项目(>300个类)的F#源代码?

21
在C#中,您可以将文件放在与其名称空间对应的文件夹中,并在解决方案资源管理器中查看它们。
在F#中,似乎我必须将所有内容放在明确排序的列表中进行编译。当我达到~300个类的规模时,它变得有些混乱和杂乱无章,我开始羡慕C#并认为这可能是类型推断的代价。
是否有比分割成几个程序集更好的选择?
根据F#编译器源代码,这是他们采取的路线,但我有一个非常庞大的互连组件系统(Controller-ViewModel-View,> 300个类),我希望它们在一个程序集中,因为即使在接口层面上也存在循环依赖。
我应该忘记一个文件 - 一个类,并创建一些巨大的文件吗?(例如,在F#编译器中,您有几个源文件的范围在100kb到300kb之间,以及一些自动生成的文件约1Mb!)
您在处理大型F#项目方面有什么经验?

6
F# 正在努力拯救你,让它来吧! :-) - Daniel
2个回答

14
你提到了“循环依赖”,需要明确的是,F#永远不会让你在文件间产生循环依赖。如果类型Foo引用了类型Bar,而类型Bar又引用了类型Foo,那么FooBar必须在同一个文件中以相同的type ... and ...组定义。
这里的问题是组织和导航,主要与工具有关。VS解决方案资源管理器显示文件列表;文件夹使您可以“折叠”文件组,这可以更轻松地组织思路或浏览许多文件的“大范围距离”。但是,对于导航,还有各种其他工具(转到定义、在当前项目中搜索文本等),可以让您导航到特定类定义。(希望这些工具在未来的版本中会继续改进,特别是针对F#以及VS的整体改进。)
无论如何,我坚信,“一个相当大的互相连接的组件系统(控制器-视图模型-视图,>300个类)”是一种代码异味。如果您无法将它们解开,使得有部分不依赖于其他部分(因此可以在F#中的先前文件中定义),那么您的问题不仅仅是“如何组织您的F#代码”。我的个人看法可能最好在这里表达。

编辑(2018年):与此同时,工具得到了改进,增加了许多功能,如转到定义、查找所有引用、全局标识符重命名、文件夹支持、文件重组等。对于需要类之间相互引用的解决方案,引入了namespace recmodule rec来限制对type ... and ...的需求。


1
链接中的帖子很棒!是的,原始系统远非分层,这让我在将其移植到F#时感到困难。 - Alfa07
4
这种线性依赖排序是我不再将C#用于非平凡项目的主要原因之一(对于平凡项目,我出于其他原因也不使用它)。F#有效地防止了我在C#中经常犯的这个(非常昂贵的)错误。虽然需要额外的工作,但花费的时间是值得的,随着软件的增长,它是无价的。 - Daniel
@Daniel 这听起来很有趣,但我不是很明白。你能否详细解释一下“依赖的线性排序”是什么意思? - MEMark
一个源文件只能依赖于在项目/编译顺序中出现在它之前的其他文件。 - Daniel

5
你也可以在F#项目中拥有文件夹。虽然有点麻烦,但是它可行。
如果这些类之间密切相关,我认为将多个类放入一个文件中在F#中是完全可以的和惯用的。
我还没有处理过真正大型的F#项目,但我也对其他人的经验感兴趣。

2
@MEMMark:谢谢。通过链接到archive.org解决了它。 - wmeyer
1
同时,文件夹功能已经内置支持(我相信是从VS2017 15.3版本开始)。 - Abel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接