SOLID принципы на Python: OCP - Принцип открытости / закрытости

  Рет қаралды 10,400

EngineerSpock - IT & программирование

EngineerSpock - IT & программирование

Күн бұрын

Пікірлер: 37
@МурадАхмедов-ч1с
@МурадАхмедов-ч1с 10 ай бұрын
Самая главная проблема, когда уже наговнокодили а потом ты пытаешься это исправить, особенно если прошло уже месяца 3
@kitoboynaya
@kitoboynaya 2 ай бұрын
from abc import ABC, abstractmethod from enum import Enum class Color(Enum): ORANGE = 1 GREEN = 2 BLUE = 3 class Size(Enum): SMALL = 1 MEDIUM = 2 LARGE = 3 class Product: def __init__(self, name, color, size): self.name = name self.color = color self.size = size class Specification(ABC): @abstractmethod def is_satisfied(self, item): pass class Filter(ABC): @abstractmethod def filter(self, items, spec): pass class SingleFieldSpecification(Specification): def __init__(self, field, value): self.field = field self.value = value def is_satisfied(self, item): return item.__dict__[self.field] == self.value class MultipleFieldSpecification(Specification): def __init__(self, *args): self.args = args def is_satisfied(self, item): return all( map( lambda spec: spec.is_satisfied(item), self.args ) ) class ProductFilter(Filter): def filter(self, items, spec): for item in items: if spec.is_satisfied(item): yield item products = [ Product('apple', Color.GREEN, Size.SMALL), Product('grape', Color.GREEN, Size.MEDIUM), Product('avocado', Color.GREEN, Size.SMALL), Product('pumpkin', Color.ORANGE, Size.LARGE), Product('watermelon', Color.GREEN, Size.LARGE), ] filter = ProductFilter() spec1 = SingleFieldSpecification('color', Color.GREEN) spec2 = MultipleFieldSpecification( SingleFieldSpecification('color', Color.GREEN), SingleFieldSpecification('size', Size.SMALL), ) for product in filter.filter(products, spec1): print(f'{product.name}') else: print() for product in filter.filter(products, spec2): print(f'{product.name}')
@alexanderprokopenko8198
@alexanderprokopenko8198 2 жыл бұрын
Них*я не понял. Но очень интересно.
@justafish_
@justafish_ Жыл бұрын
18:36 то есть если все таки нужно внести изменения, то мы просто говорим "ну, я сейчас как будто бы переместился в прошлое и добавил эту функциональность в самом начале"? Почему нельзя было так сделать с фильтрами?
@nylinary
@nylinary 11 ай бұрын
Потому что новые фильтры могут прилететь от бизнеса через пол года. А переопределение оператора явно сделали бы в самом начале. Ну а если также прошло пол года, то переопределение оператора было бы нарушением OCP. Тут это для наглядности было нужно
@to5116
@to5116 Жыл бұрын
Было бы хорошо если бы выкладывали код по ссылке
@普京的手机
@普京的手机 10 ай бұрын
11:28 можно ли список products записать в Product.products, куда при создании экземлера класса будут добавляться новые продукты? Будет ли так лучше? И можно ли Filter и Specification называть абстрактными классами в вашем примере?
@bamboleo8951
@bamboleo8951 6 ай бұрын
1. Нет, так не будет лучше, потому что тогда, имо, нарушается srp. Продукт - это продукт, а продукт, в котором еще продукты -- это совсем другая сущность. 2. Да, можно сказать, что это абстрактные классы.
@kitoboynaya
@kitoboynaya 2 ай бұрын
19:10 переопределили __and__ и нарушили принцип инверсии зависимостей :)
@womi1141
@womi1141 Жыл бұрын
Почему не изпользовать статические ovveride методы для filter чтобы не создавать обєкты
@ДмитрийКрашенинников-г7ш
@ДмитрийКрашенинников-г7ш 6 ай бұрын
У меня аж 8 битный мозжечок напрягся как струна от того, что приходилось перематывать взад, чтоб увидеть ранний код. Выложи код в репозиторий так будет проще всем.
@causasgwirionedd6271
@causasgwirionedd6271 2 жыл бұрын
1:33 как вы делаете быстрое присвоение?
@alcoholism322
@alcoholism322 2 жыл бұрын
А кто озвучивал?
@EngineerSpock
@EngineerSpock 2 жыл бұрын
Специалист по озвучке
@КириллЧе-я5ы
@КириллЧе-я5ы 11 ай бұрын
В общем наследуйтесь от интерфейсов миксин🥴 заодно I принцип выполните
@zeroiq6401
@zeroiq6401 Жыл бұрын
Если для каждого фильтра мы будем создавать свой класс, то где принцип открытости для дополнения?
@EngineerSpock
@EngineerSpock Жыл бұрын
В том-то и дело, что мы пишем новый код, а не меняем старый.
@zeroiq6401
@zeroiq6401 Жыл бұрын
@@EngineerSpock так открытость для дополнения то где? Отдельный класс не есть дополнение.
@EngineerSpock
@EngineerSpock Жыл бұрын
@@zeroiq6401 отдельный класс это и есть расширение. Это и есть открытость для расширения
@black_grizzly
@black_grizzly 3 жыл бұрын
Илья, 👋привет. Подскажи, пожалуйста. Нигде не найду внятной инфы. Если хочу учить питон с перспективной работы в вебе, Джанго, фласк. Нужно ли мне начинать обучение с информации где спикеры (книга, курс) учат работать в Jupyter? С вычислениями и алгоритмами. Насколько понял, Юпитер используется в Data. То есть применить это обучение выходит получится в области data, а у меня миссия другая. И я в силу неопытности сейчас не понимаю, если этому обучаться == получать базу и общее понимание для разработки на питоне, либо это изучение питона для той области которая мне сейчас не интересна и стоит начать искать сразу что-то профильное? Присматриваюсь к твоему 📦пакету. Заранее спасибо. Кто в теме, ребят, не стесняйтесь, пишите.
@EngineerSpock
@EngineerSpock 3 жыл бұрын
У меня в курсе жупитер но просто потому что он проще для многих новичков, чем навороченные ide. В конце курса переходим к pycharm. Жупитер как таковой вам не нужен
@black_grizzly
@black_grizzly 3 жыл бұрын
@@EngineerSpock ответ на вопрос ❓к сожалению не был дан. Понимаю, что проще в джупитере, просто здесь получается учишься в узком направлении, так как он для вычислений предназначен. И у новичка, ну по крайней мере мыслящего появляются вопросы. Мне кажется проще то оно проще, но больше проще для препода) На том же степике подобные курсы.
@EngineerSpock
@EngineerSpock 3 жыл бұрын
@@black_grizzly да что учишь то? Что там учить? Мы не учим жупитер. Мы учим питон. Это грубо говоря на процесс обучения не влияет никак от слово совсем с точки зрения затрат времени
@black_grizzly
@black_grizzly 3 жыл бұрын
@@EngineerSpock ну в этом и вопрос. Обучение питону на джупитере закладывает общую базу по изучению языка или узконаправленную? Ориентированную на дата саенс и т.д. Насколько это эффективно и полезно если будущий разраб выбирает для себя ветку веба на начальном этапе.
@EngineerSpock
@EngineerSpock 3 жыл бұрын
@@black_grizzly на эффективности никак не отразится
@aiat122
@aiat122 11 ай бұрын
слишком сложно
@chupa00
@chupa00 2 жыл бұрын
Хоть бы примеры были серьезные, рефакторинг кода с гита, например, иначе для кого это? Новичкам нельзя такой код показывать, просто потому что он типо простой. А по примеру, можно написать только одну дженерик функцию, которая принимает список объектов и предикат для фильтрации, тогда и простыня этих классов без состояний не нужна.
@alcoholism322
@alcoholism322 2 жыл бұрын
Новичкам нельзя такой код, потому что он простой ГЕНИЙ
SOLID принципы на Python: LSP - Принцип подстановки Лисков / Liskov Substitution Principle
8:11
Какой я клей? | CLEX #shorts
0:59
CLEX
Рет қаралды 1,9 МЛН
Принципы SOLID | На примере Python
23:56
Ilya Krukowski
Рет қаралды 23 М.
Парадигмы программирования
11:47
Научиться учиться
Рет қаралды 195
Просто о SOLID (Принципы SOLID)
15:54
webDev
Рет қаралды 224 М.
Минимум математики для Айтишников
16:12
I Was Wrong About Single Responsibility Principle | Prime Reacts
8:14
SOLID в деталях: Принцип открытости/закрытости
8:12
Уголок сельского джависта
Рет қаралды 3,7 М.