Python设计指南

2024-09-30 16:30:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个经验丰富的开发人员,多年来一直从事德尔福、C、C++等多项繁重的工作。我一直非常严格地遵循结构化编程、OOP、松耦合模块化设计等的指导原则,而且由于我使用的所有语言都内置了实现这些概念的方法—访问控制、静态类型、接口和抽象类支持等等—我依靠这些来构建我的代码。在

现在,我已经用Python乱涂几个月了。它的许多优秀特性给我留下了深刻的印象,但我非常怀念那些使代码易于模块化和组织化的内置约束。而且,不幸的是,我看到了很多用Python编写的“意大利面代码”,甚至来自非常受欢迎的源代码。我不会挑出任何人,但我有几本由大联盟Python人写的书,里面有很多设计的例子(更好的说法是“反设计”),让我不寒而栗。在我看来,因为Python非常容易使用,所以它也很容易被滥用。

当我用Python编写代码时,我确实试着约束自己,但是我发现它需要大量额外的工作来实现,而且通常我必须根据自己对设计的记忆来设置和遵守约束,而完全没有语言的帮助。而且,由于没有“编译时”检查,这就加倍困难了——通常在实际运行这段代码之前,你不会发现设计缺陷。在

所以,我在寻找非常具体的信息:一些例子或者更好的是一本关于结构良好的Python设计和设计技术的书如何最好地实现封装、间接、非常松散耦合的设计等等

糟糕的设计来自一位著名的python书籍作者(带有混淆)

def populateList(self, selecteddisk=None):
selected = None ***#Bundling - coupling:*** 
self.listWidget.clear()
for disk in self.disks.inOrder():
item = QListWidgetItem(QString("%1 of %2/%3 (%L4)") \
.arg(disk.name).arg(disk.owner).arg(disk.country) \
.arg(disk.teu))
self.listWidget.addItem(item)
***#Bundling - coupling:*** 
if selecteddisk is not None and selecteddisk == id(disk):
    selected = item
    if selected is not None:
    selected.setSelected(True)
    self.listWidget.setCurrentItem(selected)

Tags: 代码selfnone语言arg模块化item内置
2条回答

我发现实现和编译代码需要大量额外的工作,这些代码仅仅基于我自己对设计的记忆,在编译之前编写代码时没有语言的帮助。有些IDE提供了帮助,但是语言本身却没有提供任何帮助。在

而且由于“编译时”检查似乎从来没有帮助我找到普通的逻辑错误,这就加倍困难了——通常直到你真正运行这段代码,你才发现设计缺陷。在

Python designs and design techniques ... how to best implement encapsulation,

通过封装。在java和C++这样的语言中,“封装”已经发展成“在整个地方使用私有的东西”。在

我们都是成年人。

你仍然像其他语言一样进行封装。但是没有private这个词。在

Python为__getattribute__提供属性、修饰符和重写,以实现各种封装技术。在

indirection,

通过引用其他对象。我不清楚您在这里遇到了哪些具体问题,但可能您向函数传递了错误的类型参数。避免这种情况的方法是阅读您自己编写的docstring。在

very loosely coupled designs, etc.

通过执行依赖注入。再一次。Python在松耦合方面的工作原理与其他语言一样。在

您应该大量研究和使用docstring。在

您可能需要使用http://sphinx.pocoo.org从docstring生成漂亮的文档。在

您还可以使用Python内置的help()函数来读取编写代码时编写的docstring。在

关于设计模式的支持

有一个命题也将设计模式作为编程语言中差距的粗略度量。这将是一个有趣的阅读,并与您的建议相反,即设计模式是语言支持的约束。在

相关问题 更多 >