Вкратце: это зависит
Подробно
Вам понадобятся очищенные, блестящие вещи?
Здесь есть вещи, которые нужно соблюдать осторожность, и вам нужно определить границу между реальным, измеримым выигрышем и тем, что является вашим личным предпочтением и потенциально вредной привычкой касаться кода, чего не должно быть.
В частности, знать это:
Это анти-паттерн, и он имеет встроенные проблемы:
- это может быть более расширяемым , но это не может быть легче расширять,
- это не может быть проще для понимания ,
- И последнее, но не менее важное: вы можете замедлить весь код.
Некоторые могут также упомянуть принцип KISS в качестве справочного материала, но здесь он противоречит интуиции: оптимизированный способ - простой или чистый, архитектурный? Ответ не обязательно является абсолютным, как объяснено в остальном ниже.
Принцип YAGNI не является полностью ортогональным по отношению к другой проблеме, но он помогает задать себе вопрос: он вам понадобится?
Является ли более сложная архитектура действительно выгодной для вас, кроме того, что она выглядит более удобной в обслуживании?
Напишите это на большом плакате и повесьте рядом с экраном, на кухне, на работе или в конференц-зале разработчиков. Конечно, есть много других мантр, которые стоит повторить самим, но этот особенно важен всякий раз, когда вы пытаетесь выполнить «работу по техническому обслуживанию» и чувствуете желание «улучшить» ее.
Для нас естественно хотеть «улучшить» код или даже просто коснуться его, даже неосознанно, когда мы читаем его, чтобы попытаться понять его. Это хорошо, так как это означает, что мы самоуверенны и пытаемся глубже понять внутреннее, но это также связано с нашим уровнем навыков, нашими знаниями (как вы решаете, что лучше или нет? Хорошо, см. Разделы ниже). ...) и все наши предположения о том, что мы думаем, что знаем программное обеспечение ...:
- на самом деле,
- на самом деле нужно сделать,
- в конечном итоге нужно будет сделать,
- и как хорошо это делает.
Это действительно нужно оптимизировать?
Все это говорит, почему это было "оптимизировано" в первую очередь? Говорят, что преждевременная оптимизация - это корень всего зла, и если вы видите недокументированный и, казалось бы, оптимизированный код, обычно можно предположить, что он, вероятно, не соответствует Правилам оптимизации, и не нуждался в усилиях по оптимизации, и что это всего лишь горькое желание обычного разработчика. И снова, может быть, это только ты говоришь сейчас.
Если да, то в каких пределах это становится приемлемым? Если в этом есть необходимость, этот предел существует, и он дает вам возможность улучшить положение вещей или создать жесткую линию для принятия решения.
Также остерегайтесь невидимых характеристик. Скорее всего, ваша «расширяемая» версия этого кода также увеличит объем памяти во время выполнения и предоставит еще больший объем статической памяти для исполняемого файла. Сверкающие функции OO поставляются с такими не интуитивными затратами, как они, и могут иметь значение для вашей программы и среды, в которой она должна работать.
Измерить, измерить, измерить
Как Google люди сейчас, это все о данных! Если вы можете подтвердить это данными, это необходимо.
Это не такая старая история, что за каждым 1 долларом, потраченным на разработку, последуют как минимум 1 доллар на тестирование и как минимум 1 доллар на поддержку (но на самом деле это намного больше).
Изменения влияют на многие вещи:
- вам может понадобиться создать новую сборку;
- вам следует написать новые модульные тесты (определенно, если их не было, и ваша более расширяемая архитектура, вероятно, оставляет место для большего, так как у вас есть больше возможностей для ошибок);
- Вы должны написать новые тесты производительности (чтобы убедиться, что это останется стабильным в будущем, и увидеть, где узкие места), и это сложно сделать ;
- вам нужно будет это задокументировать (и более расширяемый означает больше места для деталей);
- вам (или кому-то еще) нужно будет повторно протестировать его в QA;
- Код (почти) никогда не бывает без ошибок, и вам нужно его поддерживать.
Таким образом, здесь нужно измерять не только потребление аппаратных ресурсов (скорость выполнения или объем памяти), но и потребление ресурсов командой . Оба должны быть предсказаны для определения целевой цели, которые должны быть измерены, учтены и адаптированы на основе развития.
И для вас, менеджера, это означает, что вы должны вписать его в текущий план развития, так что не стесняйтесь связываться с ним и не впадать в яростное кодирование «мальчик-боец» / «подводная лодка» / «черный ход».
В общем...
Да, но...
Не поймите меня неправильно, в общем, я бы высказался за то, что вы предлагаете, и я часто защищаю это. Но вы должны знать о долгосрочной стоимости.
В идеальном мире это правильное решение:
- компьютерное оборудование улучшается со временем,
- компиляторы и платформы времени исполнения становятся лучше со временем,
- Вы получаете почти идеальный, чистый, поддерживаемый и читаемый код.
На практике:
Вы можете сделать это хуже
Вам нужно больше глазных яблок, чтобы видеть это, и чем больше вы усложняете, тем больше глазных яблок вам нужно.
ты не можешь предсказать будущее
Вы не можете знать с абсолютной уверенностью, понадобится ли вам это когда-либо, и даже если бы вам понадобились «расширения», которые было бы проще и быстрее реализовать в старой форме, и если бы их нужно было супероптимизировать ,
с точки зрения руководства, это представляет собой огромные затраты без прямой выгоды.
Сделайте это частью процесса
Вы упоминаете здесь, что это довольно небольшое изменение, и вы имеете в виду некоторые конкретные проблемы. Я бы сказал, что в этом случае все нормально, но у большинства из нас есть личные истории небольших изменений, почти хирургических правок, которые в конечном итоге превратились в кошмар обслуживания и почти пропущенные или взорванные сроки, потому что Джо Программист не видел ни одного из-за причин кода и коснулся того, чего не должно было быть.
Если у вас есть процесс для обработки таких решений, вы снимаете с них личное преимущество:
- Если вы проверяете вещи правильно, вы будете знать быстрее, если что-то сломалось,
- Если вы измеряете их, вы будете знать, если они улучшились,
- Если вы просмотрите его, вы узнаете, отталкивает ли это людей.
Тестовое покрытие, профилирование и сбор данных - это сложно
Но, конечно, ваш тестовый код и метрики могут страдать от тех же проблем, которые вы пытаетесь избежать для своего реального кода: проверяете ли вы правильные вещи, и являются ли они правильными в будущем, и вы измеряете правильные вещи?
Тем не менее, в целом, чем больше вы тестируете (до определенного предела) и измеряете, тем больше данных вы собираете и тем безопаснее вы. Плохая аналогия: думайте об этом как о вождении (или о жизни в целом): вы можете стать лучшим водителем в мире, если автомобиль сломается, или кто-то решил убить себя, врезаясь в вашу машину сегодня, ваш навыков может быть недостаточно. Есть и экологические вещи, которые могут поразить вас, и человеческие ошибки также имеют значение.
Обзоры кода - это тестирование прихожей команды разработчиков
И я думаю, что последняя часть является ключевой здесь: делать обзоры кода. Вы не будете знать ценность ваших улучшений, если сделаете их соло. Обзоры кода - это наше «тестирование в коридоре»: следуйте версии закона Линуса, разработанной Рэймондом, как для выявления ошибок, так и для выявления чрезмерного проектирования и других анти-шаблонов, а также для обеспечения того, чтобы код соответствовал возможностям вашей команды. Нет смысла иметь «лучший» код, если никто, кроме вас, не может его понять и поддерживать, и это касается как загадочных оптимизаций, так и 6-уровневых архитектурных проектов.
Как заключительные слова, помните:
Все знают, что отладка в два раза сложнее, чем написание программы. Итак, если вы настолько умны, насколько это возможно, когда вы пишете это, как вы будете когда-либо отлаживать его? - Брайан Керниган