Я очень опытный разработчик - много лет работал с Delphi, C # и C ++. Я всегда очень строго придерживался принципов структурного программирования, ООП, слабо связанных модульных конструкций и т. Д., И поскольку все языки, которые я использовал, имеют встроенные способы реализации этих концепций - контроль доступа, статические типы, интерфейс и абстрактный класс поддержка и т. д. Я полагаюсь на них, чтобы структурировать свой код.
Теперь я уже несколько месяцев рисовал на Python. Я впечатлен многими замечательными функциями, но мне очень не хватает встроенных ограничений, которые позволяют легко поддерживать модульный и организованный код. И, к сожалению, я вижу очень много «спагетти-кода», написанного на Python, даже из очень уважаемых источников. Я не буду никого выделять, но у меня есть несколько книг, написанных питонистами высшей лиги, с примерами, изобилующими дизайнами (лучше сказать - «анти-дизайн»), которые заставляют меня содрогнуться. Мне кажется, что из-за того, что Python очень прост в использовании, он также очень легко злоупотребляет .
Я пытаюсь дисциплинировать себя, когда я пишу код на Python, но я считаю, что для его реализации требуется много дополнительной работы, и часто мне приходится устанавливать и придерживаться ограничений просто на основе собственной памяти проекта без посторонней помощи от языка вообще. А поскольку нет проверки «времени компиляции», это вдвойне сложно - часто вы не обнаруживаете ошибки в дизайне, пока не запускаете этот сегмент кода.
Итак, Я ищу очень конкретную информацию: некоторые примеры или, что еще лучше, книга СТРУКТУРЫ WELL Конструкции и методы 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)