Руководство по дизайну Python: - PullRequest
       15

Руководство по дизайну Python:

5 голосов
/ 15 сентября 2011

Я очень опытный разработчик - много лет работал с 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)

Ответы [ 2 ]

2 голосов
/ 15 сентября 2011

Я считаю, что требуется много дополнительной работы для реализации и компиляции кода, который придерживается ограничений, просто основанных на моей собственной памяти проекта, без помощи языка при написании самого кода перед компиляцией.Некоторые IDE предлагают помощь, но сам язык не предлагает мне никакой помощи.

А так как проверка «времени компиляции» никогда не помогает мне находить обычные логические ошибки, это вдвойне сложно - часто вы не находите дизайношибка, пока вы на самом деле не запустите этот сегмент кода.

Проекты и технологии Python ... как лучше всего реализовать инкапсуляцию,

Инкапсулированием.В таких языках, как Java и C ++, «инкапсуляция» стала означать «повсюду используются личные вещи».В Python это просто не поддерживается.

Мы все здесь взрослые.

Вы по-прежнему выполняете инкапсуляцию, как и на любом другом языке.Однако без слова private.

Python предлагает свойства, декораторы и переопределения для __getattribute__ для реализации различных методов инкапсуляции.

косвенное обращение,

Путем ссылки на другие объекты.Я не понимаю, какие конкретно проблемы у вас здесь, но, возможно, вы передали какой-то аргумент неправильного типа в функцию.Чтобы избежать этого, прочитайте строки документов, которые вы написали для себя.

очень слабосвязанные конструкции и т. Д.

Путем внедрения зависимостей.Снова.Python работает так же, как и любой другой язык, в отношении слабой связи.

Вам следует тщательно изучить и использовать строки документации.

Возможно, вы захотите использовать http://sphinx.pocoo.org для генерации хорошей документации из ваших строк документации.

Вы также можете использовать встроенную в Python функцию help() для чтения строк документации, которые вы написали, когдаВы написали свой код.

2 голосов
/ 15 сентября 2011

О поддержке шаблонов проектирования :

Существует предложение, согласно которому шаблоны проектирования также представляют собой грубый показатель пробелов в языке программирования.Было бы интересно прочитать и противопоставить ваше предположение, что шаблоны проектирования - это ограничения, поддерживаемые языком.

...