【问题标题】:Python move from imperative to functional in productionPython 在生产环境中从命令式转变为函数式
【发布时间】:2017-03-08 17:53:43
【问题描述】:

我被函数式编程和反应式方法感染了。对于灵感和想法,我使用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。此外,我将通过链接到真正大型项目的源代码获得很大帮助,只要我能得到想法。感谢所有回复的人,他们在将命令式代码移植到函数式代码中获得了真实的体验。是的,我知道它不会移植代码,而是从头开始重写它。同样,我需要具有大量业务逻辑的项目示例,其中涉及数据和数据突变。无论如何,谢谢。

【问题讨论】:

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


    【解决方案1】:

    停止。您在生产中拥有数千行代码。有用。它可能是big ball of mud,但它有效。我是 FP 的忠实粉丝,我自己编写功能性 Python 和功能性很强的 JavaScript 来工作,但这让我觉得这是一种倒退的想法。

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

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

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

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

    不要去阅读/聆听并说“我必须使用 IPC 的消息队列实现六边形端口和适配器模式,否则我们就完蛋了!”。同样,您有工作代码。仔细更改它,最好是在这里和那里稍微修改一下,尊重这意味着什么(尤其是对您的用户而言)。

    如果这一切看起来相当苛刻,那是因为我一直在走这条路,相信我,这很痛苦。如果你不想看到你的新发现的热情在一堆错误报告中消失,那么慢慢地和温和地走。我有点喜欢node.js,但通过做你所说的那种事情,永远玷污了它在我雇主中的声誉,这让我自己开枪了。请注意,只要放慢速度,就可以减轻自己的痛苦。

    【讨论】:

    • 我之前的工作是关于纯函数式 javascript。我有一点经验,我知道你在说什么。在当前的架构中,我们有很多微服务。我设法将某些东西从主动变为被动和功能性。但是我没有足够的带有源代码的实时项目,在那里我可以学习最佳实践。无论如何,谢谢你的链接!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 2023-04-09
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    相关资源
    最近更新 更多