singalen: (Default)
[personal profile] singalen
Коля Голубев ([livejournal.com profile] nickolaygolubev) и Вова Байда ([livejournal.com profile] vbayba) продолжают потихоньку ковырять Python, в отличие от меня.
Оказывается, дельфин и не рыба вовсе там метод __init__ - не конструктор, а нечто, что вызывается "после коструирования" пустого объекта. Разница, как на меня, отсутствует. Тем более что только __init__ создаёт все поля класса.
Это значит, если вы хотите пронаследоваться от другого класса, нужно вызвать его __init__ из своего. А последнее значит, что конструктор вашего класса может сам выбирать, от какого класса ему наследоваться. Забавно, factory прямо в конструкторе.

Недавно думал, по какой книжке учить студентов ООП. И обнаружил, что не знаю.
Да, "Рефакторинг" содержит много хороших и вдохновляющих идей, но они там размазаны.
Буч слишком толстый, на C++, да его и не рекомендовал [livejournal.com profile] alf_kadett. Рекомендовал Бадда, видимо, "An Introduction to Object-Oriented Programming".
Программу по ООП отлично составил Богдан Пришедько. Он взял:
  • описание АТД
  • естественно, три кита - инкапсуляцию, наследование, полиморфизм... кстати, а кто выделил именно эти три? Я не нашёл;
  • coupling and cohencion;
  • семь приципов: Open Closed (откуда бишь это?), Liskov substitution, Dependency Inversion, Interface Segregation, Composite Reuse, Least Knowledge
  • признаки "вони" кода у Фаулера;
  • Рекомендации по АТД и проектироваанию классов у МакКоннелла;
Получилось хорошо.
Сергей ([livejournal.com profile] salpaev) сказал, что Буч действительно плох.
Рекомендовал:
  • Rebecca Wirfs-Brok: "Designing Object-Oriented Software" - у неё он нашёл объяснения многим своим, как он когда-то считал, неправльным решениям - data object, stateless objects, объекты-методы и т.п. Она же критикует design patterns, например, рассматривает случаи, когда вроде бы под ситуацию неплохо подходит паттерн из GoF, а если подумать - получается совсем другой дизайн. Ну, в последний случай я не очень верю, думаю, если присмотреться, там будет либо не очень паттерновая ситуация, либо новое решение тоже окажется паттерном :)
  • Лармана - "Applying UML and design patterns", только не 3е издание, а раньше. В 3м тот приплёл буззворды вроде "agile development", что не пошло книге на пользу;
  • DDD - Domain-driven design Эванса, в обязательном порядке;
  • Майерс "Effective C++" тоже сильно помог понять ООП, показал много новых приёмов типа двойной диспетчеризации.

Сергей же снова вернулся к скриптовым языкам и сказал, что без IDE с code completion и рефакторинга хотя бы на уровне move method порог изучения языка гораздо выше. Он бы выучил Ruby, если бы не приходилось каждый раз лазить в доку, чтобы узнать, какие методы есть в классе Array или HashTable.
И сделал вывод, что нас ждёт нашествие блондинок со знанием C#.

(no subject)

24/5/07 16:15 (UTC)
Posted by [identity profile] voidbent.livejournal.com
Composite Reuse так-же само как и ссылки в 95% случаев работает а в остальных 5% случаях приводит к фатальным ошибкам (в случае со ссылками это были фатальные ошибки работы с памятью а в этом случае это будут фатальные ошибки дизайна. Научив молодых этому правилу ты задолбёшся после них код рефакторить убирая агрегацию квадратом фигуры). Это происходит из за того, что решения относительно агрегации и наследования должны приниматься на основании объектно-ориентированного анализа, а не на основании правила которое говорит что агрегацию нужно применять везде где только можно.

Кстати ещё из этой оперы правило: "используйте интерфейсы вместо абстрактных классов, где возможно"

(no subject)

24/5/07 16:26 (UTC)
Posted by [identity profile] voidbent.livejournal.com
Фатальная ошибка дизайна в моём коменте выше - в каком-то public API сделать агрегацию квадратом фигуры думаю будет вполне фатально.
Менее фатальные ошибки - вместо наследующих друг-друга интерфейсов будут появлятся агрегирующие друг-друга классы с setter\getter-ами.

> И в идеале - ссылку на хотя бы одну методику объектно-ориентированного анализа, если ты не веришь перечисленным источникам.

Не надо "давить авторитетом". Покажи мне в этих источниках цитату в которой сказано что агрегацию надо использовать вместо наследования везде где только можно?

(no subject)

25/5/07 13:09 (UTC)
Posted by [identity profile] voidbent.livejournal.com
"Это подводит нас ко второму правилу объектно-ориентированного проектирования: предпочитайте композицию наследованию класса."

а тем более "С помощью делегирования композицию можно сделать столь же мощным инструментом повторного использования, сколь и наследование"

и

"Заменяйте наследование агрегацией, где можно"

Это абсолютно разные вещи. Против правила в формулировке ГоФ я ничего против не имею.

(no subject)

25/5/07 13:15 (UTC)
Posted by [identity profile] voidbent.livejournal.com
Сразу поясню что-бы не возникало больше вопросов:

1. "Предпочитайте X Yу" подразумевает при прочих равных условиях.

2. "Заменяйте X на Y, где можно" подразумевает что даже если в контексте более уместным будет использование X, и в сторону использования X больше аргументов "за", но есть хоть небольшая возможность или намёк на то что-бы использовать Y - то надо использовать Y.

"Заменяйте X на Y, где можно" более сильное правило чем "Предпочитайте X Yу".

+ Я так понимаю ГоФ сперва как я уже и говорил сначала объяснили контекст "где можно", а уже потом дали правило предпочтения.

(no subject)

29/5/07 07:08 (UTC)
Posted by [identity profile] voidbent.livejournal.com
Проблема в самой форме "Заменяйте X на Y, где можно". Проблема, потому что не ясно "где можно".

Смотри. Обратная сторона медали. В С++ friend-ы совсем негодная технология. В этом случае правило будет звучать так: "Заменяйте friend-ы паттерном visitor везде" (или для мастеров ДАО - "... везде где вам не лень"). В этом случае visitor будет всегда предпочтительнее friend, но опять в правиле нету "..., где можно". Если-бы он там был то новички подумали бы "я не знаю что такое visitor значит в этом конкретном случае на friend его заменить нельзя. Буду использовать friend а если меня наругают, скажу что это именно тот случай когда нужен friend а не visitor". Так собственно говоря было и с макросами.

(no subject)

29/5/07 07:03 (UTC)
Posted by [identity profile] voidbent.livejournal.com
Нет, не устроит :)

Во первых не надо списывать со счетов рефакторинг. Если наследование в коде "не на своём месте" и по логике вместо него должна быть агрегация, то такое наслодавние надо именно заменить агрегацией.

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

В итоге "выбирайте" ещё более плохое правило чем "заменяйте"