Рубрики
Без рубрики

Вернуться к основам: Солидные принципы (замена Лискова)

Пять объектно-ориентированных принципов программирования a.k.a. Солидные принципы устанавливают практики, которые одалуют … Tagged with Python, начинающие.

Пять объектно-ориентированных принципов программирования a.k.a. Сплошные принципы устанавливают практики, которые придают разработке программного обеспечения с соображениями для поддержания и расширения по мере роста проекта.

В этом посте мы будем перейти к третьему твердому принципу.

Принцип замены Лискова

Формальное определение принципа говорит:

Пусть Q (x) будет свойством, доказуемое в отношении объектов x типа T. Тогда Q (y) должен быть доказуемым для объектов y типа S, где S является подтипом T.

Честно говоря, это только пошло на мою голову. Итак, давайте попробуем упростить это.

Подкласс должен быть заменен на его суперкласс. Этот принцип направлен на то, чтобы выяснить, что подкласс может взять на себя место своего суперкласса, не нарушая программу.

Если LSP не соблюдается Новый подкласс может потребовать изменения любого клиента базового класса или интерфейса. Если LSP соблюдается Клиенты могут не знать об изменениях в иерархии классов. Клиент должен вести себя так же независимо от экземпляра подтипа, который он дается.

Поэтому LSP помогает обеспечить соблюдение как принцип открытого закрытого, так и принцип единой ответственности.

Давайте приведем пример, чтобы увидеть это в действии:

class Vehicle:
    def __init__(self, name):
        self.name = name

    def engine(self):
        pass

    def start_engine(self):
        pass

class Car(Vehicle):
    def engine(self):
        return True

    def start_engine(self):
        self.engine()

class Bicycle(Vehicle):
    def engine(self):
        raise Exception("not implemented")

    def start_engine(self):
        raise Exception("not implemented")

    def start_pedaling(self):
        return True


vehicles = [
    Car('queen'),
    Bicycle('booster')
]
def drive_vehicle(vehicles):
    for vehicle in vehicles:
        if isinstance(vehicle, Car):
            vehicle.start_engine()
        elif isinstance(vehicle, Bicycle):
            vehicle.start_pedaling()


В приведенном выше примере автомобиль и велосипед внедряют класс транспортных средств, но они нарушают принцип замены Лискова в двух местах.

  1. Класс велосипедов не поддерживает методы start_engine и двигателя. Это сделает исключение, если мы попытаемся назвать эти методы. Из -за этого у нас есть второе нарушение.
  2. В методе Drive_Vehicle мы проверяем тип экземпляра класса и, соответственно, вызывает соответствующие методы для управления транспортным средством.

Это прямые нарушения LSP, так как мы должны быть в состоянии изменить тип класса, который реализует тот же суперкласс, если клиент не знает об этом изменении.

Решение?

За первое нарушение мы разделим наш класс автомобиля на два класса. Автомобиль будет реализовать класс двигателя с соответствующими методами, и автомобиль и другие транспортные средства с двигателем будут реализовать этот класс.

class Engine:
    def engine(self):
        pass

    def start_engine(self):
        pass

class VehicleWithEngine(Engine):
    def __init__(self, name):
        self.name = name

    def engine(self):
        pass

    def start_engine(self):
        pass

class Car(VehicleWithEngine):
    def engine(self):
        """ define the engine """
        return True

    def start_engine(self):
        """ implement the start up process for the engine"""
        self.engine()

class Bike(VehicleWithEngine):
    def engine(self):
        """ define the engine """
        return True

    def start_engine(self):
        """ implement rest of the steps to start an engine"""
        self.engine()

Для второго нарушения мы будем реализовать другой класс Автомобиль, который взволнован который не будет реализовать класс двигателя и будет иметь свои методы, необходимые для вождения без двигателя.

class VehicleWithoutEngine:
    def __init__(self, name):
        self.name = name

    def start_pedaling(self):
        pass

class Bicycle(VehicleWithoutEngine):
    def start_pedaling(self):
        """implement the pedaling process"""
        return True

Теперь наша функция DIRE_VELHICH будет изменена на:

def drive_vehicle():
    car = Car('Queen')
    car.start_engine()

    bicycle = Bicycle('Booster')
    bicycle.start_pedaling()


Автомобиль и велосипед могут быть транспортными средствами, но оба имеют разные способы работы.

Этот пост является частью 3 серии, возвращаясь к основам, каждый из которых охватывает один солидный принцип.

Рекомендации:

  1. Дзон
  2. Переполнение стека

Оригинал: “https://dev.to/khushboo/back-to-basics-solid-principles-liskov-substitution-4dlf”