在我之前的问题上,我得到了一些非常棒的帮助,但所有这些解决方案一次只能用于一个度量。
很明显,把所有东西都放在一个大对象中并不能减少它,所以我认为我需要使用类,而不是当前大量的函数。但是,即使我读过学习Python关于类的章节,我还是无法将它应用到我自己的代码中(GitHub link)
我也觉得每次我想得到一些信息的时候处理所有的数据是很奇怪的。一旦我知道每个爪子的位置,我就没有理由再计算了。此外,我想比较同一条狗的所有爪子,以确定哪个接触属于哪个爪子(前/后,左/右)。如果我继续只使用函数,这会变得一团糟。
因此,现在我正在寻找如何创建类的建议,这些类将允许我以合理的方式处理数据(link to the zipped data of one dog)。
我喜欢TDD的方法。。。 因此,首先要为你想要的行为编写测试。并编写通过的代码。在这一点上,不要太担心设计,只要得到一个测试套件和软件通过。如果你只得到一个丑陋的类,一个复杂的方法,不要担心。
有时,在这个初始过程中,您会发现一个行为很难测试,需要分解,只是为了可测试性。这可能暗示需要一个单独的类。
有趣的是。。。重构。在你有了工作软件后,你可以看到复杂的部分。通常情况下,小部分行为会变得很明显,这意味着需要一个新类,但如果不是,那么只需寻找简化代码的方法。提取服务对象和值对象。简化你的方法。
如果您正确地使用了git(您正在使用git,不是吗?),您可以在重构过程中很快尝试某些特定的分解,然后放弃它,如果它不能简化事情,则返回。
通过首先编写经过测试的工作代码,您应该能够深入了解使用“设计优先”方法无法轻松获得的问题领域。编写测试和代码会让您摆脱“从哪里开始”的瘫痪状态。
以下建议(类似于@S.Lott的建议)来自本书,Beginning Python: From Novice to Professional
为了完善课程,本书还建议我们可以做到以下几点:
如何设计一个类。
把单词写下来。你开始这么做了。有些人不知道为什么他们有问题。
将您的一组单词扩展成关于这些对象将要执行的操作的简单语句。也就是说,写下你要做的各种计算。你列出的30只狗,24个测量值,4个接触点,以及每个接触点的几个“参数”很有趣,但这只是故事的一部分。你的“每个爪子的位置”和“比较同一条狗的所有爪子,以确定哪个接触属于哪个爪子”是对象设计的下一步。
在名词下面划线。说真的。有些人争论这个的价值,但我发现对于第一次使用OO的开发人员来说,它是有帮助的。在名词下面划线。
复习名词。像“parameter”和“measurement”这样的通用名词需要替换为特定的、具体的名词,这些名词适用于问题领域中的问题。细节有助于澄清问题。泛型只是省略细节。
对于每个名词(“contact”、“paw”、“dog”等),记下该名词的属性以及该对象所参与的动作。别抄近路。所有属性。”数据集包含30只狗“例如很重要。
对于每个属性,确定这是与已定义的名词的关系,还是与其他类型的“原始”或“原子”数据(如字符串、浮点或不可约的内容)的关系。
对于每个动作或操作,您必须确定哪个名词负责,哪些名词只参与其中。这是一个“易变性”的问题。有些对象会更新,有些则不会。可变对象必须对其突变负全部责任。
此时,您可以开始将名词转换为类定义。有些集合名词是列表、字典、元组、集合或命名元组,您不需要做太多工作。其他类更复杂,要么是因为复杂的派生数据,要么是因为执行了一些更新/变异。
不要忘记使用unittest单独测试每个类。
而且,没有法律规定类必须是可变的。例如,在您的例子中,几乎没有可变数据。您所拥有的是派生数据,由来自源数据集的转换函数创建。
相关问题 更多 >
编程相关推荐