@zlodiak

Соблюдён ли полностью принцип открытости/закрытости?

В следующем коде я имитирую загрузку на склад двигателей двух типов. Помогите пожалуйста понять насколько хорошо соблюдён принцип открытости/закрытости.

Если я добавлю двигатель третьего типа, то мне не придётся менять существующий код. А придётся просто добавить метод load_diesel_engines() в класс Storage. Мне кажется, это правильно

Сомнения возникают потому, что при добавлении третьего типа двигателя всё равно придётся менять код, в котором пользователю предлагается ввести количество через input()

petrol_engine_cnt = input('сколько двигателей типа pertol загрузить на склад?')
electro_engine_cnt = input('сколько двигателей типа electro загрузить на склад?')

storage = Storage()
storage.load_petrol_engines(int(petrol_engine_cnt), PetrolEngine)
storage.load_electro_engines(int(electro_engine_cnt), ElectroEngine)
print(storage.get_engines())


class Storage:
    def __init__(self):
        self.engines = []

    def load_petrol_engines(self, cnt, Engine):
        for i in range(cnt):
            self.engines.append(Engine())

    def load_electro_engines(self, cnt, Engine):
        for i in range(cnt):
            self.engines.append(Engine())            

    def get_engines(self):
        return self.engines


class IEngine(metaclass=ABCMeta):
    @abstractmethod
    def get_type(self):
        pass

    @abstractmethod
    def get_weight(self):
        pass        


class PetrolEngine(IEngine):
    def __init__(self):
        self.type = 'petrol'
        self.weight = 100
        self.serial_num = random.randint(1000000, 9999999)

    def get_type(self):
        return self.type

    def get_weight(self):
        return self.weight

    def __repr__(self):
        return '<Engine_raw: {}/{}>'.format(self.type, self.weight)


class ElectroEngine(IEngine):
    def __init__(self):
        self.type = 'electro'
        self.weight = 50
        self.serial_num = random.randint(1000000, 9999999)

    def get_type(self):
        return self.type

    def get_weight(self):
        return self.weight

    def __repr__(self):
        return '<Engine_raw: {}/{}>'.format(self.type, self.weight)
  • Вопрос задан
  • 96 просмотров
Пригласить эксперта
Ответы на вопрос 1
может лучше сделать универсальный класс и порождать его Engine(type='petrol')
в зависимости от self.type уже требовать ввод каких либо параметров, как то расход топлива на 100 или потребление эл-ва в час
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы