从编程生涯的第一天开始,我开始使用面向对象的编程.但是,我有兴趣学习其他范例(我在这里说了很多次这是一件好事,但我没有时间去做).我想我不仅准备好了,而且还有时间,所以我将开始用F#进行函数式编程.
但是,我不确定如何构建更少的设计应用程序.我已经习惯了OO编程中的每类文件和类名词/函数动词.您如何设计和构建功能性应用程序?
我已经尝试将我的clojure图表嵌入到UML中可用的内容中,使用类块作为文件级命名空间和依赖关系链接来显示关系,但它很尴尬并且往往会阻碍功能模式.我也尝试过开发ad-hoc解决方案,但是我发现一个解决方案和Java一样好用Java(简单有向图似乎工作模糊,但结果不详细足够).此外,我在网上找不到任何关于此的内容.
为了清楚起见,我并没有尝试像代码生成那样做任何事情; 我只是为了自己的利益而谈论纸笔图.我假设我不是第一个考虑使用lisp语言的人.
提出了哪些解决方案?有没有常用的标准?您有什么推荐的吗?你用什么工具?
我发现UML对于记录OO系统的各个方面非常有用,特别是整体架构和序列图的类图,以说明特定的例程.我想为我的clojure应用程序做同样的事情.我目前对模型驱动开发不感兴趣,只是简单地介绍应用程序的工作方式.
UML是一种常见/合理的函数式编程建模方法吗?FP的UML有更好的替代方案吗?
作为函数式语言的新手(几周前我开始接触Erlang - 第一个可以让我开始使用的函数式语言).
我开始写一些小的算法(如left_rotate_list,bubble_sort, merge_sort等).我发现自己常常迷失在诸如"我应该使用帮助列表进行中间结果存储吗?"等决策中.并且"我应该创建一个辅助函数来执行此操作吗?"
过了一会儿,我发现函数式编程(如果我说的话没有意义的话,请跟我一点)鼓励"自上而下"的设计:即,当我做merge_sort时,你首先记下所有的合并排序步骤,并将它们命名为单独的辅助函数; 然后逐个实现这些辅助函数(如果需要进一步划分这些辅助函数,请以相同的方法执行).
这似乎与OO设计略有矛盾,您可以从底层开始构建基本数据结构,然后将数据结构和算法组合成您想要的.
感谢您的评论.是的,我想得到关于如何"用函数式语言思考"的建议(就像"用Java思考","用C++思考").
我在很多家庭项目中逐渐转向F#,但我对于如何将完整的应用程序连接在一起更加困难,尤其是跨领域的问题.
在C#中,如果我想记录内容,我会使用依赖注入将ILogger传递到每个类中,然后可以从代码中轻松地调用它.我可以在我的测试中验证给定特定情况的日志是通过传入模拟并验证它来编写的.
public class MyClass
{
readonly ILogger _logger;
public MyClass(ILogger logger)
{
_logger = logger;
}
public int Divide(int x, int y)
{
if(y == 0)
{
_logger.Warn("y was 0");
return 0;
}
return x / y;
}
}
Run Code Online (Sandbox Code Playgroud)
在F#我使用的模块更多,所以上面会变成
module Stuff
let divde x y =
match y with
| 0 -> 0
| _ -> x / y
Run Code Online (Sandbox Code Playgroud)
现在,如果我有一个名为Logging的模块,我可以打开它并在y为0的情况下使用日志函数,但是如何将其注入单元测试?
我可以让每个函数都使用一个日志函数(字符串 - >单位),然后使用部分应用程序连接它们,但这似乎是一项非常多的工作,就像创建一个新的函数来包装日志调用中的实际调用一样.是否有特定的模式或一点F#我缺少可以做到的?(我已经看过kprintf函数,但我仍然不知道你如何为各种测试场景指定函数,同时使用完整应用程序的具体实现)
同样,您如何存根获取数据的存储库?你需要实例化一些类并在其上设置CRUD函数,还是有一种方法可以注入你打开的模块(除了#define)