Заметка модератора На
этот вопрос уже отправлено 17 ответов . Прежде чем опубликовать новый ответ, пожалуйста, прочитайте существующие ответы и убедитесь, что ваша точка зрения еще не покрыта должным образом.
Я следовал некоторым рекомендациям, рекомендованным в книге «Чистый код» Роберта Мартина, особенно тем, которые относятся к типу программного обеспечения, с которым я работаю, и тем, которые имеют смысл для меня (я не придерживаюсь этого как догма) ,
Однако я заметил один побочный эффект: «чистый» код, который я пишу, - это больше кода, чем если бы я не следовал некоторым методам. Конкретные методы, которые приводят к этому:
- Инкапсулирующие условия
Так что вместо
if(contact.email != null && contact.emails.contains('@')
Я мог бы написать небольшой метод, как это
private Boolean isEmailValid(String email){...}
- Замена встроенного комментария другим закрытым методом, чтобы имя метода описывало себя, а не добавляло встроенный комментарий поверх него
- У класса должна быть только одна причина для изменения
И несколько других. Дело в том, что то, что может быть методом из 30 строк, становится классом из-за крошечных методов, которые заменяют комментарии и инкапсулируют условные выражения и т. Д. Когда вы понимаете, что у вас так много методов, тогда «имеет смысл» поместите всю функциональность в один класс, тогда как на самом деле это должен был быть метод.
Я знаю, что любая практика, доведенная до крайности, может быть вредной.
Конкретный вопрос, на который я ищу ответ:
Является ли это приемлемым побочным продуктом написания чистого кода? Если да, то какие аргументы я могу использовать, чтобы оправдать тот факт, что было написано больше LOC?
Организация не заботится конкретно о большем количестве LOC, но большее количество LOC может привести к очень большим классам (которые, опять же, могут быть заменены длинным методом без набора вспомогательных функций однократного использования для удобства чтения).
Когда вы видите достаточно большой класс, создается впечатление, что класс достаточно занят, и что его ответственность окончена. Следовательно, вы можете создать больше классов для достижения других функциональных возможностей. В результате получается множество классов, каждый из которых выполняет «одну вещь» с помощью множества небольших вспомогательных методов.
Это особая проблема ... эти классы могут быть единым классом, который все еще достигает "одной вещи", без помощи множества маленьких методов. Это может быть один класс с 3 или 4 методами и некоторыми комментариями.
источник
Ответы:
Эти люди правильно определили что-то: они хотят, чтобы код был легче поддерживать. Хотя они ошиблись, предполагая, что чем меньше кода, тем легче его поддерживать.
Чтобы код был прост в обслуживании, его нужно легко изменить. Безусловно, самый простой способ получить простой в изменении код - это иметь полный набор автоматизированных тестов, которые не пройдут, если ваши изменения будут критическими. Тесты - это код, поэтому написание этих тестов приведет к расширению вашей базы кода. И это хорошо.
Во-вторых, чтобы понять, что нужно изменить, ваш код должен быть и легким для чтения, и легким для рассуждения. Очень краткий код, сжатый по размеру только для того, чтобы уменьшить счетчик строк, вряд ли будет легко читаемым. Очевидно, что необходимо достичь компромисса, так как чтение более длинного кода займет больше времени. Но если это быстрее понять, то оно того стоит. Если это не дает такой выгоды, то это многословие перестает быть выгодой. Но если более длинный код улучшает читабельность, то опять же это хорошо.
источник
Да, это приемлемый побочный продукт, и оправдание состоит в том, что теперь он структурирован так, что вам не нужно читать большую часть кода большую часть времени. Вместо того, чтобы читать функцию из 30 строк каждый раз, когда вы вносите изменение, вы читаете функцию из 5 строк, чтобы получить общий поток, и, возможно, пару вспомогательных функций, если ваше изменение касается этой области. Если ваш новый «дополнительный» класс вызван,
EmailValidator
и вы знаете, что ваша проблема не в проверке электронной почты, вы можете вообще пропустить его чтение.Также легче повторно использовать меньшие части, что имеет тенденцию уменьшать количество строк для вашей общей программы.
EmailValidator
Может использоваться повсюду. Некоторые строки кода, которые выполняют проверку электронной почты, но свернуты вместе с кодом доступа к базе данных, не могут быть повторно использованы.А затем подумайте, что нужно сделать, если когда-нибудь потребуется изменить правила проверки электронной почты, что вы бы предпочли: одно известное местоположение; или много мест, возможно, пропустив несколько?
источник
iterations < _maxIterations
в метод называетсяShouldContinueToIterate
это глупо .Известно, что Биллу Гейтсу приписывают: «Измерение прогресса в программировании с помощью строк кода похоже на измерение прогресса в самолетостроении по весу»
Я смиренно согласен с этим мнением. Это не означает, что программа должна стремиться к большему или меньшему количеству строк кода, но это не значит, что в конечном итоге необходимо создать работающую и работающую программу. Помните, что в конечном итоге причина добавления дополнительных строк кода заключается в том, что он теоретически более читабелен.
Могут возникать разногласия по поводу того, является ли конкретное изменение более или менее читабельным, но я не думаю, что вы ошибетесь, если внесете изменения в свою программу, потому что, по вашему мнению, вы делаете ее более читаемой. Например, создание выражения
isEmailValid
можно считать излишним и ненужным, особенно если оно вызывается ровно один раз классом, который его определяет. Однако я бы предпочел видетьisEmailValid
условие в, а не строку условий ANDed, при этом я должен определить, что проверяет каждое отдельное условие и почему оно проверяется.Когда вы сталкиваетесь с проблемами, вы создаете
isEmailValid
метод, который имеет побочные эффекты или проверяет что-либо, кроме электронной почты, потому что это хуже, чем просто записывать все это. Это хуже, потому что это вводит в заблуждение, и я могу пропустить ошибку из-за этого.Хотя в данном случае вы явно этого не делаете, поэтому я бы посоветовал вам продолжить, как и вы. Вы всегда должны спросить себя, легче ли читать, делая изменения, и если это ваш случай, то сделайте это!
источник
Это вопрос потери зрения на действительную цель.
Важное значение имеет снижение часов, потраченных на разработку . Это измеряется во времени (или эквивалентном усилии), а не в строках кода.
Это все равно, что сказать, что автопроизводители должны строить свои машины с меньшим количеством винтов, потому что для установки каждого винта требуется ненулевое количество времени. Хотя это педантично правильно, рыночная стоимость автомобиля не определяется количеством винтов, которые оно делает или не имеет. Помимо всего прочего, автомобиль должен быть качественным, безопасным и простым в обслуживании.
Остальная часть ответа - примеры того, как чистый код может привести к выигрышу во времени.
логирование
Возьмите приложение (A), которое не имеет регистрации. Теперь создайте приложение B, которое является тем же приложением A, но с регистрацией. В B всегда будет больше строк кода, и поэтому вам нужно написать больше кода.
Но много времени уйдет на изучение проблем и ошибок и выяснение того, что пошло не так.
Что касается приложения A, разработчики будут зацикливаться на чтении кода, и ему придется постоянно воспроизводить проблему и перебирать код, чтобы найти источник проблемы. Это означает, что разработчик должен тестировать от начала выполнения до конца на каждом используемом уровне и должен наблюдать за каждым используемым фрагментом логики.
Возможно, ему повезло найти его немедленно, но, возможно, ответ будет в последнем месте, о котором он подумает.
Для приложения B, при условии идеальной регистрации, разработчик наблюдает журналы, может немедленно идентифицировать неисправный компонент и теперь знает, где искать.
Это может быть несколько минут, часов или дней; в зависимости от размера и сложности кодовой базы.
Регрессия
Возьмите приложение А, которое совсем не СУХОЙ.
Возьмите приложение B, которое СУХОЕ, но в итоге потребовалось больше строк из-за дополнительных абстракций.
Запрос на изменение подан, что требует изменения в логике.
Для приложения B разработчик изменяет (уникальную совместно используемую) логику в соответствии с запросом на изменение.
Для приложения A разработчик должен изменить все экземпляры этой логики, где он запоминает ее использование.
Это может привести к огромным потерям времени. Не только в разработке, но и в поиске ошибки. Приложение может начать вести себя хаотично, так что разработчики не могут его легко понять. И это приведет к длительным сеансам отладки.
Взаимозаменяемость разработчиков
Разработчик A создал приложение A. Код не является ни чистым, ни читаемым, но он работает как чудо и работает в производстве. Неудивительно, что документации также нет.
Разработчик А отсутствует в течение месяца из-за выходных. Запрос на экстренное изменение подан. Это не может ждать еще три недели, пока Dev A вернется.
Разработчик B должен выполнить это изменение. Теперь ему нужно прочитать всю кодовую базу, понять, как все работает, почему это работает и что он пытается выполнить. Это занимает много времени, но, скажем, он может сделать это через три недели.
В то же время приложение B (созданное разработчиком B) имеет чрезвычайную ситуацию. Dev B занят, но Dev C доступен, хотя он не знает кодовой базы. Что мы делаем?
Dev A возвращается из отпуска и видит, что B не понимает код и поэтому плохо его реализовал. Это не вина Б, потому что он использовал все доступные ресурсы, исходный код просто не был адекватно читаемым. А теперь нужно потратить время на исправление читабельности кода?
Все эти и многие другие проблемы теряют время . Да, в краткосрочной перспективе чистый код требует больше усилий сейчас , но в конечном итоге он будет приносить дивиденды в будущем, когда будут устранены неизбежные ошибки / изменения.
Руководство должно понимать, что короткое задание сейчас избавит вас от нескольких длительных заданий в будущем. Отказ от планирования означает провал.
Мое объяснение состоит в том, чтобы спросить руководство, что бы они предпочли: приложение с базой кода 100KLOC, которое может быть разработано за три месяца, или базой кода 50KLOC, которое может быть разработано за шесть месяцев.
Очевидно, они выберут более короткое время разработки, потому что руководство не заботится о KLOC . Менеджеры, которые сосредоточены на KLOC, занимаются микроменеджментом, но не знают о том, что они пытаются сделать.
источник
Я думаю, что вы должны быть очень осторожны с применением методов «чистого кода» на случай, если они приведут к большей общей сложности. Преждевременный рефакторинг - корень многих плохих вещей.
Извлечение условного выражения в функцию приводит к упрощению кода в точке, из которой извлечено условное выражение , но приводит к большей общей сложности, поскольку теперь у вас есть функция, которая видна из большего количества точек в программе. Вы добавляете небольшое бремя сложности ко всем другим функциям, где эта новая функция теперь видна.
Я не говорю, что вы не должны извлекать условные слова, просто вы должны тщательно обдумать, если вам нужно.
Во всем вышеперечисленном есть причина для извлечения за пределы этого просто быть «чистым кодом». Кроме того, вы, вероятно, даже не сомневаетесь, правильно ли это было сделать.
Я бы сказал, если сомневаешься, всегда выбирай самый простой и понятный код.
источник
Я бы отметил, что в этом нет ничего плохого:
По крайней мере, предполагая, что это используется один раз.
У меня могут быть проблемы с этим очень легко:
Несколько вещей, за которыми я бы следил:
Если он используется один раз, его легко разобрать и он занимает менее одной строки, я бы предпочел второе решение. Наверное, это не то, что я бы назвал, если бы это не была особая проблема команды.
С другой стороны, я видел, как методы делают что-то вроде этого:
Этот пример явно не СУХОЙ.
Или даже только это последнее утверждение может привести другой пример:
Цель должна состоять в том, чтобы сделать код более читабельным:
Другой сценарий:
У вас может быть такой метод:
Если это соответствует вашей бизнес-логике и не используется повторно, здесь нет проблем.
Но когда кто-то спрашивает: «Почему« @ »спасено, потому что это неправильно!» и вы решаете добавить фактическую проверку некоторого вида, а затем извлечь ее!
Вы будете рады, что сделали это, когда вам также нужно будет создать учетную запись второй электронной почты президентов Pr3 $ sid3nt @ h0m3! @ Mydomain.com и решить просто приложить все усилия и попытаться поддержать RFC 2822.
По читабельности:
Если ваш код понятен, вам не нужны здесь комментарии. На самом деле, вам не нужны комментарии, чтобы сказать, что код делает большую часть времени, а скорее, почему он это делает:
Будь то комментарии выше утверждения if или внутри крошечного метода для меня педантичны. Я мог бы даже поспорить против полезного с хорошими комментариями в другом методе, потому что теперь вам придется перейти к другому методу, чтобы увидеть, как и почему он делает то, что делает.
В итоге: не измеряйте эти вещи; Сосредоточьтесь на принципах, из которых построен текст (СУХОЙ, ТВЕРДЫЙ, ПОЦЕЛУЙ)
источник
Whether the comments above an if statement or inside a tiny method is to me, pedantic.
Это проблема «соломы, которая сломала спину верблюду». Вы правы, что эту вещь не особенно трудно прочитать прямо. Но если у вас есть большой метод (например , большой импорт) , который имеет десятки этих мелких оценок, имея эти инкапсулированные в читаемых имен методов (IsUserActive
,GetAverageIncome
,MustBeDeleted
...) будет заметное улучшение при чтении кода. Проблема с примером состоит в том, что он наблюдает только одну соломинку, а не весь пакет, который ломает спину верблюда.if (contact.email != null && contact.email.contains('@'))
глючит. Если if ложно, ни одна из остальных строк if не может быть истиной. Это совсем не видно вLooksSortaLikeAnEmail
блоке. Функция, содержащая одну строку кода, не намного лучше, чем комментарий, объясняющий, как работает эта строка.«Чистый код» - отличная книга, которую стоит прочитать, но она не является окончательным авторитетом в таких вопросах.
Разбивка кода на логические функции обычно является хорошей идеей, но немногие программисты делают это в той степени, в которой это делает Мартин - в какой-то момент вы получаете убывающую отдачу от превращения всего в функции, и может быть трудно следовать, когда весь код крошечный частей.
Один из вариантов, когда не стоит создавать совершенно новую функцию, это просто использовать промежуточную переменную:
Это помогает легко следовать коду без необходимости много перемещаться по файлу.
Еще одна проблема заключается в том, что Чистый код уже устарел как книга. Многие разработки программного обеспечения продвинулись в направлении функционального программирования, в то время как Мартин старается изо всех сил добавлять состояние к вещам и создавать объекты. Я подозреваю, что он написал бы совсем другую книгу, если бы написал ее сегодня.
источник
Принимая во внимание тот факт, что
@
имеющееся в настоящее время условие «действителен для электронной почты» может принять очень недействительный адрес электронной почты », я думаю, у вас есть все основания абстрагировать класс EmailValidator. Более того, используйте хорошую, хорошо проверенную библиотеку для проверки адресов электронной почты.Строки кода как метрика бессмысленны. Важными вопросами в разработке программного обеспечения не являются:
Важные вопросы:
Я никогда не думал о LoC, когда писал код для каких-либо целей, кроме Code Golf. Я спрашивал себя: «Могу ли я написать это более кратко?», Но в целях удобства чтения, удобства обслуживания и эффективности, а не просто длины.
Конечно, возможно я мог бы использовать длинную цепочку логических операций вместо служебного метода, но должен ли я?
Ваш вопрос на самом деле заставляет меня вспомнить о некоторых длинных цепочках логических выражений, которые я написал, и понимаю, что мне, вероятно, следовало бы написать один или несколько вспомогательных методов.
источник
На одном уровне они правы - чем меньше кода, тем лучше. Еще один ответ процитировал Gate, я предпочитаю:
Короче говоря, чем меньше у вас кода, тем меньше ошибок. Если что-то не нужно, тогда отрежь это.
Если есть слишком сложный код, то упрощайте его до тех пор, пока не останутся действительные функциональные элементы.
Здесь важно то, что все они относятся к функциональности и имеют только минимум, необходимый для этого. Это ничего не говорит о том , как это выражается.
То, что вы делаете, пытаясь получить чистый код, не противоречит вышесказанному. Вы добавляете в свой LOC, но не добавляете неиспользуемые функции.
Конечная цель - иметь читаемый код, но не лишние дополнения. Два принципа не должны действовать друг против друга.
Метафора будет строить машину. Функциональная часть кода - это шасси, двигатель, колеса ... что заставляет автомобиль работать. То, как вы это сломаете, больше похоже на подвеску, гидроусилитель руля и так далее, с ним легче обращаться. Вы хотите, чтобы ваша механика была как можно более простой, но при этом выполняла свою работу, чтобы минимизировать вероятность того, что что-то пойдет не так, но это не мешает вам иметь хорошие места.
источник
В существующих ответах много мудрости, но я хотел бы добавить еще один фактор: язык .
Некоторые языки требуют больше кода, чем другие, чтобы получить тот же эффект. В частности, хотя Java (который, как я подозреваю, является языком в этом вопросе) чрезвычайно хорошо известен и, как правило, очень точен, понятен и прямолинеен, некоторые более современные языки гораздо более кратки и выразительны.
Например, в Java может легко потребоваться 50 строк, чтобы написать новый класс с тремя свойствами, каждое с геттером и сеттером, и одним или несколькими конструкторами, в то время как вы можете сделать то же самое в одной строке Kotlin * или Scala. (Еще больше экономии , если вы также хотели подходящие
equals()
,hashCode()
иtoString()
методы.)Результатом является то, что в Java дополнительная работа означает, что вы с большей вероятностью будете повторно использовать общий объект, который на самом деле не подходит, втиснуть свойства в существующие объекты или передать кучу «голых» свойств по отдельности; в то время как в кратком, выразительном языке, вы с большей вероятностью будете писать лучший код.
(Это подчеркивает разницу между «поверхностной» сложностью кода и сложностью идей / моделей / обработки, которые он реализует. Строки кода не являются плохой мерой первого, но имеют гораздо меньшее отношение ко второму. .)
Таким образом, «стоимость» правильных действий зависит от языка. Возможно, одним из признаков хорошего языка является тот, который не заставляет вас выбирать между хорошим делом и простым делом!
(* На самом деле это не место для вилки, но Котлин стоит посмотреть ИМХО.)
источник
Давайте предположим, что вы работаете с классом в
Contact
настоящее время. Тот факт, что вы пишете другой метод для проверки адреса электронной почты, свидетельствует о том, что классContact
не обрабатывает ни одной ответственности.Это также обрабатывает некоторую ответственность за электронную почту, которая в идеале должна быть его собственным классом.
Еще одним доказательством того, что ваш код представляет собой сочетание
Contact
иEmail
класс, является то, что вы не сможете легко проверить код проверки электронной почты. Потребуется много маневров для получения кода проверки электронной почты большим методом с правильными значениями. Смотрите метод, а именно ниже.С другой стороны, если у вас был отдельный класс электронной почты с методом для проверки электронной почты, то для модульного тестирования вашего кода проверки вы просто сделали бы один простой вызов
Email.Validation()
с вашими тестовыми данными.Бонусный контент: разговор MFeather о глубокой синергии между тестируемостью и хорошим дизайном.
источник
Было обнаружено, что сокращение LOC коррелирует с уменьшением дефектов, и ничего больше. Предполагая, что всякий раз, когда вы уменьшаете LOC, вы уменьшаете вероятность того, что дефекты по сути попадают в ловушку, полагая, что корреляция равна причинности. Сокращение LOC является результатом хороших практик разработки, а не того, что делает код хорошим.
По моему опыту, люди, которые могут решить проблему с меньшим количеством кода (на макроуровне), как правило, более опытны, чем те, кто пишет больше кода, чтобы делать то же самое. То, что эти опытные разработчики делают, чтобы сократить количество строк кода, - это использовать / создавать абстракции и повторно используемые решения для решения общих проблем. Они не тратят время на подсчет строк кода и мучений по поводу того, могут ли они сократить строку здесь или там. Часто код, который они пишут, является более подробным, чем необходимо, они просто пишут меньше.
Позвольте привести пример. Мне приходилось иметь дело с логикой в отношении периодов времени и того, как они перекрываются, являются ли они смежными, и какие промежутки существуют между ними. Когда я впервые начал работать над этими проблемами, у меня были блоки кода, выполняющие вычисления везде. В конце концов, я создал классы для представления периодов времени и операций, которые вычисляли перекрытия, дополнения и т. Д. Это немедленно удаляло большие участки кода и превращало их в несколько вызовов методов. Но сами эти классы не были написаны кратко на всех.
Проще говоря: если вы пытаетесь уменьшить LOC, пытаясь сократить строку кода здесь или там более кратко, вы делаете это неправильно. Это все равно, что пытаться похудеть, уменьшая количество овощей, которые вы едите. Напишите код, который легко понять, поддерживать, отлаживать и сокращать LOC посредством повторного использования и абстракции.
источник
Вы определили действительный компромисс
Таким образом, здесь действительно есть компромисс, и он присущ абстракции в целом. Всякий раз, когда кто-то пытается вставить N строк кода в свою собственную функцию, чтобы назвать его и изолировать, он одновременно облегчает чтение вызывающего сайта (ссылаясь на имя, а не на все кровавые подробности, лежащие в основе этого имени), и более сложный (теперь у вас есть смысл, который запутан в двух разных частях кодовой базы). «Легкий» - это противоположность «сложному», но это не синоним «простого», который противоположен «сложному». Они не являются противоположностями, и абстракция всегда увеличивает сложность, чтобы вставить ту или иную форму легкости.
Мы можем увидеть дополнительную сложность непосредственно, когда некоторые изменения в бизнес-требованиях заставляют абстракцию начинать течь. Возможно, какая-то новая логика была бы наиболее естественной в середине предварительно абстрагированного кода, скажем, например, если абстрагированный код пересекает какое-то дерево, и вы действительно хотели бы собирать (и, возможно, действовать) некоторую информацию, пока вы пересекая дерево. Между тем, если вы абстрагировали этот код, тогда могут быть другие сайты вызовов, и добавление необходимой логики в середину метода может нарушить эти другие сайты вызовов. Видите, всякий раз, когда мы меняем строку кода, нам нужно только смотреть на непосредственный контекст этой строки кода; когда мы меняем метод, мы должны Cmd-F весь наш исходный код искать что-то, что может сломаться в результате изменения контракта этого метода,
В этих случаях жадный алгоритм может потерпеть неудачу
Сложность также сделала код в определенном смысле менее читабельным, чем более, В предыдущей работе я имел дело с HTTP API, который был очень аккуратно и точно структурирован в несколько уровней, каждая конечная точка определяется контроллером, который проверяет форму входящего сообщения, а затем передает его какому-то менеджеру «уровня бизнес-логики» , который затем сделал некоторый запрос некоторого «уровня данных», который отвечал за выполнение нескольких запросов к некоторому уровню «объекта доступа к данным», который отвечал за создание нескольких делегатов SQL, которые фактически ответили бы на ваш вопрос. Первое, что я могу сказать по этому поводу, было то, что примерно 90% кода было шаблоном копирования и вставки, другими словами, это не было никаких операций. Поэтому во многих случаях чтение любого фрагмента кода было очень «легким», потому что «о, этот менеджер просто перенаправляет запрос к этому объекту доступа к данным».много переключения контекста и поиска файлов и попытки отследить информацию, которую вы никогда не должны были отслеживать, "это называется X на этом уровне, он становится называемым X" на этом другом уровне, затем он называется X "на этом другом другой слой. "
Я думаю, что когда я остановился, этот простой CRUD API был на той стадии, когда, если вы напечатали его по 30 строк на страницу, на полке потребовалось бы 10-20 учебников по пятьсот страниц: это была целая энциклопедия повторяющихся код. Что касается существенной сложности, я не уверен, что там была даже половина учебника существенной сложности; у нас было всего 5-6 диаграмм базы данных, чтобы справиться с этим. Внесение в него каких-либо незначительных изменений было гигантским начинанием, изучение того, что это было гигантским начинанием, добавление новых функций стало настолько болезненным, что у нас фактически были шаблоны шаблонных файлов, которые мы будем использовать для добавления новых функций.
Так что я воочию видел, как сделать каждую часть очень читабельной и очевидной может сделать целую очень нечитаемой и неочевидной. Это означает, что жадный алгоритм может потерпеть неудачу. Вы знаете жадный алгоритм, да? «Я собираюсь сделать любой шаг, который локально улучшит ситуацию, и тогда я буду верить, что попал в глобально улучшенную ситуацию». Это часто прекрасная первая попытка, но она может и пропустить в сложных ситуациях. Например, на производстве вы можете попытаться повысить эффективность каждого конкретного шага в сложном производственном процессе - делать большие партии, кричать на людей на полу, которые, похоже, ничего не делают, чтобы чем-то заняться своими руками, - и это часто может разрушить глобальную эффективность системы.
Лучшая практика: используйте СУХОЙ и длины, чтобы сделать звонок
(Примечание. Заголовок этого раздела в некотором роде шутка; я часто говорю своим друзьям, что когда кто-то говорит: «Мы должны сделать X, потому что лучшие практики так говорят », они в 90% случаев не говорят о чем-то вроде внедрения SQL или хеширования пароля. или что-то еще - односторонние лучшие практики - и таким образом утверждение может быть переведено в эти 90% времени на «мы должны сделать X, потому что я так говорю ». Как будто у них может быть какая-то статья в блоге от какого-то бизнеса, который сделал лучшую работу с X, а не с X ', но, как правило, нет гарантии, что ваш бизнес похож на этот бизнес, и, как правило, есть какая-то другая статья из другого бизнеса, которая лучше справилась с X', чем с X. Поэтому, пожалуйста, не берите название слишком шутки в сторону.)
То , что я рекомендовал бы основан на разговоре Джек Дидерих называется Классы Stop Пишущие (youtube.com) . В этом выступлении он сделал несколько важных замечаний: например, вы можете знать, что класс на самом деле является просто функцией, когда у него есть только два открытых метода, и один из них - конструктор / инициализатор. Но в одном случае он говорит о том, что гипотетическая библиотека, которую он заменил строкой для разговора как «Маффин», объявила свой собственный класс «MuffinHash», который был подклассом встроенного
dict
типа, который есть в Python. Реализация была совершенно пустой - кто-то только что подумал: «Возможно, нам понадобится добавить пользовательские функции в словари Python позже, давайте на всякий случай представим абстракцию прямо сейчас».И его вызывающий ответ был просто: «Мы всегда можем сделать это позже, если понадобится».
Я думаю, что мы иногда притворяемся, что в будущем станем программистами хуже, чем сейчас, поэтому мы можем захотеть добавить какую-то мелочь, которая может сделать нас счастливыми в будущем. Мы предвидим будущие потребности нас. «Если трафик будет в 100 раз больше, чем мы думаем, этот подход не будет масштабироваться, поэтому мы должны направить предварительные инвестиции в этот более сложный подход, который будет масштабироваться». Очень подозрительно
Если мы серьезно относимся к этому совету, тогда нам нужно определить, когда наступит «позже». Вероятно, наиболее очевидным было бы установить верхний предел длины вещей по стилевым причинам. И я думаю, что оставшийся лучший совет - использовать DRY - не повторяйте себя - с этими эвристиками длины линий, чтобы исправить дыру в принципах SOLID. Основываясь на эвристике из 30 строк, являющейся «страницей» текста и аналогией с прозой,
Как я уже упоминал, я проверил эти статистические данные по текущему дереву исходных текстов Linux, чтобы найти эти приблизительные проценты, но они также своего рода аргументы в литературной аналогии.
источник