我是一位非常有经验的开发人员 – 多年来在Delphi,C#和C方面做了很多繁重的工作.我一直非常重视结构化编程,OOP,松耦合模块化设计等指南 – 因为我使用的所有语言都有内置的强制执行这些概念的方法 – 访问控制,静态类型,接口和抽象类支持等 – 我依靠这些来构建我的代码.
现在,我已经用Python乱画了几个月.我对它的许多精彩功能印象深刻 – 但我非常怀念内置的约束,这使得代码模块化和组织变得容易.而且,不幸的是,我看到很多用Python编写的“意大利面条代码”,甚至来自非常可敬的来源.我不会单独出去任何人,但是我有一些由大联盟pythonistas编写的书籍,其中充满了充满设计的例子(更好的说 – “反设计”)让我不寒而栗.在我看来,因为Python很容易使用,所以它也很容易被滥用.
我在Python编写代码时会尝试自我约束,但我发现需要执行大量额外的工作,而且我必须根据自己的设计记忆设置并遵守约束,而无需语言帮助一点都不而且由于没有“编译时间”检查,这是非常困难的 – 通常你不会发现设计缺陷,直到你真正运行该段代码.
所以,我正在寻找非常具体的信息:一些例子或更好的仍然是一本关于WELL STRUCTURED 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)
而且,由于“编译时间”检查似乎永远不会帮助我找到普通的逻辑错误,因此它更加困难 – 通常在实际运行该段代码之前,您不会发现设计缺陷.
Python designs and design techniques …
how to best implement encapsulation,
通过封装.在像Java和C这样的语言中,“封装”已经发展成“在整个地方使用私有东西”.在Python中,根本不支持.
我们都是成年人.
你仍然像其他语言一样进行封装.但是,如果没有私有这个词.
Python为__getattribute__提供了属性,装饰器和覆盖,以实现各种封装技术.
indirection,
通过引用其他对象.我不清楚你在这里遇到了什么具体问题,但也许你已经将一些错误类型的参数传递给了一个函数.避免这种情况的方法是阅读您为自己编写的文档字符串.
very loosely coupled designs,etc.
通过依赖注入.再次.就松散耦合而言,Python就像其他语言一样工作.
你应该大量调查 – 并使用 – docstrings.
您可能希望使用http://sphinx.pocoo.org从文档字符串生成漂亮的文档.