Как стать автором
Обновить

Комментарии 5

А зачем объединять фабрику и базовый класс? Это же убивает весь смысл происходящего.

Базовый класс - это абстракция, контракт описывающий свойства своих наследников. Он о деталях реализации не должен знать ничего.

Фабрика же - это уже конкретная реализация, выдающая конкретные экземпляры конкретных классов.

Ясное дело, что если вы их вместе скрестите, то получится дичь.

В данном случае, думаю, целесообразней применить Builder pattern.

Как вариант.
Но я говорил, что во многих модулях есть использование класса репозиторий
repository = Repository("name", "directory")
repository.clone()
......
repository.push("new commit")

мне не хотелось бы менять код - я хотел оставить весь остальной код без изменений.

Конструкторы в этих двух классах делают совершенно одно и то же за исключением случая, когда вы явно передаёте None (но какой смысл передавать в конструктор None ?):

class A:
    def __init__(self, repo_type = None):
        if repo_type is None:
            self.repo_type = 'hg'

class B:
    def __init__(self, repo_type = 'hg'):
        self.repo_type = repo_type


if __name__=='__main__':
    a = A()
    b = B()
    print(f'a.repo_type: {a.repo_type}, b.repo_type: {b.repo_type}')
    a = A(None)
    b = B(None)
    print(f'a.repo_type: {a.repo_type}, b.repo_type: {b.repo_type}')

python3 test.py
a.repo_type: hg, b.repo_type: hg
a.repo_type: hg, b.repo_type: None

Да согласен, None выглядит не очень хорошо.
Это из-за того, что я пропустил часть кода - у нас часть репозиториев перешла на Git, часть осталась в Mercurial + я добивался того что бы не модифицировать уже имеющиеся скрипты CI/CD.

Полный код выглядит так:
default_repo_type: dict = {
"repo1": "git",
"repo2": "hg",
"repo3": "hg",
}
........
if repo_type is None:
repo_type = default_repo_type.get(name)
........

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории