gpt4 book ai didi

python-3.x - Python 在生产环境中从命令式转向函数式

转载 作者:行者123 更新时间:2023-12-01 08:19:55 25 4
gpt4 key购买 nike

我被函数式编程和响应式(Reactive)方法所感染。为了获得灵感和想法,我使用 Haskellan awesome Rick Hickey article 。在我自己发现的Python世界里RxPyfuncy图书馆。现在我有数千行命令式代码,我想让它们发挥作用。如果一切都简化了,我就有了一个数据库的 getter 和 setter 接口(interface)以及一个像状态机一样工作的内核。这是它在伪代码上的样子:

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 命令式业务逻辑。我真的很尴尬如何从当前模型转向响应式(Reactive)和功能性模型。这里的一切都很简单,但是有过类似经历的人会理解我。我需要关于下一步的建议,从想法到实践,比简单的实用程序或函数式风格的琐碎 REST API 更大。另外,我可以通过链接到真正大型项目的源代码来获得很大的帮助,无论我在哪里可以获得想法。感谢每一位做出回应的人,让他们获得了将命令式代码移植到函数式代码的真实体验。是的,我明白它不会移植代码,而是从头开始重写。同样,我需要具有大量业务逻辑的项目示例,其中涉及数据和数据突变。不管怎样,谢谢你。

最佳答案

停止。您在生产中有数千行代码。有用。它可能是 big ball of mud ,但它有效。我是 FP 的忠实粉丝,我自己也为工作编写了函数式 Python 和函数式 JavaScript,但我觉得这是一种倒退思维。

但是,如果您无法抗拒 Shiny 新事物的魅力,请一次启动一个模块。架构让你无法做到这一点?这是一个更大的问题。首先重构以修复该问题。然后一次浏览一个模块。若能清净,则清净。如果您很难使模块变得纯净,请重构它们,以便拥有一些不纯净的模块和一堆纯净的模块,而不是所有混合模块。请注意,表面上纯模块可能会在内部使用副作用,只要它们不泄漏到模块范围之外,并且调用者无法分辨出差异这很好。现在。

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

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

这是另一个 good talk寻求灵感。这是clean architecture的链接鲍勃叔叔的。尽管面向 UI 编程,但它是相关的。

不要去读/听并说“我必须使用 IPC 消息队列来实现六边形端口和适配器模式,否则我们就完蛋了!”。再说一次,你有工作代码。仔细更改它,最好是到处修改,尊重其含义(尤其是对您的用户)。

如果这一切看起来相当残酷,那是因为我一直在这条路上走下去,相信我,这很痛苦。如果您不想看到您新发现的热情消失在一堆错误报告中,那么请缓慢而轻柔地前进。我有点喜欢 node.js,但我搬起石头砸了自己的脚,因为我做了你所说的那种事情,永远玷污了它在我雇主那里的声誉。小心点,只要放慢速度就可以减轻自己的痛苦。

关于python-3.x - Python 在生产环境中从命令式转向函数式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42678458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com