Комментарии 16
Но тогда получается, что у круга будут свойства и методы эллипса, такие,
как RadiusX, RadiusY, StretchX, StretchY, которые для круга не имеют
смысла и не могут быть выполнены.
Почему не могут быть? По определению окружность это такой эллипс, у которого radiusX == radiusY. Оба метода одно число возвращать должны. Не знаю, что вы тут под стретчами имеете в виду. Возможно, эксцентриситет. Но и это понятие для окружности существует. Итого пример вымученный.
А вымученный он потому, что все эти Cat extends Animal вроде бы корректны, но к практике отношения не имеют. Лучше объясняйте студентам кейс с Collections.unmodifiableList в джаве. Вот уже где нарушение LSP, которое может много приятных минут доставить.
Со студентами второго курса, которые (90%) только что узнали, что такое полиморфизм и вообще ещё ничего не знают ни про какие стандартные коллекции?
Хотите сказать, что для людей, которые второй год грызут матан, стандартная либа джавы это что-то запредельное?
Не знаю, насчёт запредельного, но точно не приоритетное. Я попытался выписать всё более приоритетное (SOLID - одна из самых последних глав), получилось уже 250 страниц мелким шрифтом.
Объяснять SOLID на пальцах без погружения в реальные задачи - это как демонстрировать релятивистские эффекты на примере движущихся жигулей. Эффекты не будут видны, как вы понимаете. Я тоже думал, что понимаю солид, пока не отрефакторил реальный проект на 100к строк и не ощутил достоинства и недостатки. Ваш труд рискует уйти в песок. Говорю в том числе как инженер, который собеседует джунов, у которых регулярно в CV встречается "пишу по SOLID"
В этом с вами полностью согласен, но что делать? Не упоминать солиды вообще?
Я бы на вашем месте в качестве теории давал бы непосредственно статью Мартина плюс все, что успели написать по этому поводу в интернете за 20 лет. Пережевывать ее "на пальцах" смысла нет. Чем дальше, тем нелепее смотрятся эти "объяснения". Sapienti sat.
А в качестве практики написал бы код, в который бы аккуратно вплел нарушения принципов. Далее студенты должны провести код-ревью и обосновать, где какие принципы нарушаются.
Я согласен с тем, что и такое мнение имеет право на жизнь, но у меня оно другое.
Это короткий односеместровый курс, там кот наплакал лекций. Поэтому я должен хорошо научить самым основам и дальше упомянуть всё остальное, чтобы дать кругозор и перспективу. Без интроспекции и рефлекции тоже, например, можно разрабатывать - но зацепить этими словами мозг и дать вводную, я считаю, нужно, поэтому так и делаю.
Наверное есть другие ВУЗы, там другие программы, может там ООП без солидов и паттернов изучают, я ж не настаиваю -- я просто делюсь собственным видением.
Ну и потом, как по мне, когда слушатель без опыта, хорошие примеры кода им как раз полезнее, чем абстрактные принципы. То есть, именно показать, что вот класс, у которого скажем нарушается SRP. Показать, к каким негативным результатам это приводит, показать как сделать лучше. Уже потом дать этому название.
Ну и еще — если уж кругозор и перспектива — то стоит вообще отойти чуток от ООП, и показать хоть немного, как подобные проблемы решаются в других парадигмах. Скажем, что есть такая штука как ФП, и там это вот так.
Понятно, что хорошие примеры это тоже сложно.
Я бы все же чуть сменил формулировку. Не настаиваю, но: формулировка из википедии, не та что в самом начале, а чуть ниже, она лучше показывает, для чего и почему. Ну то есть:
При создании программных систем использование принципов SOLID способствует созданию такой системы, которую будет легко поддерживать и расширять в течение долгого времени[3].
То есть, подчеркнуть, что речь о поддержке и развитии. И значит, например, что если вам вашу систему и так легко поддерживать — то вам это все в общем-то пока и не нужно. И уже от этого отталкиваться, при обсуждении конкретных принципов.
зацепить этими словами мозг и дать вводную
Оно может так где-то и работает, но только не в прикладном программировании. Мне сейчас приходится менторить джуна. Там любой мой совет в одно ухо влетает, в другое вылетает. Пока человек сам себе всю башку не разобьет обо что-то - понимания не придет. А SOLID это ровно такая вещь, которая требует в щепки разбитого лба. Ровно поэтому все 100500 статей "Щас объясню солид на JS на примере кошек" имеют нулевой эффект.
браво
— Макс, че там с диффуравнением и комплексным числом? Ммм, спасибо. А кстати, подскажи, почему тут кошечка от животного наследуется?
— Макс, с кошкой понял, но вот по лабораторной аналогия: отправитель сигнала если унаследуем от общего отправителя, то как обернуть закешированный отправитель, типа чтобы был таким же отправителем — делаю работу, с кошками понятно, но тут лишние абстракции мешают, а наследоваться можно только от одного, мне еще раз отнаследоваться и поменять в приемнике тип?...
Здравствуйте, бумажные версии ваших книг в природе существуют?
Помимо SOLID стоит так же сразу обучать RAII и нормальным C++. Не нужно отговорок типа "ещё рано". Эти основы важнее чем SOLID для написания корректного кода. Краткий список пробоем: сырые указатели, типы из Си (при наличии c++ аналогов)
Конспект лекций по ООП, или Только не ещё одна статья про SOLID