2

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

4

1 回答 1

5

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

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

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

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

这是另一个关于灵感的好谈话。这是Bob 叔叔干净架构的链接。尽管面向 UI 编程,但它是相关的。

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

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

于 2017-03-09T20:39:16.300 回答