лучший способ «представить» OOP / OOD команде опытных инженеров C ++

17

Я ищу эффективный способ, который также не кажется оскорбительным, чтобы представить концепции ООП существующим членам команды? Мои товарищи по команде не новички в ОО языках. Мы давно занимаемся C ++ / C #, поэтому сама технология знакома.

Тем не менее, я смотрю по сторонам и без особых усилий (в основном в форме обзоров кода), кажется, что мы производим код C, который оказывается внутри классов. Практически не используется принцип единой ответственности, абстракции или попытки свести к минимуму связь, это лишь некоторые из них. Я видел классы, у которых нет конструктора, но они устанавливают memset в 0 каждый раз, когда они создаются.

Но каждый раз, когда я поднимаю ООП, все всегда кивают и создают впечатление, что они точно знают, о чем я говорю. Знание концепций - это хорошо, но нам (некоторым больше, чем другим), кажется, очень трудно применять их, когда дело доходит до выполнения реальной работы.

Проверки кода были очень полезны, но проблема с проверками кода заключается в том, что они происходят только после факта, поэтому некоторым кажется, что в конечном итоге мы переписываем (это в основном рефакторинг, но все еще занимает много времени) код, который был только что написан. Также обзоры кода дают обратную связь только отдельному инженеру, а не всей команде.

Я играю с идеей сделать презентацию (или серию) и пытаюсь снова вызвать ООП вместе с некоторыми примерами существующего кода, который мог бы быть написан лучше и мог бы быть реорганизован. Я мог бы использовать несколько действительно старых проектов, которые больше никому не принадлежат, поэтому, по крайней мере, эта часть не должна быть деликатной проблемой. Однако будет ли это работать? Как я уже сказал, большинство людей давно занимались С ++, поэтому я думаю, что а) они будут сидеть и думать, почему я рассказываю им то, что они уже знают, или б) они могут воспринимать это как оскорбление, потому что я говоря им, что они не знают, как выполнять работу, которую они делали годами, если не десятилетиями.

Есть ли другой подход, который бы охватил более широкую аудиторию, чем обзор кода, но в то же время не показался бы лекцией о наказании?

Я не новичок в колледже, у которого утопические идеалы идеально разработанного кода, и я ни от кого этого не ожидаю. Причина, по которой я пишу это, заключается в том, что я только что сделал обзор человека, который действительно имел приличный дизайн высокого уровня на бумаге. Однако, если вы представляете классы: A -> B -> C -> D, в коде B, C и D все реализуют почти один и тот же общедоступный интерфейс, а B / C имеют одну линейную функцию, так что самый верхний класс A выполняет абсолютно вся работа (вплоть до управления памятью, разбора строк, согласования настроек ...) в основном с помощью 4-х монго-методов и, для всех целей и задач, вызывает почти непосредственно в D.

Обновление: я технический руководитель (на этой должности 6 месяцев) и имею полную поддержку менеджера группы. Мы работаем над очень зрелым продуктом, и затраты на техническое обслуживание, безусловно, дают о себе знать.

DXM
источник
Возможный дубликат - programmers.stackexchange.com/questions/67579
ChrisF
3
Вы их руководитель или начальник? Если нет, то пользуетесь ли вы поддержкой технического директора, который является главой всех вас? Если вы один из тех, кто занимается разработкой, и в течение многих лет разработка была устойчивой и продуктивной без использования глубоких ООП-проектов, то вам предстоит непростая битва, чтобы убедить программистов в том, что работающий код не работает, а управление не тратится впустую. деньги лучше потратить на генерацию кода.
Патрик Хьюз
После того, как я сделал это сообщение, всплыла связанная ссылка, которая очень напоминает мою ситуацию: programmers.stackexchange.com/questions/43214/… . Я беспокоюсь о том же самом. Проблема в том, что в их команде было 2 разработчика, и я определенно мог справиться с этим с помощью анализа кода. Я ищу подход, который бы работал с нашей командой (10+), но я просто не могу общаться с каждым разработчиком один на один столько, сколько хотел бы.
ДХМ

