Какая "лучшая" практика?Передача ссылок на объекты или ссылки на методы объекта в Python - PullRequest
2 голосов
/ 09 января 2011

Я пишу небольшой кусочек кода на Python, и мне интересно, что другие люди думают об этом.

У меня есть несколько классов, у каждого из которых есть несколько методов, и я пытаюсь определить, что это такое "лучше »: пропускать объекты через вызовы методов или передавать методы через вызовы методов, когда нужен только один метод из объекта.В основном, я должен сделать это:

def do_something(self, x, y, manipulator):
    self.my_value = manipulator.process(x, y)

или это

def do_the_same_thing_but_differently(self, x, y, manipulation):
    self.my_value = manipulation(x, y)

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

РЕДАКТИРОВАТЬ: Я удалил формулировку ООП, потому что она явно огорчает,В основном я имел в виду слабую связь и высокую сплоченность.

Ответы [ 3 ]

4 голосов
/ 09 января 2011

Второе решение может обеспечить более слабую связь, поскольку она более «функциональна», а не «ООП».Первое решение имеет то преимущество, что оно работает в таких языках, как C ++, которые не имеют замыканий (хотя можно получить аналогичный эффект, используя шаблоны и функции указателя на член);но в языке, подобном Python, IMHO вторая альтернатива кажется более «естественной».

РЕДАКТИРОВАТЬ: вы найдете очень хорошее обсуждение техники "функциональный против объектно-ориентированного" в бесплатной книге "Perl высшего порядка", доступной здесь:

http://hop.perl.plover.com/

(см. Главу 1, часть 6).Хотя это книга по Perl (а не по Python), обсуждение там точно соответствует заданному здесь вопросу, и описанные там функциональные методы могут быть применены к Python аналогичным образом.

1 голос
/ 09 января 2011

скажу второй подход; потому что это определенно похоже на обратный вызов , который они очень часто используют при использовании голливудского принципа (не звоните нам, мы вам позвоним), который является парадигмой, которая помогает в развитии код с высокой когезией и низкой связью [Ref 2 ].

0 голосов
/ 10 января 2011

Я бы точно выбрал второй подход.

Также учтите, что вы можете изменить интерфейс любого класса Manipulator, чтобы вместо process было написано __call__, и тогда он будет работать прозрачно со вторым подходом.

...