tag:blogger.com,1999:blog-458002489272917533.post3422369871776306566..comments2024-02-14T14:07:38.890+05:00Comments on Блог Александра Бындю: Принцип разделения интерфейсаAlexander Byndyuhttp://www.blogger.com/profile/14185486842573956085noreply@blogger.comBlogger17125tag:blogger.com,1999:blog-458002489272917533.post-32108806681792466752015-06-08T18:33:47.404+05:002015-06-08T18:33:47.404+05:00Согласен, хочется узнать мнение об этом методе, по...Согласен, хочется узнать мнение об этом методе, поскольку в нем я также вижу решение, но и откровенные серьезные недостатки. Сейчас я решаю эту задачу именно так, поскольку в языках, на которых сейчас работаю, нет механизма virtual в принципе, но...iFreemannoreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-85772333901900492012014-05-06T09:45:52.631+06:002014-05-06T09:45:52.631+06:00Игорь, в данный момент я бы создал два интерфейса ...Игорь, в данный момент я бы создал два интерфейса под оба метода. Есть хорошая презентация от Udi Dahan на эту тему http://www.infoq.com/presentations/Making-Roles-Explicit-Udi-DahanAlexander Byndyuhttp://www.byndyu.ru/noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-29736535165595241052014-04-30T20:07:05.032+06:002014-04-30T20:07:05.032+06:00Не думаю, что EntityAuditor должен вообще иметь ме...Не думаю, что EntityAuditor должен вообще иметь метод UpdateDuplicates... Если уж такой метод и нужен, то только для личного использования (инкапсулировать этот метод в, реализующем интерфейс EntityAuditor, классе), что, как по-мне, может нарушить SRP и OCP. Может быть лучше вообще создать отдельный интерфейс DuplicatesUpdater?Igor Rastvorovnoreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-27428496260889130142012-06-10T02:41:58.144+06:002012-06-10T02:41:58.144+06:00Хотя стоп: это ж не метод интерфейса класса, это ж...Хотя стоп: это ж не метод интерфейса класса, это же защищённый шаблонный метод - при чём тут LSP =)Herman Starzhynskihttp://twitter.com/nikaburunoreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-72116889916210093842012-06-10T02:40:48.182+06:002012-06-10T02:40:48.182+06:00Если обратить внимание на документик в ссылках &qu...Если обратить внимание на документик в ссылках "Роберт Мартин: The Interface Segregation Principle", то автор использует аналогичный подход. Но в последнем абзаце он указывает, что такое решение идёт в расход с LSP. Herman Starzhynskihttp://twitter.com/nikaburunoreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-33636488764436648582012-03-06T17:53:51.822+06:002012-03-06T17:53:51.822+06:00Спасибо, поправил.Спасибо, поправил.Alexander Byndyunoreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-54859462179593663662012-03-06T10:23:53.946+06:002012-03-06T10:23:53.946+06:00Здравствуйте.
Вот тут опечатка:"В данном случ...Здравствуйте.<br />Вот тут опечатка:"В данном случае проблема заключается в том, что клиентом первой функции является класс хранилища, а второй – консольное приложение:"<br /><br />Первой (IsSuitable) - консольное, второй (IsFieldChanged) - хранилищеMichael Podoplelovnoreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-4710566736274712011-08-16T10:54:32.478+06:002011-08-16T10:54:32.478+06:00@Max
> Refuse bequest можно "рефаторить&q...@Max<br /><br />> Refuse bequest можно "рефаторить", как Replase inheritance with delegation. <br /><br />Хороший вариант, спасибо.<br /><br />> Если описание интерфейса IsSuitable таки изменится, все равно придется менять все классы которые его реализовали.<br /><br />Да, классы менять в любом случае надо будет. Но только те, которые <b>на самом деле</b> должны использовать все Alexander Byndyuhttps://www.blogger.com/profile/14185486842573956085noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-44866017816923593502011-08-15T17:54:19.942+06:002011-08-15T17:54:19.942+06:00По второму примеру не понятно: Если описание инте...По второму примеру не понятно: Если описание интерфейса IsSuitable таки изменится, все равно придется менять все классы которые его реализовали.Maxhttps://www.blogger.com/profile/08920937707664718064noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-62423010095525192202011-08-15T17:34:44.859+06:002011-08-15T17:34:44.859+06:00Refuse bequest можно "рефаторить", как R...Refuse bequest можно "рефаторить", как Replase inheritance with delegation. Рассмотрено у Даниэля Арсеновски в Рефаторинге.Maxhttps://www.blogger.com/profile/08920937707664718064noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-31385375731306428212010-07-11T20:14:42.223+06:002010-07-11T20:14:42.223+06:00@Idsa
Описание Игоря Тамощука - это мой второй пр...@Idsa <br />Описание Игоря Тамощука - это мой второй пример. Но для меня было важно показать и первый случай, т.к. он довольно часто выявляется в коде.<br /><br />К тому же у меня есть ссылки на первоисточники - статьи Роберта Мартина. Ты можешь найти ссылки на их в конце каждой моей статьи про SOLID.Alexander Byndyuhttps://www.blogger.com/profile/14185486842573956085noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-20110085305885766462010-07-11T17:36:00.143+06:002010-07-11T17:36:00.143+06:00Попутно прочитал описание и примеры SOLID у Игоря ...Попутно прочитал описание и примеры SOLID у Игоря Тамощука: http://igor.quatrocode.com/2008/09/solid-top-5.html (он в комментариях к одной из статей давал ссылку). И вот там принцип ISP демонстрируется способом, который я предлагал выше. Просто красота: ничего лишнего, не придраться. Хоть убей, не нравится мне твой пример: попахивает он. Я бы так не придирался, но твои статьи для многих являются Idsahttps://www.blogger.com/profile/15985124810962581978noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-36593377268990893082010-07-11T16:51:58.979+06:002010-07-11T16:51:58.979+06:00>>Если хочешь напиши статью со своими вариан...>>Если хочешь напиши статью со своими вариантами и я добавлю на нее ссылку здесь.<br /><br />Не будем множить сущности. Думаю, этих комментариев будет вполне достаточно.Idsahttps://www.blogger.com/profile/15985124810962581978noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-87496236934865215752010-07-11T12:06:23.882+06:002010-07-11T12:06:23.882+06:00@Idsa
Идеальной системы не бывает, сначала она дол...@Idsa<br />Идеальной системы не бывает, сначала она должна была быть абстрактной. В ходе появления других наследников стало видно, что это не так.<br /><br />> Так нужен ли он им?<br />Зависит от того сколько будет других наследников, которым не нужен. Если много, то твой надо использовать твой подход.<br /><br />> А что если бы у метода UpdateDuplicates было возвращаемое значение?<br />Alexander Byndyuhttps://www.blogger.com/profile/14185486842573956085noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-85500386463946979232010-07-10T20:25:38.048+06:002010-07-10T20:25:38.048+06:00>>Они его не переопределяют, это не значит, ...>>Они его не переопределяют, это не значит, что он им не нужен.<br /><br />Тогда очень странно, что в первоначальном дизайне функция была абстрактной.<br /><br />Ну если они его не переопределяют, но он им нужен, то они получат ничего не делающий метод. Так нужен ли он им?<br /><br />>>Да, как вариант. Опять же зависит от конкретного случая. В нашем случае это был бы лишний класс.<br Idsahttps://www.blogger.com/profile/15985124810962581978noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-41571108353472037902010-07-10T08:53:37.878+06:002010-07-10T08:53:37.878+06:00@Idsa
> Что делать, если UpdateDuplicates был ...@Idsa <br />> Что делать, если UpdateDuplicates был бы частью интерфейса, а не абстрактного класса?<br />Он же таковым не является.<br /><br />> Наследники будут видеть метод, который им не нужен. Пусть это и не публичный интерфейс, но все равно нехорошо<br />Они его не переопределяют, это не значит, что он им не нужен.<br /><br />> Мне кажется более правильным решением было бы Alexander Byndyuhttps://www.blogger.com/profile/14185486842573956085noreply@blogger.comtag:blogger.com,1999:blog-458002489272917533.post-92193536920295682972010-07-09T16:08:57.997+06:002010-07-09T16:08:57.997+06:00Меня смутило решение, предлагаемое тобой в главе &...Меня смутило решение, предлагаемое тобой в главе "Лишняя абстракция в наследовании". Я вижу два недостатка у решения "заменить abstract на virtual":<br />1. Что делать, если UpdateDuplicates был бы частью интерфейса, а не абстрактного класса?<br />2. Наследники будут видеть метод, который им не нужен. Пусть это и не публичный интерфейс, но все равно нехорошо<br /><br />Мне Idsahttps://www.blogger.com/profile/15985124810962581978noreply@blogger.com