Python'理论' - 构建一个多功能程序 - 如何规划基本流程

时间:2012-02-07 09:28:37

标签: python modularity

我在python中写了一些小东西,我正在加强构建更具挑战性的东西。

我做的最后一个项目基本上包含了一些文本文件,对每个文件做了一些正则表达式,并以有用的方式构建了数据,因此我可以调查一些数据。

我发现在最后还是很难记住哪个部分在文本的哪一部分进行操作,特别是随着代码的增长,因为我“修复”了整个过程。

在我的脑海中,我想我的代码是一系列小的互连模块 - 我可以留下一些知道他们做什么以及它们如何互操作的离散.py文件。

向我展示如何定义函数的同事基本上意味着我最终得到了一段很长的代码,我发现这些代码很难导航和排除故障。

(1)这是正确的方法吗?或者有一种更简单的方法来制作在它们之间传递变量的模块,我想我会发现这更好,因为我可以更好地可视化流程(主要是因为我几年前习惯在MATLAB中工作)我猜/ p>

(2)您是否可以使用此方法预先计划各种功能层,以便为您提供“地图”?

(3)有没有这种东西易于访问的教程?我经常发现教程突然跳过我的脑袋......

感谢。

3 个答案:

答案 0 :(得分:4)

(1)可以在单个.py文件中编写精细程序

(2)在任何编程风格中,总是(除了特殊的,硬件驱动的情况)最好将代码分解为完成离散任务的短函数(或方法)。

(3)经验丰富的程序员会经常以一种方式编写代码,发现问题,编写更多代码或不同代码,并考虑是否可以将任何现有代码分解为单独的函数。

您需要执行此操作的标志是当您按顺序分配变量以向下传递数据时。永远不要将代码复制粘贴到其他地方,即使是更改,除非将其作为一个函数分解,并用调用该函数替换原始代码。

(4)在许多情况下,将代码组织到类和对象中会很有用,即使在技术上必要这样做也是如此。它可以帮助您看到您已经在某些数据集合上定义了一组完整的操作。

(5)编程实际上很难。即使是那些有天赋的人,也需要一段时间才能感到舒适。举个例子,当我在攻读硕士学位时,我和我的(相当有才华的)朋友们都觉得只有在我们的最后一年,我们才开始获得一定程度的设施和能力(这些都是自那以后一直在编程的人至少他们十几岁的时候)。

重要的是要不断学习和提高,而不是一遍又一遍地重复相同的一两年的经验

(6)为此,阅读书籍和文章。尝试新事物。认为

答案 1 :(得分:3)

其他人建议从开源项目等以及教程和教科书中学习其他有经验的程序员代码,这是一个很好的建议。有时候你需要一个类似的例子来让你走上正确的道路。

我还建议您将自己的挫败感和经验作为反馈来帮助自己改进。每当您发现自己正在考虑以下任何一项时:

  • 感觉就像我一遍又一遍地编写相同的代码,只做了很小的改动
  • 我自己写了这段代码,但我不得不长时间研究它以重新学习它是如何工作的
  • 每次我回去为此代码添加内容时,我需要更长时间才能让它再次运行
  • 这个代码中有一个错误,但我不知道哪里
  • 肯定有人在某处解决了这个问题
  • 为什么这需要我这么长时间才能完成?

这意味着您的技术有改进的余地。专家和初级程序员之间的许多区别在于能够执行以下操作:

  • 不要重复自己(DRY):不要使用复制粘贴代码,或者使用变体一遍又一遍地编写相同的代码,而是使用一个或多个可以执行所有这些操作的参数编写单个公共例程。然后在多个地方调用该例程。
  • 保持简单(KIS):将代码分解为简单明确定义的行为/例程,这些行为/例程本身有意义,组织成类/模块/包,以便整个程序的每个部分都易于理解和保持。即使您不打算发布它们,也要撰写信息丰富且简明扼要的评论并记录电话。
  • 分而治征服测试:在开发时彻底测试每个类,功能等(最好使用单元测试框架),而不是仅测试整个应用程序。
  • 不要重新发明轮子:尽可能使用开源框架或其他工具来解决一般而非特定于您的应用程序的问题。除了最微不足道的情况之外,您可能无法完全理解问题,并且您的本土解决方案可能缺乏重要的方式。
  • 诚实地估计:研究你自己以前的努力,了解你做某些事情需要多长时间。尝试下次更快地工作,但不要假设你会。衡量自己,并使用自己的经验来估计未来的努力。设定期望并与范围讨价还价。

答案 2 :(得分:0)

如果没有您的代码片段以供参考,很难知道哪里开始回答您的问题。您可能希望将代码发布到免费的公共网站,例如http://www.bitbucket.org/http://www.github.org/,然后包含一些关于代码的小代码段的特定问题,并将链接返回到您的存储库。这使得受访者可以查看代码并对其进行评论。 (这两个选项甚至包括颜色语法突出显示,感兴趣的通讯员甚至可以拉下代码,进行更改并推送补丁或创建自己的代码分支并向您发送“拉”请求,以便您可以查看差异并将选定的变更集拉回到您的分支中。)

更一般地说,有许多方案设计方法。您似乎试图重新发明一种非常古老的方法,称为“功能分解” - 将手头的总体任务看作一个函数(摘要文本文件)并考虑如何将其分解(分解)为较小的函数(摄取输入文件,解析它们,准备结果,输出它们),然后将它们进一步分解,直到你的单元足够小,可以在编程环境(Python)中轻松编码。

现代方法(和工具)倾向于使用面向对象的设计方法。您可以尝试阅读:http://www.itmaybeahack.com/homepage/books/oodesign/build-python/html/index.html