我是一个非常有经验的开发人员-多年来在delphi、c和c++上做了大量繁重的工作。我一直非常严格地遵守结构化编程、面向对象编程、松散耦合模块设计等方面的指导原则,而且由于我使用的所有语言都内置了实现这些概念的方法—访问控制、静态类型、接口和抽象类支持等—所以我依赖这些来构造代码。
现在,我已经用蟒蛇涂鸦几个月了。它的许多优秀特性给我留下了深刻的印象,但我非常怀念那些使代码易于模块化和组织化的内置约束。不幸的是,我看到很多用python编写的“意大利面代码”,甚至来自非常受人尊敬的来源。我不会挑出任何人,但我有几本由大联盟蟒蛇写的书,里面的例子充满了让我不寒而栗的设计(更好的说法是“反设计”)。在我看来,因为python很容易使用,所以它也很容易被滥用。
当我用python编写代码时,我确实试图约束自己,但我发现实现它需要做很多额外的工作,而且通常我不得不简单地根据自己对设计的记忆来设置和遵守约束,而完全没有语言的帮助。而且由于没有“编译时”检查,这是双重困难-通常你不会发现一个设计缺陷,直到你真正运行那段代码。
所以,我在寻找非常具体的信息:一些例子或者更好的是一本结构良好的python设计和设计技术的书-如何最好地实现封装、间接、非常松散耦合的设计等。
来自著名python书籍作者的糟糕设计imo(带模糊处理)

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)

最佳答案

我发现实现和编译代码需要做很多额外的工作,这些代码仅仅基于我自己的设计记忆,在编译前编写代码时没有语言的帮助。一些ide提供了帮助,但是语言本身根本没有提供任何帮助。
而且由于“编译时”检查似乎从来没有帮助我找到普通的逻辑错误,这是加倍困难的-通常你不会发现一个设计缺陷,直到你真正运行那段代码。
python设计和设计技术…
如何最好地实现封装,
通过封装。在Java和C++这样的语言中,“封装”已经发展成“到处使用私有的东西”在Python中根本不受支持。
我们都是成年人了。
你仍然像在其他语言中那样做封装。但是没有“cc”这个词。
python为private提供属性、装饰器和重写,以实现各种封装技术。
间接的,
通过引用其他对象。我不清楚您在这里遇到了哪些具体问题,但可能您给函数传递了一些错误的类型参数。避免这种情况的方法是阅读您为自己编写的docstring。
非常松耦合的设计等。
通过做依赖注入。再一次。在松耦合方面,python的工作方式与其他语言一样。
你应该仔细研究并使用docstring。
您可能希望使用http://sphinx.pocoo.org从docstring生成良好的文档。
您还可以使用python的内置__getattribute__函数读取编写代码时编写的docstring。

09-10 15:17