Подтвердить что ты не робот

Как объяснить развязку и информацию, скрывающуюся от нового программиста?

Как объяснить развязку связи и информацию, скрывающуюся от нового программиста? У меня есть программист, над которым я пишу проекты, но которые, похоже, не понимают концепций свободного сцепления и скрытия информации.

Я пишу проекты со всем, что красиво разбито на классы по функциям (доступ к данным является отдельным, класс для запросов, контроллер, всего около 5 классов). Они возвращаются с модифицированным дизайном, где половина классов наследуется от другой половины (и нет отношения "is-a" ) и многих общедоступных переменных.

Как я могу понять, что сохранение отдельных элементов упрощает обслуживание?

4b9b3361

Ответ 1

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

Следующее изображение довольно хорошо объясняет необходимость свободной связи:

Dependency Inversion Principle: Would You Solder A Lamp Directly To The Electrical Wiring In A Wall?

Попытайтесь придумать такие вещи, которые будут развлекать и относиться к вашему новому программисту.

Ответ 2

Спросите его, неплохо ли позволить вам одолжить 10 долларов США, отдав ему кошелек на мгновение и взяв деньги сами.

Ответ 3

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

Вы ищете ярлык. Вы хотите, чтобы разработчик испытал "ahah!". момент и внезапно увидеть мудрость в вашем дизайне. Я говорю, не задерживайте дыхание.

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

В стороне - я замечаю, что люди ищут эти ярлыки все время с абстрактными навыками, но не с более "физическими" навыками. Возьмите, к примеру, теннис. Если бы вы были тренером по теннису, и новый игрок долгое время бил свои удары, вы бы просто не показывали ему видео на YouTube с доспеха Роджера Федерера и ожидали, что он "получит". Отличный forehand принимает YEARS опыта, когда вы изучаете это чувство и используете его в разных сценариях - это не ваши мышцы, их мозг. Это ничем не отличается от разработки программного обеспечения. Вы хорошо себя чувствуете, делая это снова и снова. Вы медленно учитесь на своих ошибках и лучше оцениваете последствия каждого индивидуального дизайнерского решения.

Ответ 4

Теория доведёт вас до сих пор.

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

Он, безусловно, поймет преимущества написания хорошего кода.

Ответ 5

Нет ничего похожего на физическую аналогию. Выйдите на свой автомобиль и укажите, как все сложное, горячее и опасное довольно хорошо изолировано от хрупкого человека. Сядьте в сиденье водителя и укажите некоторые важные датчики; например, температуры охлаждающей жидкости, тахометра и спидометра. Обратите внимание на то, как датчики удивительно похожи: все они берут скалярное значение (откуда-то) и представляют его, перемещая иглу в положение между min и max.

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

  • "Как бы вы хотели измерить температуру охлаждающей жидкости? Посмотрите на датчик или приложите палец к почти кипящей жидкости?"

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

  • "Как бы вы хотели измерить скорость автомобиля? Посмотрите на датчик или перетащив ногу на землю, когда вы ревеете по шоссе?"

Оттуда вы можете опираться на понятия "ваш датчик температуры охлаждающей жидкости is-a, он не является кипящей жидкостью" и т.д. более сложные понятия.

Ответ 6

alt text

  • Свободная муфта: Части часов могут быть заменены другими, нарушая все часы. Например, вы можете удалить одну руку, и она все равно будет работать.

  • Скрытие информации: Часовые стрелки не знают, что за ними есть машина.

Дополнительная концепция

  • Высокая степень сцепления: Все элементы в модуле часов тесно связаны. В этом конкретном сценарии батарея будет принадлежать другому модулю или пространству имен.

Ответ 7

Покажите ему эту презентацию. Хотя это в основном о DI, это просто великолепно и до предела.

Ответ 8

Я бы попробовал сесть с ним и проработать пару кусочков кода с ним, глядя на твой трюк, и вы объясните, почему вы делаете то, что делаете по ходу дела. Я нашел, что это, как правило, лучший способ объяснить вещи.

Ответ 9

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

Если он жалуется, скажите ему правду: бизнес попросит более причудливые изменения, это вопрос времени, который он увидит.

Ответ 10

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

Учитывая вашу ситуацию, вот что я хотел бы предложить:
1. Сделайте так, чтобы они точно соответствовали вашему дизайну (по крайней мере, на пару недель). Если они хотят отклониться, попросите их обсудить, что и почему с вами. [Ограничения по времени могут не допускать этого]. 2. Сядьте с ними в зависимости от того, какую часть дизайна вы делаете дальше, и объясните им некоторые варианты дизайна, с примерами. Возможно, вам понадобятся то, что очевидно для вас. 3. Будьте в поиске примеров, как хорошего дизайна, так и плохого дизайна, и покажите им, как это работает лучше.

