Какая практика лучше? Передача ссылок на объекты или ссылки на методы объекта в Python
Я пишу небольшой кусочек кода на 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 ответа
Второе решение может обеспечить более слабую связь, потому что оно более "функционально", а не "ООП". Первое решение имеет то преимущество, что оно работает в таких языках, как C++, которые не имеют замыканий (хотя можно получить аналогичный эффект, используя шаблоны и функции указателя на член); но в языке, подобном Python, IMHO вторая альтернатива кажется более "естественной".
РЕДАКТИРОВАТЬ: вы найдете очень хорошее обсуждение "функциональных против объектно-ориентированных" методов в бесплатной книге "Perl высшего порядка", доступной здесь:
(см. главу 1, часть 6). Хотя это книга по Perl (а не по Python), обсуждение там точно соответствует заданному здесь вопросу, и описанные там функциональные методы могут быть применены к Python аналогичным образом.
Я скажу второй подход; потому что это определенно похоже на обратный вызов, который они очень часто используют при использовании голливудского принципа (не звоните нам, мы вам перезвоним), который является парадигмой, которая помогает в разработке кода с высокой связностью и низкой связью [Ref 2].
Я определенно пошел бы со вторым подходом.
Также учтите, что вы можете изменить интерфейс любого класса Manipulator так, чтобы process
вместо этого пишется __call__
и тогда он будет работать прозрачно со вторым подходом.