Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 2, 2016 10:51:06

lobster
От:
Зарегистрирован: 2011-06-09
Сообщения: 82
Репутация: +  0  -
Профиль   Отправить e-mail  

ООП, проектирование

Всех приветствую, и с наступившим НГ!

До этого не вникал в эту тему серъезно, сейчас напротив, решил заполнить этот пробел. Посоветовали книжку http://www.ozon.ru/context/detail/id/31079082/ по паттернам проектирования, книга неплоха в плане подачи материала - самое оно для новичка, ну так вот там все примеры на джаве, а я решил переписать все примеры на питон, ради спортивного интереса. Вобщем там первая задачка по уткам, используя паттерн СТРАТЕГИЯ, авторы разрабатывают этакий уточный симулятор. Лучше приведу код и спрошу конкретнее:

public interface QuackBehavior {
    public void quack();
}
public class Quack implements QuackBehavior {
    public void quack() {
	System.out.println("Quacking Duck!");
    }
}
public class Squeak implements QuackBehavior {
    public void quack() {
	System.out.println("Squeaking Duck!");
    }
}
public class Duck {
    QuackBehavior quackBehavior;
    public void performQuack() {
	quackBehavior.quack();
    }
}
public class MallardDuck extends Duck {
    public MallardDuck() {
	quackBehavior = new Quack();
    }
}
Duck mallard = new MallardDuck();
mallard.performQuack();

Для краткости здесь привел только одну утку с крякающим св-вом, а вот что у меня получилось на питоне:

class QuackBehavior:
    def quack():
        pass
class Quack(QuackBehavior):
    def quack(self):
        print("Quacking Duck!")
class Squeak(QuackBehavior):
    def quack(self):
        print("Squeaking Duck!")
class Duck:
    def performQuack(self):
        self.quackBehavior.quack()
    
class MallardDuck(Duck):
    def __init__(self):
        self.quackBehavior = Quack()
             
mallard = MallardDuck()
mallard.performQuack()
Правильно ли я переписал код, что можно улучшить в этом коде в контексте питона, как мне кажется можно вообще не использовать в самом начале интерфейс “QuackBehavior”



Офлайн

#2 Янв. 2, 2016 11:28:02

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

ООП, проектирование

lobster
Правильно ли я переписал код
Дело вкуса
lobster
ну так вот там все примеры на джаве
Это совсем разные языки. В java нет множественного наследования, указателей и много чего еще. А шаблоны как ни крути предназначены для преодоления трудностей выражения мысли в конкретном языке. Многие шаблоны для java просто не имеют смысла в python.
Подмену свойств и методов в питоне можно сделать без этих выкрутасов.

class Tqv1:
    def qv(self):
        print("krac")
class Tqv2:
    def qv(self):
        print("crac")
class Tsplash1:
    def sp(self):
        print("bum bum")
class Tsplash2:
    def sp(self):
        print("xlop xlop")
class Tdack1(Tqv1,Tsplash2):
    pass
class Tdack2(Tqv2,Tsplash1):
    pass
dack1=Tdack1()
dack2=Tdack2()
dack1.qv();
dack1.sp();
dack2.qv();
dack2.sp();
>>> 
krac
xlop xlop
crac
bum bum



Отредактировано doza_and (Янв. 2, 2016 11:47:19)

Офлайн

#3 Янв. 2, 2016 11:40:46

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

ООП, проектирование

lobster
как мне кажется можно вообще не использовать в самом начале интерфейс “QuackBehavior”

Его можно ( и иногда нужно ) использовать, но только не так как это делаете Вы. Или используйте ABC, или выбрасывайте исключение NotImplementedError в самом методе.

Вот хорошая книга про паттерны проектирования с примерами на питоне.

Отредактировано ayb (Янв. 2, 2016 11:42:55)

Офлайн

#4 Янв. 3, 2016 06:35:44

lobster
От:
Зарегистрирован: 2011-06-09
Сообщения: 82
Репутация: +  0  -
Профиль   Отправить e-mail  

ООП, проектирование

ayb
Вот так?

class QuackBehavior:
    def quack():
        raise NotImplementedError

По abc вчера тоже смотрел, я так понял при использовании абстрактных классов этот модуль предохраняет: “Если ты наследуешься от абс класса, то незабудь реализовать методы в своем классе”

doza_and
Мне просто хочется изучить шаблоны с точки зрения обобщенных языков таких как “C++, Java, …”, а там потом уже подбить, подрезать, нарастить в питоновском стиле, лучше наверное будет на джаве и вести эту книгу, чем изворачиватся на питоне.



Отредактировано lobster (Янв. 3, 2016 06:44:11)

Офлайн

#5 Янв. 3, 2016 07:26:05

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

ООП, проектирование

lobster
подрезать, нарастить в питоновском стиле
java c++ языки со строгой типизацией. Многие шаблоны предназначены для того чтобы заставить работать на вас проверки времени компиляции. В python такого и близко нет. Поэтом у основном надо выкидывать шаблоны а не наращивать новые.
lobster
лучше наверное будет на джаве
Вам правильно советуют, возьмите лучше книгу по питону. По моим ощущениям изворачиваться вы будете скорее на java. Python более простой язык, нет деления на время компиляции и исполнения. Большинство шаблонов реализуются более простыми средствами. С другой стороны в Питоне важнее правильно построить методики тестирования и рантайм проверок, которые в некоторой мере замещают проверку типов.



Офлайн

#6 Янв. 3, 2016 08:06:01

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

ООП, проектирование

lobster
По abc вчера тоже смотрел, я так понял при использовании абстрактных классов этот модуль предохраняет: “Если ты наследуешься от абс класса, то незабудь реализовать методы в своем классе”

Уж сильно принципиальной разницы нет. В случае с abc Вы получите исключение в момент инстанцирования наследника без необходимого метода.

Офлайн

#7 Янв. 11, 2016 10:59:58

infoing
От:
Зарегистрирован: 2010-09-06
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

ООП, проектирование

Офлайн

#8 Янв. 11, 2016 13:22:51

lobster
От:
Зарегистрирован: 2011-06-09
Сообщения: 82
Репутация: +  0  -
Профиль   Отправить e-mail  

ООП, проектирование


infoing
Благодарю за подборку!



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version