Самая важная задача здесь - делегирование. Вы должны показать им, какой хороший код выглядит, может быть, обучить их пару часов. Затем вы соглашаетесь на то, когда следует пересматривать и как вы можете им помочь (в свободное от работы время (?)) Хорошо выполняют эту задачу. Главное - заставить их идентифицировать и понять хороший дизайн. Выполнение этих вещей поможет им "купить" в дизайне. Как только они почувствуют, что это их дизайн, я уверен, что они будут лучше работать.

В целом, я думаю, вам нужно положить свою ногу и заставить их правильно закодировать ее, не удушая их творчества.

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

Примечание
Я хотел бы добавить, что концепции OO можно изучать из книг, в то время как их применение может быть изучено только на практике. Я добавил эту заметку в ответ на комментарий Кристофера У. Аллена-Пула.

Ответ 11

Просто не разговаривай с ним. Это должно научить его скрывать информацию.; -)

Ответ 12

Мне нравится кредитная карта для примера.

У вас есть кредитная карта. Кредитная карта представляет вашу кредитную историю. Он имеет баланс и APR. Он имеет разрешения и полное финансовое состояние. Он имеет идентификатор, дату истечения срока действия и код безопасности. Магнитная полоса суммирует все это.

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

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

Ответ 13

Если он неверно истолковал ваши проекты, возможно, пару пар-программных сессий будет достаточно, чтобы заставить их двигаться вперед. Мне нужно согласиться с @ThomasD и расширить его - инкапсуляция, которая здесь происходит, может быть вами. Это может быть простой случай неправильной интерпретации вместо того, чтобы не понимать понятия.

Ответ 14

Ну, если вам нужно объяснить это им, то я вынужден спросить: действительно ли они программист?

Скажите им, что им нужен "колледж"?

Это сложно, потому что это такая базовая концепция. Лично я бы не хотел обращаться с ним, потому что ему нравится, когда кому-то платят за то, что он должен знать, но жизнь не всегда идеальна.

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

Наследование не может быть причиной их наследования. Они, возможно, узнали в курсе, разработанном в 90-х годах, который заперт в идее, что "все должно наследовать". Я помню, как старые примеры менеджера расширяют Employee. Это просто ПЛОХО. Дело в том, что люди учат этой глупости. Тем не менее.

Для С++ Скотта Мейера Эффективная серия С++, вероятно, стоит их зачислять (если они могут быть потрудились прочитать что-то). Для Java, Josh Bloch Эффективная Java ( "композиция одобрения" ) идет по тем же направлениям. Не уверен в С#.

Эти типы книг дают лучший подход к наследованию и составу, а также дают хорошие примеры того, почему наследование (как говорит Джош Блох) представляет собой "деталь реализации". Я также слышал, как он описывается как "наследование прерывает инкапсуляцию".

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

Ответ 15

Если вы выполняете Unit Testing, объясните это с точки зрения написания теста. В качестве альтернативы, абстрактные классы и интерфейсы используют свободную связь и информацию, спрятавшуюся с большим эффектом. Если вы объясните это ему с точки зрения других понятий, с которыми он может уже справиться, он будет скорее оценивать концепцию быстро.

Ответ 17

Программы представляют собой системы взаимодействующих частей.

Для взаимодействия системы взаимодействующих частей необходимы связи между этими частями.

Чем больше соединений, тем дороже программа.

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

Необработанные соединения могут быть сформированы только в системе, чьи части необоснованно связаны с соединениями из других частей.

Сведение к минимуму ненужного воздействия деталей на соединение с другими частями имеет основополагающее значение для разработки экономичных программ.

Свободное связывание и скрытие информации - это основа минимизации связи.

Это не факультативное знание для программиста.

Это фундаментально.

Вы не можете быть экономичным программником без этих знаний.

Вопрос о том, как объяснить расплывчатую связь и информацию, скрывающуюся перед новым программистом, - это как спросить, как объяснить операцию новому хирургу? Или объяснить архитектуру новому архитектору? Или как объяснить полет пилоту.

Если ваши "Новые программисты" не знают, что скрывают связь и скрывают информацию, то это не "Новые программисты"; они являются потенциальными программистами.

Любопытно, что, вероятно, это не поможет им прочитать оригинальные две статьи: i) Свободное соединение: "Структурированный дизайн", W.P. Стивенс, Дж. Дж. Майерс и Л. Л. Константин. ii) Скрытие информации: http://www.cs.umd.edu/class/spring2003/cmsc838p/Design/criteria.pdf

Ответ 18

Так же, как переход от приложений с 16-битным до 32-битных окон, где процессам было предоставлено собственное адресное пространство. Это остановило любой другой процесс от возможности убить ваше приложение, когда оно "случайно" прошло через ваши данные.

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

Ответ 19

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