如何组织功能程序[关闭]


41

可能重复:
函数式编程与OOP
如何使用函数式编程编写可管理的代码?

在OOP中,代码的基本组织单位是类。Java,C#和类似语言的一种常用方法是围绕每个类使用一个文件,文件名紧随类名之后来组织代码。

您可以将这些类别中的每一个视为组织的单位,以对单个概念进行分组。

这些类位于名称空间中,该名称空间通常遵循解决方案/项目中文件的目录结构。命名空间是另一个组织层次。

功能语言的大型项目通常是如何组织的?

如何确定如何将功能拆分为不同的文件?

是否在文件旁边使用其他分组单位?

通常在单个文件中如何组织代码?


18
@ S.Lott What's stopping you from...多年以来用完全不同的思维方式进行编程,以至于Haskell代码在思维上没有计算能力。当然,您假设真实的项目总是正确,整洁地组织起来(也许是,但是像我这样的
菜鸟

13
@ S.Lott:我一直都在OOP中编程。出于好奇,我最近开始涉足功能语言。您说:“为什么要在这里问?”。答:从经验丰富的人(或网站上所说的专家)那里获得一些指导和见识,他们可以启发我该主题。这不是这个网站的目的吗?不能对所有程序员或SO问题都回答:“为什么不自己找出答案”?答案是可以的。但是提出这个问题的原因是要从这个领域的专家那里获得更好/更快的结果。
吉尔斯

5
@ S.Lott:如果他只是阅读随机代码,他将如何知道他们所做的组织决策是好是坏?为什么它们是好是坏?
Carson63000


4
@ S.Lott总而言之,让语言或范式专家确定一个组织良好的项目,确定组织中可能存在的任何弱点/缺点,并解释为什么比阅读代码和查看组织更有价值。 ,并假设其结构合理。
Thomas Owens

Answers:


32

我怀疑这取决于语言。关于函数式编程,我主要涉猎Haskell,所以我将解释它在那儿如何工作。

Haskell代码组织为“模块”,这些模块基本上只是功能和数据类型的集合。每个模块是一个文件。模块是Java类和Java包之间的混合体-模块作用的确切范围各不相同。模块还可以控制导出哪些函数和类型构造函数,以及隐藏哪些函数和类型构造函数。这是类似privatepublicJava中。

在我自己的程序中,我喜欢让模块在语义上做件事;这使它们像Java类一样,只是它们可以定义多种数据类型。我在标准库中使用的模块(例如Data.List)更像是软件包-它们提供了一组相似的实用程序功能。这也与静态Java类非常相似java.util.Arrays

这些模块也类似于Java包,因为它们可以嵌套以保持清晰(我认为这对代码本身没有任何影响)。通常,对于一个项目,我给它起一个名字(例如Project),并将我所有的模块都包含在其中(例如Project.ParseProject.Run)。如果我编写的代码更像一个库而不是一个应用程序,那么我将根据它的工作来组织它,例如Data.Listor Control.Monad。与其他语言的主要区别在于,Haskell鼓励限制IO并将其全部放在一个位置。大量模块根本没有IO,对于任何给定项目,我都希望有尽可能多的纯模块。

例如,我正在使用一种称为TPL的简单编程语言(没有充分的理由)。为此,我创建了两个简单的模块:TPL.Parse定义了语言的内部表示形式以及如何解析它,并且TPL.Run运行了解释器并处理变量和IO。为了实际编译和运行代码,通常会有一个Main模块,该模块最终成为程序的入口点。

在文件中组织功能有很大的自由度;这就是我喜欢做的。在其他地方使用数据类型之前,我先将它们定义为顶部。在定义了数据类型之后,我便实现了使它们成为其适当类型类的一部分所需的一切-有点像实现接口。然后,我将根据需要遵循逻辑和各种辅助函数。最后,我希望所有的IO功能都以开头main。这样可以清楚地说明正在执行任何IO以及程序从何处开始。

因此,总而言之:函数包含在模块中,每个模块都由一个文件组成。几个模块可以组成一个程序或库。前者通常包括作为Main其入口点的模块。在一个文件中,有不同的组织选项,但我更喜欢将数据类型分组在顶部附近,IO在底部附近以及逻辑在中间。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.