Форум сайта python.su
857
SlowДавай пример конкретный. Вот я привёл Django, который монолитный и больше не будет меняться никогда, потому что переписывать его нереально. Почему он монолитный? Потому что всё от всего зависит. Да и дерево классов ты обязан полностью загрузить перед тем, как начать что-то делать. При соединении разрозненных объектов ты можешь ничего не подгружать, если оно не нужно. На что уйдёт больше времени?
На очень большом классе задач композиция наоборот проигрывает наследованию, как с точки зрения сопровождения кода, так и производительности.
Офлайн
4
py.user.nextВо-первых, я вам не тыкал. Думаю, и не буду.
Офлайн
857
SlowЧто-то не впечатлило как-то. Он же может поменять своё мнение там типа “ой, ребята, я ошибся немного, вношу правку, терь я думаю вот так”. Это же блог какой-то.
Вот вам на почитать, там хорошо расписано, что и когда применять
https://www.thoughtworks.com/insights/blog/composition-vs-inheritance-how-choose
SlowНужно всё в памяти держать всё время. Ты не можешь подгружать это по частям, только когда надо.
Что значит “загружать дерево классов”?
SlowНам что-то понадобилось - мы это подгрузили. Оно может вообще в другом модуле находиться. А с наследованием такое не прокатит, так как подгружать надо всё и сразу.
предполагает, что мы должны в рантайме проверять, а подгрузили ли мы, это как минимум.
Офлайн
568
Slow
Да не пытайтесь вы спорить. У этого человека есть заведомое мощное преимущество в любой дискуссии - он не стесняется переходить границы маразма. Покажите вот такой пример, вам с легким сердцем ответят, что Оракл делает продукты без души, ибо есть корпорация зла. Подобные дискурсы здесь уже неоднократно обсуждались.
Офлайн
0
py.user.nextа как в питоне описывать интерфейсы ? их же нет в чистом питоне !
Наследования нужно избегать. Вместо него используют агрегацию, так как она не связывает код.Так что надо в классах тех работать с интерфейсами. А после того, как оно написано, нужно написать такие классы, которые реализуют эти интерфейсы. И когда они сделаны, надо сделать агрегацию - то есть сделать экземпляры этих реализаций и подать эти экземпляры снаружи через конструктор.
Офлайн
186
> а как в питоне описывать интерфейсы ? их же нет в чистом питоне !
Совокупность атрибутов объекта как раз и образуют его интерфейс. Абстрактные классы в том виде как они есть в C++/C# в Python-е не используются т.к. утинная типизация.
Офлайн
857
druidich92Через класс. Интерфейс - это набор методов. В ООПшных языках часто используют базовый класс (когда нет конструкций для интерфейсов). Например, делаешь интерфейс Animal, а потом для него пишешь функцию, которая работает с экземпляром класса Animal. Потом от него наследуешься и делаешь классы Dog и Cat. И потом в ту функцию, которая работает с экземпляром Animal, ты можешь подавать как экземпляр Dog, так и экземпляр Cat, потому что у них те же методы есть. Интерфейсом здесь служит Animal. Но ты можешь и не наследоваться от Animal, а просто реализовать интерфейс Animal в каком-то классе. То есть необходимости в наследовании нет, чтобы использовать интерфейс.
а как в питоне описывать интерфейсы ?
>>> class Animal: ... ... def say(self): ... raise NotImplemented ... >>> class Cat: ... ... def __init__(self, name): ... self.name = name ... ... def say(self): ... print("I'm a cat", self.name) ... ... def scratch(self): ... print("Scratching...") ... >>> class Dog: ... ... def __init__(self, name): ... self.name = name ... ... def say(self): ... print("I'm a dog", self.name) ... ... def woof(self): ... print("Woofing...") ... >>> >>> def animal_say(animal): ... animal.say() ... >>> >>> for i in (Cat('1'), Dog('1'), Cat('2'), Dog('2')): ... animal_say(i) ... I'm a cat 1 I'm a dog 1 I'm a cat 2 I'm a dog 2 >>>
Офлайн
568
1. Говорим о том, что наследование - антипаттерн.
2. В подтверждение своих доводов приводим пример
Например, делаешь интерфейс Animal, а потом для него пишешь функцию, которая работает с экземпляром класса Animal. Потом от него наследуешься и делаешь классы Dog и Cat.
Офлайн
857
FishHookТы не видел что ли рекламу шампуня хэд энд шолдерс? Это называется два в одном. Я ему говорю, как делали раньше, а потом сразу показываю, как делают сейчас. Просто по старому стилю мы должны отнаследовать Dog и Cat, чтобы сделать то же самое, но при этом возникает дерево классов, которое нам нафиг не нужно. Теперь же я свободно могу отнаследоваться от Dog, не боясь, что это как-то зафиксирует код класса Animal ещё больше. Но и от Dog я наследоваться не буду, а сделаю то же самое. А теперь мы убираем класс Animal из программы и видим, что остальное не нужно переделывать, потому что оно не зависит от класса Animal. Dog и Cat остаются и живут спокойно, не заметив даже, что Animal больше нет.
3. Показываем код, где классы Dog и Cat от Animal не наследуются.
Отредактировано py.user.next (Окт. 5, 2017 06:42:00)
Офлайн
568
py.user.nextТот код, который ты показал, это то, как делают сейчас? Замечательно, объясни мне дураку, зачем в нем вообще нужен класс Animal? какова его цель и смысл, если он только определяется, но не используется.
Я ему говорю, как делали раньше, а потом сразу показываю, как делают сейчас.
Офлайн