业务线应用:F#会让我的生活更轻松吗?

时间:2010-02-23 16:26:53

标签: c# .net asp.net silverlight f#

我主要开发业务应用程序。没有科学运作。没有复杂的计算。只需将用户界面绑定到数据库。我使用线程的唯一原因是在后台做一些工作并仍然保持UI响应。

这可能不是最好的方法,但这就是我遵循的方法

1.首先创建一个正在运行的应用程序(没有线程)并将其提供给最终用户以便进行反馈。
2.一旦所有需求都被锁定,我尝试在有意义的地方使用线程来提高性能。

步骤1&的代码2绝对不同,线程代码在实际代码中占主导地位。

1.对于业务线申请,F#会让我的生活更轻松吗? 2.是否有任何特定的UI技术最适合F#?我主要研究ASP.NET& Silverlight的。 WPF现在&然后,
3.有哪些业务应用/演示与F#的好例子?

我不是在询问是否有可能在F#中开发业务线应用程序。我在问,与C#相比,F#是否会让我的生活更容易开发业务线应用程序?我主要担心的是线程和问题。 UI同步。

5 个答案:

答案 0 :(得分:33)

我和你在同一条船上,做了很多很多业务类型的应用程序,没有像游戏或编译器或搜索引擎那样“有趣”。

你的里程 会有所不同,但至少根据我自己的经验,许多开发团队都不愿意直接进入F#,因为团队中没有其他人知道或者甚至没有听说过。不管怎样,你必须解决这些问题,比如“它与C#有什么不同?”如果你可以说服你的老板让你用它写一些演示应用程序,那就去吧!

所以说到这一点,我发现C#在业务规则方面不是很擅长,但是它处理像冠军一样的GUI; F#的不变性使GUI开发变得尴尬,但业务规则和工作流程感觉很自然。因此,这两种语言各有所长,并互相恭维。

在我自己的LOB应用程序中,F#在几个方面围绕C#运行:<​​/ p>

  • F#的异步工作流和邮箱处理器数量级比本机线程甚至任务并行库更易于使用。由于使用邮箱处理器进行线程间通信,我甚至不记得上次我必须锁定或thread.join()任何事情进行同步化。

  • 使用工会FTW定义业务规则引擎和DSL!我曾经工作的每个非平凡的LOB应用程序都有自己的半生不熟的规则语言和解释器,它几乎总是基于递归地切换枚举来钻取规则并找到匹配。我现在的项目现在包含1300多个公共类,大约900个是表示规则的简单容器类。我认为将规则表示为F#union会大大减少代码膨胀并使其成为更好的引擎。

  • 不可变代码只是更好 - 如果你得到一个状态无效的新对象,你不必搜索很远的东西来找到有问题的代码行,你需要的一切知道是在调用堆栈上。如果您有一个状态无效的可变对象,有时您需要花费大量时间来跟踪它。您可以在C#中编写不可变代码,但实际上很难不依赖于可变性,尤其是当您在循环中修改对象时。

  • 讨厌空。我不能给出一个确切的估计,但感觉就像我们在生产中获得的一半错误是空引用异常 - 一个对象未​​正确初始化,直到您在代码深度为30个堆栈帧时才知道它。我认为F#会帮助我们第一次编写更多无错误的代码。

C#通常在以下情况下运作良好:

  • 您正在编写GUI代码或使用固有的可变系统。

  • 向许多不同的客户端公开DLL或Web服务。

  • 你的老板不会让你使用你想要的工具;)

因此,如果你能克服“我们为什么要使用新的语言障碍”,我认为F#确实会让你的生活更轻松。

答案 1 :(得分:10)

这是一个非常难以回答的问题 - 我认为F#会让你的生活中的某些方面变得更容易,而且有些困难。

从好的方面来说,处理线程应该相对轻松--F#异步工作流程是一个巨大的好处。此外,F#Interactive可以非常轻松地快速迭代和探索代码。对我来说,这是一个比C#更大的优势,因为我可以在不经过完整构建的情况下测试较小的代码更改。

另一方面,F#的工具不适用于C#,这意味着您将无法访问GUI构建器,重构工具等。很难说生产力有多大这会让你在不了解更多关于你的场景的情况下。一种解决方法是创建一个具有精简C#前端的多语言解决方案,但同样复杂性可能不值得获益。

答案 2 :(得分:7)

@Juliet和@kvb有很好的答案,我只想重申F#对于简化线程有多大帮助。在我的博文“An RSS Dashboard in F#, part six (putting it all together with a WPF GUI)”中,我说

  

...注意在这里使用'async'非常好 - 我   使用Async.StartImmediate,意思是   所有代码都在UI线程上运行   (Click处理程序启动的地方),但是   我仍然可以做非阻塞睡眠   不会堵塞用户界面。这是一   F#async刚打开门的方式   关闭其他一切。

     

...

     

我们的“以前”信息(“3分钟   以前“)如果我们将很快变得陈旧   不刷新它,所以我们开始循环   每分钟重绘一次。一旦   再一次,F#async踢我的屁股,尽我所能   把它写成好像是一个   在UI上运行的同步循环   线程,但非阻塞睡眠   呼叫确保用户界面保持在线状态。   真棒。 ...

但该博客文章是使用F#手动编码整个UI的示例。这意味着将您使用C#或VB获得的所有优秀GUI工具交易掉。我认为混合方法几乎可以带来两者的所有好处(在解决方案中有两个项目的成本,而你之前只有一个),但我(还)没有直接的经验。在这里分享。

(C#GUI应用程序中是否存在规范“问题示例”,您需要在长时间操作中添加线程以提高性能或保持应用程序的实时性?如果是,我应该检查它出。)

答案 3 :(得分:2)

您可能希望看到的内容:

The First Substantial Line of Business Application in F#

F#中的一个大型LOB应用程序。

答案 4 :(得分:0)

为了解决这个问题,我发表了一些关于使用F#,

的想法

http://fadsworld.wordpress.com/2011/04/13/f-in-the-enterprise-i/ http://fadsworld.wordpress.com/2011/04/17/fin-the-enterprise-ii-2/

我还打算做一个视频教程来完成这个系列,并展示F#如何在UX编程中做出贡献。

我只是在这里谈论F#。

-Fahad