Найти - Пользователи
Полная версия: Можно ли считать мой код примером паттерна "Фабричный метод"?
Начало » Python для экспертов » Можно ли считать мой код примером паттерна "Фабричный метод"?
1
Yurich_BRO
Когда я изучил весь синтаксис и получил опыт в программировании на Python, я решил познакомиться с паттернами или шаблонами проектирования. Первым я решил изучить паттерн “Фабричный метод”, поскольку посчитал его довольно понятным и очевидным.

Написанный мой пример не имеет практического смысла, он создан исключительно для тренировки и понимания. Пример заключается в создании класса ObjectFactory, который на основе указанных ему данных приписывает некие реализации неким типам входных данных. С использованием этого класса написан класс Converter, который можно конфигурировать под словарь с готовым соотношением типов данных и реализаций.

Конкретный пример использования этих классов, который я реализовал - конвертация разных типов данных в список.
Код успешно функционирует, выполняя поставленную перед ним задачу. Так вот сам вопрос - можно считать написанный мной код примером паттерна “Фабричный метод”?

 from decimal import Decimal
 
 
class ObjectFactory:
    """Компонент Creator, использующий принцип регистрации реализаций"""
    def __init__(self):
        self.builders = {}
    
    def register(self, data_type, func):
        self.builders[data_type] = func
    
    def create(self, obj, **kwargs):
        builder = self.builders.get(type(obj))
        if not builder:
            raise ValueError(key)
        return builder(obj, **kwargs)
 
 
class Converter:
    """Класс, реализующий компонент Client"""
    def __init__(self, formats):
        self.factory = ObjectFactory()
        for i in formats:
            self.factory.register(i, formats[i])
    
    def convert(self, obj, **kwargs):
        builder = self.factory.create(obj, **kwargs)
        return builder
 
 
def str_to_list(obj):
    return list(obj)
 
def int_to_list(obj):
    return list(str(obj))
 
def dict_to_list(obj, mode=0):
    if mode:
        return list(obj.values())
    else:
        return list(obj.keys())
 
