Найти - Пользователи
Полная версия: ООП, проектирование
Начало » Python для экспертов » ООП, проектирование
1
lobster
Всех приветствую, и с наступившим НГ!

До этого не вникал в эту тему серъезно, сейчас напротив, решил заполнить этот пробел. Посоветовали книжку 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”
doza_and
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
ayb
lobster
как мне кажется можно вообще не использовать в самом начале интерфейс “QuackBehavior”

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

Вот хорошая книга про паттерны проектирования с примерами на питоне.
lobster
ayb
Вот так?
class QuackBehavior:
    def quack():
        raise NotImplementedError

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

doza_and
Мне просто хочется изучить шаблоны с точки зрения обобщенных языков таких как “C++, Java, …”, а там потом уже подбить, подрезать, нарастить в питоновском стиле, лучше наверное будет на джаве и вести эту книгу, чем изворачиватся на питоне.
doza_and
lobster
подрезать, нарастить в питоновском стиле
java c++ языки со строгой типизацией. Многие шаблоны предназначены для того чтобы заставить работать на вас проверки времени компиляции. В python такого и близко нет. Поэтом у основном надо выкидывать шаблоны а не наращивать новые.
lobster
лучше наверное будет на джаве
Вам правильно советуют, возьмите лучше книгу по питону. По моим ощущениям изворачиваться вы будете скорее на java. Python более простой язык, нет деления на время компиляции и исполнения. Большинство шаблонов реализуются более простыми средствами. С другой стороны в Питоне важнее правильно построить методики тестирования и рантайм проверок, которые в некоторой мере замещают проверку типов.
ayb
lobster
По abc вчера тоже смотрел, я так понял при использовании абстрактных классов этот модуль предохраняет: “Если ты наследуешься от абс класса, то незабудь реализовать методы в своем классе”

Уж сильно принципиальной разницы нет. В случае с abc Вы получите исключение в момент инстанцирования наследника без необходимого метода.
infoing
https://github.com/faif/python-patterns
lobster

infoing
Благодарю за подборку!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB