Я младший разработчик среди пожилых людей и боролся много с понимания их мышления, рассуждения.
Я читаю домен-управляемая конструкция (ДДД) и может'т понять, почему мы должны создать столько классов. Если мы будем следовать, что метод проектирования программного обеспечения мы в конечном итоге с 20-30-классы, которые могут быть заменены не более двух файлов и 3-4 функции. Да, это может быть сумбурно, но это's большое более ремонтопригодны и читаемым.
В любое время я хочу увидеть, что какой-то EntityTransformationServiceImpl
нет, я должен следовать множество классов, интерфейсов, их функции, конструкторы, их создания и так далее.
Простая математика:
Все говорят, что это'ы легко для поддержания, но для чего? Каждый раз, когда вы добавляете новую функциональность, вы добавляете еще пять классов с фабрик, учреждений, услуг и ценностей. Мне кажется, этот вид движется код намного медленнее, чем грязный код.
Позвольте'ы сказать, если ты пишешь 50к грязный код Loc в один месяц, ДДД вещь требует много комментариев и изменений (я не против тестов в обоих случаях). Одно простое дополнение может занять недели, если не больше.
В один год, вы пишете много грязный код, а может даже переписать его несколько раз, но с DDD стиль, вы до сих пор не имеют достаточно возможностей, чтобы конкурировать с грязный код.
Пожалуйста, объясните. Зачем нам нужен этот ДДД стиль и много моделей?
УПД 1: я получил так много замечательных ответов, ребята, можете, пожалуйста, добавить комментарий где нибудь или редактировать свой ответ со ссылкой на список для чтения (не знаю из чего начать, ДДД, шаблонов проектирования, языка UML, кода, рефакторинг, прагматичный ,... так много хороших книг), конечно, с последовательностью, так что я могу также понять и стать старшим, как некоторые из вас.
Хороший инженер понимает, что проблема оптимизации не имеет смысла без цели. Вы можете'Т просто оптимизировать, оптимизация для чего-то. Например, ваши параметры компилятора включают оптимизации для скорости и оптимизации по размеру кода; эти порой противоположные цели.
Я хотел бы сказать моей жене, что мой рабочий стол оптимизирован для добавляет. Это's просто куча, и это's очень легко чтобы добавить материал. Моя жена предпочли бы, чтобы я оптимизирован для извлечения, т. е. организованной моих вещей немного, так что я могу найти вещи. Это делает это тяжелее, конечно, добавить.
Программное обеспечение таким же образом. Можно, конечно, оптимизировать для создания продукта, сгенерировать тонну монолитного кодекс РФ как можно быстрее, не беспокоясь о его организации. Как вы уже заметили, это может быть очень, очень быстро. В качестве альтернативы можно оптимизировать для технического обслуживания-делают создание более сложно, но и вносить изменения проще и менее рискованно. То есть цель структурированный код.
Я полагаю, что успешный программный продукт будет создан только один раз, но изменен много раз. Опытные инженеры видели неструктурированных баз код взять на себя свою собственную жизнь и стать продукты, растет в размерах и сложности, пока даже небольшие изменения очень трудно сделать, не внося огромный риск. Если код был структурирован, риск можно сдержать. Именно поэтому мы идем на все эти неприятности.
Я заметил, что в своем анализе вы смотрите на количество-- количество кода, количество классов и т. д. Хотя эти вроде интересные, реальное влияние исходит из отношений между элементами, которая взрывается комбинаторно. Например, если у вас есть 10 функций и не зависит от того, какой, у вас 90 возможных связей (зависимостей) вам не придется беспокоиться о ... Каждый из десяти функций может зависеть от любого из девяти других функций, и в 9 х 10 = 90. Вы может не знать о том, какие функции изменения переменных или как данные передаются, так что кодеры есть тонны вещей, чтобы беспокоиться при решении любой конкретной проблемы. В отличие от этого, если у вас есть 30 классов, но они хитро устроены, они могут иметь всего лишь 29 отношений, например, если они слоистые или расположены в стеке.
Как это влияет на вашу команду's пропускную способность? Ну, есть меньше зависимостей, проблема гораздо сговорчивей; кодеры Дон'т приходится совмещать огромное количество вещей в их голове, когда они делают изменения. Поэтому минимизация зависимостей может быть огромный толчок к вашей способности рассуждать о проблеме со знанием дела. Именно поэтому мы делим вещи на классы или модули, и переменные как можно плотнее, и использовать твердый принципы.
Ну, во-первых, читаемость и maintability часто в глазах смотрящего.
Что читаем чтобы вы не можете быть с вашим соседом.
Ремонтопригодность часто сводится к рейтингу (как легко это поведение или концепции обнаружен в коде) и обнаруживаемость еще одна субъективная вещь.
Один из способов ДДД помогает командам разработчиков, предлагая конкретных (пока еще субъективный) способ организации понятий кода и поведения. Этот конвенции делает его легче обнаружить вещи, и поэтому легче поддерживать приложения.
Этот механизм не объективно легче поддерживать. Это, однако, намного легче поддерживать, когда все понимают, что они'вновь работает в ДДД контексте.
Классы ###
Занятия помогают с ремонтопригодность, читаемость, понятность и т. д... потому что они хорошо известны конвенции.
В ориентированных параметры объекта, классы обычно используются для группы близкородственных поведения и инкапсулировать состояние, которое должно быть тщательно контролируется.
Я знаю, это звучит очень абстрактно, но вы можете думать об этом так:
С классами, вы не'т обязательно нужно знать как код в них работает. Вы просто должны знать что этот класс отвечает за.
Классы позволяют рассуждать о вашем заявлении в части контакты между хорошо определенными компонентами.
Это снижает когнитивную нагрузку при рассуждении о том, как ваше приложение работает. Вместо того, чтобы вспомнить, что 600 строк кода выполняет, вы можете подумать о том, как 30 компонентов взаимодействовать.
И, учитывая те 30 компонентов, вероятно, пядь 3 слоя вашего приложения, вы, вероятно, только каждый должен быть рассуждения о примерно 10 компонентов одновременно.
Это кажется довольно послушными.
По сути, что вы'вновь увидев старших разработчиков сделать это:
Они нарушают работу приложения в легко рассуждать о классов.
Они потом организовать их в легко рассуждать о слои.
Они делают это потому что они знают, что, как приложение растет, она становится тяжелее и тяжелее рассуждать об этом в целом. Разбить его на слои и классы означает, что они никогда не придется рассуждать о всем приложении. Они только когда-нибудь понадобится для небольшого подмножества.
Есть много хороших точек в других ответов, но я думаю, что они пропустят или Дон'т подчеркнуть важную концептуальную ошибку:
Вы сравниваете усилия, чтобы понять полную программу.
Это не выполнимая задача с большинством программ. Даже простые программы состоят из кода так много, что просто невозможно управлять все это в голове в любой момент времени. Ваш единственный шанс-найти ту часть программы, которая имеет отношение к задаче (исправление ошибок, внедрение новых функций) и работать с этим.
Если ваша программа состоит из огромного функций/методов/классов это практически невозможно. Вы'll должны понимать сотни строк кода, только чтобы решить, если этот кусок кода имеет отношение к вашей проблеме. С оценками ты дал ему становится легко потратить неделю только, чтобы найти кусок кода, Вы должны работать на.
Сравните это с базы кода с малой функции/методы/классы названы и организованы в пакеты и пространства имен, что делает его очевидным, где искать/ставить определенный элемент логики. Когда все сделано правильно во многих случаях вы можете прыгать прямо в нужное место, чтобы решить вашу проблему, или хотя бы в место, откуда стреляют вверх ваш отладчик привезет вас в нужное место в несколько прыжков.
Я работал в обоих видов систем. Разница легко может быть на два порядка производительность сопоставима задачи и сопоставимого размера системы.
Как это влияет на другие виды деятельности:
и GT; Пожалуйста, объясните мне, зачем нужен этот ДДД стиле, много моделей?
Во-первых, обратите внимание: важной частью ДДД не patterns, но и выравнивание усилий в области развития бизнеса. Грег Янг отметил, что глав в "Синей книге" в [так][1].
Но на ваш конкретный вопрос: там, как правило, намного больше классов, чем можно было ожидать, (а) потому, что предпринимаются усилия, чтобы отличить домен поведение от водопроводным и (Б) потому что дополнительные усилия, чтобы гарантировать, что понятия в доменной модели выражены в явном виде.
Тупо, если у вас есть два разных понятия в домен, то они должны быть различны в модели, даже если они одинаковые в representation_ памяти.
По сути, вы создаете язык предметной области, которая описывает вашу модель в язык бизнеса, что специалист должен уметь смотреть на него и обнаружить ошибки.
Кроме того, можно увидеть немного больше внимания уделено разделение интересов; и понятие изолируя потребителей определенные возможности от подробностей реализации. См. Л. Д. Парнас. Четкие границы позволяют вам изменить или продлить срок реализации без эффектов ряби на протяжении всего решения.
Мотивация здесь: для приложения, которое является частью ключевой компетенции бизнеса (то место, где он получает конкурентное преимущество), вы хотите, чтобы иметь возможность легко и недорого заменить поведение домен лучший вариант. По сути, у вас есть частями программы, что вы хотите развиваться быстро (как состояние развивается во времени), и другие части, которые вы хотите изменить медленно (как состояние сохраняется); дополнительные слои абстракции помочь избежать непреднамеренного сцепления друг с другом.
Справедливости ради: некоторые из них также объектно-ориентированное повреждения головного мозга. Шаблоны первоначально описаны Эванс основаны на Java-проектах, что он участвовал в 15+ лет назад; состояние и поведение тесно связаны между собой, в том стиле, который приводит к осложнений можно избежать; см. восприятия и действия Стюарт Хэлоуэй, или встраивание код Джон Кармак.
неважно, на каком языке вы работаете, программирование в функциональном стиле предоставляет льготы. Вы должны сделать это всякий раз, когда это удобно, и вам следует задуматься о решении, когда это'т удобный. Кармак, 2012
<Н3> потому что тестирование кода труднее, чем писать код </Н3>
Много ответов дали хорошие рассуждения от застройщика'с точки зрения - что ремонт может быть уменьшена, за счет делать код более напряженной писать в первую очередь.
Однако, есть еще один аспект для рассмотрения - тестирование может быть только мелкозернистые, как ваш оригинальный код.
Если вы пишете все в монолите, единственный эффективный тест вы можете написать на "с учетом этих данных, является выход правильный?&и". Это означает, что любые найденные ошибки, относятся к "и где-то в этой огромной куче кода и".
Конечно, потом вы можете у разработчика сидеть с отладчиком и найти, где именно проблема появилась, и работать на исправление. Это отнимает много ресурсов, и это плохо использовать разработчика's время. Представьте себе, что когда-нибудь незначительная ошибка у вас, приводит к разработчику необходимости повторной отладки всей программы.
Решение: множество небольших тестов, выявить один конкретный, потенциальный отказ каждого.
Эти небольшие тесты (например, тесты), преимущество проверки определенном участке кода, и помогает найти ошибки в ограниченных пределах. Это не только ускоряет отладку, если тест не пройден, но также означает, что если все ваши маленькие тесты - вы можете легко найти провал в крупных испытаниях (т. е. если это's не в конкретной тестируемой функции, она должна быть во взаимодействии между ними).
Как должно быть понятно, чтобы меньше тестов означает, что ваш код должен быть разделен на более мелкие куски тестирования. Способ сделать это, на большой торговой базой, часто приводят в коде, который выглядит как то, что вы'вновь работать.
Просто как побочный Примечание: это'т сказать, что люди выиграли'т принять все, что "слишком далеко" по. Но есть законные основания для разделения сборок на более мелкие/менее связные части - если все сделано с умом.
и GT; Пожалуйста, объясните мне, зачем нужен этот ДДД стиле, много моделей?
Многие (большинство...) мы действительно Дон'т нужно их. Теоретики и весьма продвинутых, опытных программистов писать книги о теории и методологии в результате многих исследований и их глубокий опыт - это не'т имею в виду, что все они пишут применимо к каждый программист в своей повседневной практике.
В качестве младшего разработчика, это's хорошо, чтобы читать такие книги, как тот, который вы упомянули, чтобы расширить свои перспективы, и сделать вас в курсе некоторых вопросов. Она также будет спасти вас от получения смущена и сбита с толку, когда ваши старшие коллеги используют термины вам незнакомы. Если вы найдете что-то очень сложно и не'т, кажется, смысла или кажется полезным, Дон'т убить себя за это - просто сохраните его в вашей голове, что есть такая концепция или подход.
В вашей повседневной развития, если вы ученый, ваша задача найти работоспособный, ремонтопригодный решения. Если идеи вы найдете в книге Дон'т помочь вам достичь этой цели, затем Дон'т беспокоиться об этом прямо сейчас, пока ваша работа признана удовлетворительной.
Там может наступить время, когда вы'll узнайте, что вы можете использовать некоторые из того, что вы читали о, но я'т достаточно, что "вам" сначала, а может и нет.
Как ваш вопрос охватывает много земли, много предположений, я'МР выделить тему вашего вопроса:
зачем нам нужно так много классов в шаблоны проектирования
Мы не. Существует общепринятое правило, которое говорит, что должно быть много классов в шаблоны проектирования.
Существует два основных руководствах для принятия решения, куда поставить код, и как сократить ваши задачи в разных единицах код:
Зачем эти двое быть важно?
Эти два аспекта являются основой и"водителей" и для любого выбора ", где поставить то, что" в любом языке программирования, и любые парадигмы (не только ОО). Не все явно осведомлены о них, и нужно время, часто годы, чтобы получить действительно въелась, автоматическое чувство о том, как эти влияния программного обеспечения.
Очевидно, эти два понятия вообще ничего вам не рассказывал о том, что вообще-то делать. Некоторые люди допускают ошибку на стороне слишком много, другие на стороне слишком мало. Некоторые языки (глядя на вас здесь, Ява) предпочитают многие классы из-за крайне статические и педантичный характер самого языка (это не утверждение ценности, но что есть, то есть). Это становится особенно заметным, если сравнить его с динамичной и более выразительных языках, например, рубиновым.
Другой аспект заключается в том, что некоторые люди подписаться на гибкий подход только написание кода, который надо сейчас, и рефакторинг сильно позже, при необходимости. В этот стиль развития, вы бы не создать "интерфейс", когда у вас есть только один класс реализации. Вы бы просто реализовать конкретный класс. Если позже, вам нужен второй класс, вы бы рефакторинг.
Некоторые люди просто не работает таким образом. Они создают интерфейсов (или, более общо, абстрактные базовые классы) за все, что когда-либо могут быть использованы вообще; это может быстро привести к взрыву класс.
Опять же, есть аргументы за и против, и не важно, что я, или вы, предпочитаете. Вы, в вашей жизни, как разработчик программного обеспечения, сталкиваются все крайности, от длинных спагетти методов, с помощью просвещенной, просто-большой-достаточно класса, конструкции, вплоть до невероятно взорванные класс схемы, что значительно помогает вынести высокие. Как вы становитесь более опытными, вы будете расти больше в "деятельность" по ролям, а могут начать влиять на этого в направлении, куда вы хотите. Вы найдете золотую середину для себя, и вы все равно найдете, что многие люди будут не согласны с вами, что бы вы ни делали.
Следовательно, непредвзято-это самый важный момент, здесь, и это будет мой главный вам совет, видя, что вы выглядите гораздо в боль о проблеме, судя по остальной части вашего вопроса...
Опытные шифровальщики научились:
Ответы до сих пор, все у них хорошо, начав с разумного предположения, что Аскер не хватает чего-то, что автор вопроса признает. Это's также возможно, что автор вопроса в принципе, все верно, и это's стоит обсуждать, как эта ситуация может произойти.
Опыт и практика являются мощной, и если выпускники имеют опыт работы в крупных комплексных проектах, где единственный способ держать ситуацию под контролем с большим количеством EntityTransformationServiceImpl
's, затем они становятся быстрой и комфортной с рисунком дизайн и тщательное соблюдение ДДД. Они будут гораздо менее эффективны, используя упрощенный подход, даже для небольших программ. Как странно одно, вы должны приспособиться, и это будет большой опыт.
Хотя адаптация, вы должны принять это как урок в балансе между глубоко изучать один подход, к точке, вы можете заставить его работать в любом месте, против оставаться универсальным и зная, какие инструменты доступны, не обязательно быть специалистом в какой-либо из них. Есть преимущества для обоих и оба необходимы в мире.
Что делает еще и функцию класса как в использовании будет отличным подход к решению проблемы в конкретном порядке, что поможет в будущем решить любые вопросы.
Несколько классов помочь выявить как их основной работы, и любой класс может быть вызван в любое время.
Однако если вы много классов и функций из названия, доступность их в удобном для вызова и управления. Это называется Чистый код.