Ответы:

5

Почему бы вам не разработать краткий тренинг по принципам SOLID и не дать им этот тренинг? Похоже, в моей нынешней организации мне это очень помогло, и я считаю, что короткие тренинги - это действительно весело (для всех, кто в них участвует).

Когда я давал свое обучение, я потратил некоторое время на поиск патологических «плохих» примеров в существующем коде (различных проектов) и рефакторинг их в презентации, шаг за шагом, используя принципы. Это продемонстрировало, что

  1. Это не так сложно сделать эти рефакторинги
  2. Это не займет много времени
  3. Конечный результат (тщательно подобранный ;-)) явно лучше исходного кода.
Йорис Тиммерманс
источник
5

Проверки кода были очень полезны, но проблема с проверками кода заключается в том, что они происходят только после факта.

По одному проекту мы делали дизайн обзоры.

15 минут. На белой доске. Обсудите дизайн до кодирования.

Самая важная часть - планирование обзора проекта до начала любой работы по внедрению.

У нас также были «Критические Обзоры Дизайна», которые были большой, потной сделкой. Они включали много документов и длинную презентацию. Их было сложно запланировать, и почти всегда их выталкивали до начала кодирования, что сводило их ценность к нулю.

Неформальные проверки проекта - до кодирования - без давления - без документации - позволяют лучше обсудить, как распределяются обязанности и как объекты будут взаимодействовать.

С. Лотт
источник
да, мы уже делаем дизайнерские обзоры именно так, как вы их описали. Проблема в задачах среднего размера. Если задача достаточно большая, я обычно беру время, чтобы придумать начальную диаграмму классов, которая затем уточняется командой. Если задача небольшая, то существующий дизайн высокого уровня уже достаточно хорош. Тем не менее, для задач среднего размера у меня недостаточно возможностей, чтобы продумать дизайн, поэтому основное правило - «руководствуйтесь здравым смыслом и следуйте ООП». Если бы я сам должен был выполнить эти задачи, я бы начал с кодирования и смешивал их с непрерывным рефакторингом и ...
ДХМ
... пусть код решит, как будет выглядеть окончательный дизайн. Однако, когда я оставляю эти задачи на усмотрение некоторых членов команды, то, что я иногда нахожу в обзоре кода, - это то, что я описал в своем первоначальном посте.
ДХМ
1
@DXM: что? Ты делаешь их? Или не делать их? Если большой, то вы не делаете обзоры дизайна - вы делаете дизайн для кого-то еще - кто учится, когда вы делаете дизайн? Если маленький, то вы не делаете обзоры дизайна - «существующий дизайн достаточно хорош» - кто склоняется, когда вы игнорируете дизайн? Если средний, ты не занимаешься дизайном, и ты тоже не проверяешь их дизайн? Не похоже, что вы на самом деле делаете рецензии на дизайн. Почему вы говорите, что вы есть, а затем привести три примера, где вы не?
С.Лотт
@Lott: после размышлений над вашим ответом я могу сделать единственный вывод, что вы абсолютно правы. Я думаю, что я должен был сказать, что я выдвигал эту точную идею по крайней мере 8 раз, и все всегда соглашались, но да, если я оглядываюсь назад на ритм, на котором мы остановились, мы действительно ничего не делаем Я хотел бы обсудить это дальше, но моды уже привлекли меня к обсуждению на строго отвечающем за вопросы сайте. Можем ли мы перейти в чат? Я хотел бы объяснить ситуацию подробнее и, возможно, немного подумать (или кто-то еще, кто хочет присоединиться). Никогда не делал чат, вы знаете, как это работает?
ДХМ
@DXM: чат тривиален. И не слишком полезно. Если у вас есть дополнительные вопросы - более подробные, чем этот первоначальный вопрос - вам следует задать эти более подробные вопросы. В этом-то и дело. В некоторых случаях «дальнейшее обсуждение» сводится к «мне не нравится ваш ответ на мой вопрос по следующим причинам ...», что довольно глупо. Не нравится ответ просто не нравится ответ и не требует обсуждения. В некоторых случаях обсуждение сводится к тому, что «мой вопрос не расплывчат, вы просто не можете прочитать». Бесполезно, правда. Задайте свои вопросы. Как вопросы.
S.Lott
4

