Python在生产中从命令式转变为功能性

时间:2017-03-08 17:53:43

标签: python-3.x functional-programming reactive-programming rx-py

我感染了函数式编程和被动方法。对于灵感和想法,我使用Haskellan awesome Rick Hickey article。在python世界中,我为自己找到了RxPyfuncy个库。现在我有数千行命令式代码,我希望它能够实现功能。如果一切都简化了,我有一个数据库的getter和setter接口以及一个像状态机一样工作的内核。以下是伪代码的外观:

class State(object):
    def __init__(id):
        self.data = database_interface.get_state(id)
        self.status = data['status']

    def process(self):
         if self.status == 'init':
             self.handle_init()
         elif self.status == 'request_data':
             self.handle_request_data()
         elif self.status == 'idle':
             self.handle_idle()
         # etc...


...

def on_new_message(msg):
    id = msg['id']
    state = State(id)
    state.process()

我的状态处理程序中有很多iffor命令式业务逻辑。我真的很尴尬,如何从当前模式转变为反应性和功能性。这里的一切都非常简单,但谁已经有类似的经历会理解我。我需要建议接下来要去哪里,从想法到实践,比功能风格的简单实用程序或简单的REST api更大。此外,无论我在哪里获得想法,我都会得到非常大的项目源代码的链接。感谢所有回复的人,将实际操作代码移植到功能代码中。是的,我知道它不会移植代码,而是从头开始重写代码。同样,我需要具有大量业务逻辑的项目示例,其中包含数据和数据突变的工作。无论如何,谢谢。

1 个答案:

答案 0 :(得分:5)

<强> STOP 即可。您在生产中有数千行代码。有用。它可能是big ball of mud,但它有效。我是FP的忠实粉丝,并且自己编写功能齐全的Python和非常实用的JavaScript工作,但这让我感到反思。

但如果你无法抗拒闪亮新事物的警笛歌曲,那么一次启动一个模块。架构让你无法做到这一点?那是一个方式更大的问题。重构首先解决这个问题。然后一次一个地浏览模块。如果它可以变得纯净,那就让它变得纯净。如果你很难让模块变得纯净,那么重构它们就可以让你拥有一些不纯的模块和一堆纯模块而不是所有的混合模块。请注意,向外纯模块可能会在内部使用副作用,只要它们不会泄漏到模块范围之外,并且调用者无法区分那么正常。现在。

现在您已经完成了这项工作,您可以零碎地更改这些模块的内部实现,而不会影响程序的其余部分。尝试在可能的情况下用通用数据结构替换自定义类,尤其是在模块边界。请注意,这样做会对perf:profile!

产生负面影响

请注意,很多这些技巧都与许多人认为最佳实践相关,以便定义良好的面向对象的架构(程序到接口,不要让实现细节泄漏,KISS等等)。 )。这不是巧合。

这是另一个good talk的灵感。这是Bob叔叔clean architecture的链接。虽然面向UI编程,但它的相关性。

不要去读/听并说“我必须使用IPC的消息队列实现六边形端口和适配器模式,否则我们注定要失败!”。再次,您有工作代码。仔细改变它,理想情况下,在这里和那里,尊重这意味着什么(特别是对你的用户)。

如果所有这些看起来都相当苛刻,那是因为我一直走在这条路上,相信我,这很痛苦。如果你不想看到你的新发现的热情在一堆错误报告中消失,那么就慢慢地,轻柔地走。我有点像node.js,但是通过做你正在谈论的事情,永远地玷污了我在雇主身上的声誉。注意,只需放慢速度就可以省去一些痛苦。