def float_to_list(obj, mode=0):
    if mode:
        obj = Decimal(str(obj))
        return [float(obj // 1), float(obj % 1)]
    else:
        return list(str(obj))
 
 
if __name__ == '__main__':
    tolist_config = {
        int: int_to_list,
        str: str_to_list,
        dict: dict_to_list,
        float: float_to_list
    }
    tolist = Converter(tolist_config)
    
    num = 16
    list1 = tolist.convert(num)
    
    string = 'abc'
    list2 = tolist.convert(string)
    
    float_num = 1.23
    list3 = tolist.convert(float_num, mode=1)
    
    dict_ = {0: 1, 1: 2, 2: 3}
    list4 = tolist.convert(dict_, mode=1)
    
    print(list1, list2, list3, list4, sep='\n')
py.user.next
Yurich_BRO
Когда я изучил весь синтаксис и получил опыт в программировании на Python, я решил познакомиться с паттернами или шаблонами проектирования.
Так, а программы ты какие-нибудь сделал? С чего ты взял, что ты умеешь делать программы? С чего ты взял, что если ты побултыхался в ванне, то ты можешь и реку с течением переплыть, и озеро километровое? Кто программ не делает, тот не умеет их делать. А программист - это тот, кто создаёт программы.

Вот шаблон “Фабричный метод”
  
#!/usr/bin/env python3
 
from abc import ABCMeta, abstractmethod
 
 
class UnitInterface(metaclass=ABCMeta):
 
    @abstractmethod
    def what(self):
        pass
 
 
class Creator(metaclass=ABCMeta):
 
    @abstractmethod
    def make_unit(self):
        pass
 
    def new_unit(self):
        return self.make_unit()
 
 
class Dog(UnitInterface):
 
    def what(self):
        return 'dog'
 
 
class DogCreator(Creator):
 
    def make_unit(self):
        return Dog()
 
 
class Cat(UnitInterface):
 
    def what(self):
        return 'cat'
 
 
class CatCreator(Creator):
 
    def make_unit(self):
        return Cat()
 
 
def action(creator):
    unit = creator.new_unit()
    print('The {} is created.'.format(unit.what()))
 
 
def main():
    action(DogCreator())
    action(CatCreator())
 
if __name__ == '__main__':
    main()
В чём смысл шаблона? Шаблон не делается просто так, чтобы показывать кому-то, что ты умеешь его делать, чтобы там поохали, поахали и взяли тебя на работу и стали деньги давать, много и желательно почаще. Шаблон нужен для того, чтобы добавлять функциональность в программу, не затрагивая уже написанный код в ней. Поэтому когда нам нужна функциональность, мы просто берём, дописываем что-то и она появляется. С чем это связано? Это связано с тем, что обычно написанного кода дохера и больше, писали его разные люди и никто уже не помнит, что там написано; просто всё работает и надо приделать что-то новое к нему. Если бы ты был программистом, мне бы тебе не приходилось объяснять это всё, так как ты бы это знал сам уже, многократно столкнувшись с этим во время создания разных программ.

Чтобы научиться делать шаблоны ООП, тебе нужно заполучить книгу “банда четырёх” и прочитать её, потому что описаны они там. Но если ты думаешь, что кому-то упали твои шаблоны без всего, то ты глубоко заблуждаешься. Не нужен ты никому ни с шаблонами, ни без шаблонов, потому что плюсов от тебя никаких. Что ты есть, что тебя нет. Проект не меняется, а значит и платить тебе не за что. Другое дело, если ты в состоянии что-то создать и всё это сделать без сопливых разжёвываний и скармливаний тебе с ложечки, с которой всё ещё вываливается в слюнявчик к тому же.

Так что пиздуй читать книжку.
Yurich_BRO
Хоть я и не могу оспорить мнение опытного человека, но насколько я слышал, шаблоны используются также для рефакторинга кода, повышения расширяемости и гибкости, а не только расширения текущего функционала.
И че ты мне вообще про работу затираешь? Я что-то говорил про это? Нет - ну и не надо спонтанных замечаний по поводу моей профпригодности.
А за пример спасибо. И за литературу тоже.
py.user.next
Yurich_BRO
я слышал, шаблоны используются также для рефакторинга кода, повышения расширяемости и гибкости, а не только расширения текущего функционала
Я понял, что ты находишься на каком-то начальном уровне, поэтому делаю тебе скидку на всю ту ахинею, которая из тебя льётся. Но если ты будешь методом тыка изучать такие вещи, то результат будет нулевым. Во-первых, изучать тебе их ещё рано, потому что они тебе просто никак не помогут, так как у тебя программ нет таких, а к чужим программам тебя и на пушечный выстрел не подпустят. Во-вторых, существует стандартный путь становления программистом, который не заключается в просмотре нескольких видео, потом прохождения курсов в какой-нибудь говношколе типа GeekBrains или весьма “продуктивных” курсов от Яндекса, потом сертификации, а потом прихода куда-нибудь с этой бумажкой и рассказов, о том, как ты бороздишь просторы Вселенной, только вот написать ничего не можешь и ни одной программки у тебя нет за двадцать лет “программирования”. Соответственно, если ты решил методом тыка чуть-чуть что-то попробовать, чтобы ходить и потом утверждать, что ты этому научился, то это приведёт к тому, что ты совсем разочаруешься в себе, в своей жизни и, может даже, повесишься, как этот из Prodigy или Отпетых мошенников. Ха-ха-ха.

Бери книжки, изучай их, читай и перечитывай, всё программируй по десять раз. Так ты и станешь программистом. А после этого уже тебе и понадобятся шаблоны ООП. Они тебе лично понадобятся, чтобы проги делать, а не для кого-то там и для рекламы себя. В данный момент ты не знаешь и ООП вообще. Но можешь не расстраиваться, где-то 70% вот этих коучеров, которые преподают ООП и сами, и через говношколы, не знают, что такое ООП, даже близко. Поэтому-то они и преподают годами, а программ у них нет, потому что они их банально делать не умеют. Юзают чужие проги “программисты” эти.
Yurich_BRO
Ну вот на счет собственных программок вы не правы. В папке на компе у меня скопилось несколько проектов, основанных на классах, не знаю, можно ли это назвать полноценным ООП. И они не из разряда задачек с курсов. А вполне массивные “программки” на 200-700 строк. С документацией, а иногда и без. Я делал парочку очень простых проектов на PyGame. Если быть точным, то кликер и анимированный фон. Да и кучу всякого консольного, тоже с ООП, но без паттернов. А паттерны я хочу изучить чтобы повысить качество своего кода в ближайшем будущем. А еще, один паттерн я изучил, не догадываясь о том, что это паттерн. Это декоратор.
И учился я не только по курсам. Знаю как делать gui на ткинтер, его реализации тоже писал с ООП. Так что я считаю, что я уже достиг того уровня опыта и знаний, чтобы начать изучать паттерны.
И еще вопрос по литературе. Я читал статью на хабре, где чел рассказывал о своем опыте изучения паттернов. Он параллельно изучал 2 книги:
Head First - Паттерны проектирования
Банда четырех
Если вы знакомы с первой книгой, что можете сказать про такой способ изучения?
py.user.next
Yurich_BRO
Если вы знакомы с первой книгой
Ну, я скачал, посмотрел. Можно, конечно, её использовать, потому что “банда четырёх” даже после переиздания довольно запутана. Может быть, это русский перевод делает своё дело (я с таким уже сталкивался и при изучении SCRUM, и при изучении Git; русский перевод портил восприятие по полной, в то время как английский источник всё понятно и ясно передавал; скорость прохождения замедляется раза в два, но ты хотя бы запоминаешь всё точно, потому что всё понятно). А в этой книге как бы для тупых всё объясняется. В “банде четырёх” надо много думать, что они имели в виду, потому что даже UML-диаграммы там не так уж понятны, да и примеры у них идут на C++, который неизбежно перегружен и синтаксисом, и внутренним своим устройством. Нужно сидеть и долго соображать, как работает их код из примеров. Что мешало им использовать Java, где всё это убрано под капот и не надо ни о чём лишнем думать? Так что “банда четырёх” написана тяжеловато для восприятия, но там есть всё про шаблоны.

Yurich_BRO
В папке на компе у меня скопилось несколько проектов, основанных на классах, не знаю, можно ли это назвать полноценным ООП. И они не из разряда задачек с курсов. А вполне массивные “программки” на 200-700 строк.
Я тебе об этом и говорю: я просто ухахатываюсь с того, что ты пишешь. ООПшные программы начинаются с 10000 строк. Оно для того и придумано вообще. Если ты не в курсе, то Nginx, например, - это программа на 70000 строк, которая написана на C без всякого ООП просто потому, что такие программы можно писать без ООП. А уж возможности Nginx'а пока что никто не повторил, в том числе и эти авторы этих книжек. А 200-700 строк - ну, это как бы… а что они делают-то, эти программы? Программа, которую сложно заменить руками (делать всё вручную вместо неё) начинается где-то с 5000 строк. То есть её есть смысл писать дальше, когда она доросла до 5000 строк, потому, что без неё ты не можешь сделать то, что делает эта программа, вручную не можешь сделать.

Yurich_BRO
Я читал статью на хабре, где чел рассказывал о своем опыте изучения паттернов.
А он не рассказывал о своём опыте создания программ? Статью-то может написать любой дурак, она кушать не просит, да и нагенерить туда можно с три короба. А вот программу создать так не получится. Можешь сколько угодно её уговаривать создаться, обложиться сертификами и волшебным бубном, но если ты её написать не можешь, то она сама не напишется. И не будет у тебя никакой программы в итоге, будешь только сидеть и статьи писать куда-то там про то, как ты мог бы написать программу, да вот только за двадцать лет времени на это не нашлось. В общем, смотри, кого читаешь, какие программы они сделали. Потому что очень часто там пустота.

Да, и ООП ты не знаешь. Потому что ты считаешь, что ООП - это когда слово class написал, а потом создал объект. И типа, если в программе есть классы и объекты, то это ООП. А это к ООП отношения не имеет. Это называется программированием с абстрактными типами данных только и всё.

Yurich_BRO
А еще, один паттерн я изучил, не догадываясь о том, что это паттерн. Это декоратор.
Да, да. Я нашёл кисточку художника и изучил её - теперь я художник. Ахаха. Художник? Ну, нарисуй тогда что-нибудь этой кисточкой, хоть пейзаж, хоть собаку.
Rodegast
> но насколько я слышал, шаблоны используются также для рефакторинга кода, повышения расширяемости и гибкости, а не только расширения текущего функционала.

Шаблоны актуальны для статически типизированных ООП языков на подобии C# или Java. Если хочешь прочитать про их применение на python-е, то смотри книгу “Марк Саммерфилд - Python на практике”. Но лучше пока забей.
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