Я предполагаю, что вы моложе, чем некоторые разработчики, но выше в пищевой цепи.

Возможно, что «опытные инженеры» на самом деле делают правильные вещи, рискуя оказаться погрязшими в отрицательных голосах, или, поскольку это зрелый продукт, который мог существовать десятилетиями, что когда-то было правильным.

Старый код, как правило, был оптимизирован для быстрой работы на оборудовании того времени; среди прочего это означает сокращение уровней наследования и избегание вызовов функций / методов для тривиальных операций.

С годами компиляторы стали намного умнее, поэтому не все, что когда-то было правдой - например, компилятор может решить встроить небольшую функцию.

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

Фил Лелло
источник
0

Стремление к юнит-тестам со 100% -ным охватом ветвей каждого нового / измененного метода не приведет к минимизации связи между методами

Ян
источник
UT - хорошая идея, но я не уверен, что это приведет к желаемому результату. Кроме того, одним из фундаментальных принципов ОО является то, что связь между функциями неизбежна, поэтому лучше сделать это явным и сгруппировать такие связанные функции в одном классе.
MSalters
Я согласен с тем, что «связь между функциями неизбежна». Однако хороший дизайн уменьшает количество других функций, с которыми каждая функция также связана. (Класс - просто средство для этого)
Ян
0

Возможно, вы захотите забрать книгу «Шаблоны проектирования» из «Банды четырех». Это не специфично для C ++, поэтому вы не будете открыто критиковать знания ваших коллег по C ++, когда вы обращаетесь к ним. Но в то же время он затрагивает темы, которые вы считаете актуальными. Кроме того, книга широко признана актуальной, поэтому они не могут легко отклонить ее как теоретическую или непрактичную.

С другой стороны, учтите, что C ++ не является чисто ОО-языком ни в дизайне, ни на практике. Вся история конструктора / memset звучит так, что вы должны представить RAII, который вообще не является техникой ОО, но специфичен для C ++ (к сожалению - IDispose .Net показывает, что происходит, когда RAII является запоздалой мыслью). Соответствующими книгами здесь являются (Подробнее) Effective C ++ и (Подробнее) Exceptional C ++.

MSalters
источник
2
Но авторы четко заявляют, что шаблоны проектирования не являются введением в ООП / ООД в целом! Аудитория должна сначала ознакомиться с методами, предлагаемыми ООП, прежде чем погрузиться в каталог шаблонов дизайна с жестким кодом! "Head First Design Patterns" сделает хорошее представление.
Сокол
2
Из описания OP следует, что они знают OOP / OOD, они просто не используют его (возможно, из-за страха, что это будет слишком сложно), и в этом случае книга, объясняющая, почему это полезно, может мотивировать лучше, чем примеры кода.
wildpeaks
@wildpeaks: ОП говорит об обратном. Они не знают ООП / ООД. Они программируют ООП процедурно. Им нужно что-то, чтобы познакомить их с методами проектирования, и книга GoF имхо не подходит для этого сценария.
Сокол
Я имел в виду предложения But every time I bring up OOP, everyone always nods and makes it seem like they know exactly what I'm talking aboutи My teammates are not new to OO languages, но я вижу, что это действительно немного расплывчато, поскольку они могут просто лгать о том, что знают ООП, когда ОП говорит с ними об этом.
Wildpeaks
1
@MSalters - Предисловие шаблонов проектирования: «Эта книга не является введением в объектно-ориентированную технологию или дизайн. Многие книги уже хорошо справляются с этим. В этих книгах предполагается, что вы достаточно хорошо владеете хотя бы одним объектно-ориентированным языком программирования, и вы должен иметь некоторый опыт в объектно-ориентированном дизайне. " Эта книга не соответствует требованиям. Они должны прочитать некоторые вещи OOD начального уровня.
Сокол