Существуют ли какие-либо приемы в программировании, которые вы считаете чрезмерно используемыми (IE использовал их более чрезмерно, чем они должны быть), или злоупотребляли ими, или использовали немного для всего, при этом не являясь действительно хорошим решением многих проблем, которые пытаются предпринять люди решить с этим.
Это могут быть регулярные выражения, какой-то шаблон проектирования или алгоритм или что-то совершенно другое. Может быть, вы думаете, что люди злоупотребляют множественным наследованием и т. Д.
Ответы:
Комментарии в коде
Я просто хотел бы, чтобы преподаватели университета поняли, что им не нужно учить своих студентов писать 10 строк комментариев, в которых говорится, что следующий код является циклом for, повторяющимся от 1 до числа x. Я вижу это в коде!
Научите их сначала писать самодокументируемый код, а затем комментировать то, что не может быть адекватно самодокументируемым. Мир программного обеспечения был бы лучше.
источник
Clean Code
, Фаулер четко заявляет, что устаревшая документация хуже, чем никакая документация, и что все комментарии имеют тенденцию становиться устаревшими и переходить от кода, который они документируют. Вся эта книга о том, как написать самодокументированный код.Синглтон дизайн шаблона.
Конечно, это полезный шаблон, но каждый раз, когда новый программист узнает об этом шаблоне, он начинает пытаться применять его в каждом создаваемом им классе.
источник
$this->
. PHP - гнилой язык, поэтому я не могу ожидать, что фреймворки будут отличными.Самая злая вещь для защиты тупого программирования. ставить все в ловушку и ничего не делать с ловушкой
Я вздрагиваю, когда вижу попытку, которая ничего не делает и предназначена для обработки глупой логики. В общем, попробуйте использовать уловы, но в некоторых случаях они очень полезны.
источник
Полагайтесь на StackOverflow, чтобы решать свои проблемы, а не решать их трудным путем.
Новые программисты, которые находят много знаний о SO (слишком часто), пишут, прежде чем думать и пробовать.
В свое время нам приходилось кодировать из книг, ни интернета, ни ТАК. А теперь иди с моей лужайки.
источник
ООП видимо. Это очень ценно, но при неправильном использовании он может довольно легко затенить в противном случае понятный код (на ум приходят некоторые примеры программирования на S4 на R) и может привести к огромным накладным расходам, которые не нужны и могут стоить вам больших затрат на производительность.
Другое дело, что (например, в Perl) ООП часто сводится к написанию одной и той же вещи наоборот:
result = $object ->function(pars)
вместоresult = function(object, pars)
этого иногда имеет смысл, но в сочетании с процедурным программированием это может сделать чтение кода довольно запутанным. И кроме того, вы просто вводите больше накладных расходов, когда это не улучшает дизайн. Это также сводится к тому, что сказано о синглтон-паттерне: должен использоваться, но не на всем.Я сам использую ООП, но в моей области (научных вычислениях) производительность имеет большое значение, и ООП там часто злоупотребляют, так как все студенты в настоящее время получают Java. Это отлично подходит для решения более крупных проблем, для концептуализации и так далее. Но если вы работаете, например, с последовательностями ДНК в BioPerl, использование объектов каждый раз и работа с геттерами и сеттерами может увеличить время расчета в десять раз. Когда ваш код выполняется несколько дней вместо нескольких часов, эта разница действительно имеет значение.
источник
Foo.DoX().DoY().DoZ()
) хорош, но, безусловно, это не единственный способ что-то сделать. Композиция функций (например,doZ . doY . doX $ foo
является вполне допустимой альтернативой.Проведя несколько лет в ASP.NET Webforms, я бы сказал однозначно:
Умный интерфейс
Несмотря на то, что создание веб-форм в виде веб-форм вполне возможно для создания многослойных тестируемых приложений, разработчики слишком легко могут одним щелчком мыши щелкнуть мышью на пути к формам, тесно связанным с их источником данных, а логика приложения замусорена вокруг всего кода пользовательского интерфейса.
Стив Сандерсон объясняет этот анти-паттерн гораздо лучше, чем я, в его книге Pro ASP.NET MVC:
источник
Я иногда вижу это, и это обычно происходит из-за неполного понимания логических выражений.
источник
bool
начиная сis
илиhas
, вам не нужно делать код более явным с помощью= true
.Реализовать основную (или иным образом предоставленную) функциональность, либо из-за незнания ее существования, либо из-за предполагаемой потребности в настройках.
источник
Наследование.
Не навязывайте это там, где это не имеет смысла.
источник
Настройка готового программного обеспечения.
Хотя я могу признать, что это может быть полезно, я действительно задаюсь вопросом, сколько денег тратится на то, чтобы сделать маленькие вещи для сомнительной выгоды. Именно здесь компания может потратить сотни тысяч, если не миллионы долларов, на лицензии для некоторого программного обеспечения, которое затем настраивается, потому что оно настолько настраиваемо, редактируемо и гибко, что по умолчанию оно мало что дает. В конце концов, это пользовательское приложение, потому что весь новый код добавлен к тому, что было куплено изначально.
источник
Использование компилятора в качестве отладчика.
Игнорирование предупреждений компилятора или их полное отключение.
Глобальные переменные.
источник
Все шаблоны дизайна.
Они похожи на соль или сахар. Некоторые из них на вашей еде делают это здорово, многие из них делают вашу еду отстойной.
Не пойми меня неправильно. Шаблоны дизайна - это замечательные приемы. Я использовал их много. Но иногда я нахожу программистов (некоторые из них мои бывшие начальники), у которых были такие «вы должны использовать шаблон проектирования», даже если это не соответствует проблеме !!!
Одним из примеров является «Шаблон посетителя», который больше ориентирован на «Линейные / последовательные коллекции». Мне приходилось работать с древовидной структурой данных, один раз. Чтобы «посетить» каждый предмет, я кодирую не шаблонный метод, а бывший босс настаивает на использовании или адаптации «Шаблонов посетителей». Затем я просматриваю сеть, для второго мнения. Ну, другие программисты имели ту же ситуацию и то же решение. И назовите его «Tree / Hierarchical Visitor Pattern»., Как НОВЫЙ шаблон проектирования
Я надеюсь, что он добавлен как новый шаблон к существующим, в новой версии книги «Шаблоны проектирования».
источник
Использование исключений в качестве управления потоком. Вроде как на этот ответ , но разные.
Поглощение исключений - плохая форма, потому что оно вводит в код загадочные, трудно обнаруживаемые ошибки. Использование исключений в качестве управления потоком, с другой стороны, плохо, потому что это делает код гораздо более неэффективным, чем могло бы быть, и является концептуально неаккуратным.
Обработка исключений должна использоваться только для обработки действительно необычных (непредсказуемых), непредвиденных сценариев, а не таких вещей, как пользователь, набирающий алфавитный символ там, где ожидается число. Такое злоупотребление исключениями чрезвычайно распространено среди плохих программистов в мире Java.
источник
Я собираюсь пойти с негибкостью через чрезмерное сокрытие данных.
Все мы знаем, что абстракция и сокрытие реализации хороши, но больше не всегда лучше. Переусердствовав, вы можете получить негибкий результат, который не справится с изменениями требований. Чтобы обработать это изменение, вам нужно не только изменить класс, который должен обработать это изменение, но также создать способ, с помощью которого информация, в которой он ранее не нуждался, была доступна, несмотря на слои скрытия данных.
Проблема в том, что, как и в случае с поиском правильного баланса для каждого контекста, требуется опыт.
источник
Экспонирование внутренних массивов
Согласно http://www.oracle.com/technetwork/java/seccodeguide-139067.html
источник
Изменчивое состояние и циклы. Вы почти никогда не нуждаетесь в них, и вы почти всегда получаете лучший код без них.
Например, это берется непосредственно из потока StackOverflow:
Они оба делают одно и то же. Но я понятия не имею, что они делают. К счастью, вопрос на самом деле объясняет, что они делают, поэтому я смог переписать их следующим образом:
Там нет петель и нет изменяемого состояния. Ну, ладно, никаких явных циклов и счетчиков циклов.
Код стал намного короче, намного проще, намного больше похож на описание того, что код должен делать (особенно в случае с Ruby, он почти прямо говорит «группировать вещи по типу»), и гораздо менее подвержен ошибкам. Нет опасности убежать от конца массива, ошибок столба или ошибок «один за другим» с индексами цикла и условиями завершения, потому что нет никаких индексов цикла и условий завершения.
источник
(acc[thing.type] || (acc[thing.type] = []))
, а не «= [вещь], unless you want to add
вещь» в списке дважды ... Или я что-то упустил?Дразнящий. Он вводит слишком много искусственных требований для чрезмерной развязки в вашем коде, приводит к чрезмерно усиленному коду равиоли и вынуждает дизайн в стиле OO урезать вам горло, когда более процедурный или функциональный дизайн может быть более простым решением вашей проблемы.
источник
За последние два года программисты на Delphi со всего мира узнали, как плохо использовать массивы символов для хранения байтов из-за оптового преобразования Unicode.
И «скоро» мы узнаем, как плохо хранить целые числа в списках, когда мы хотим внести изменения в 64-разрядные.
источник
Свойства. Я знаю, что это противоречиво, но я чувствую, что свойства очень сильно используются в .net.
В чем разница между этими двумя строками?
Для разработчика разница: абсолютно ничего. Скомпилированная форма немного отличается, поэтому, если вы пишете библиотеку, и эта библиотека будет обновляться в программах, и вы не сможете перекомпилировать сами программы (например, если вы пишете интерфейс для плагинов, который должен работать в разных версиях вашего программного обеспечения), тогда вы не должны использовать открытые поля, потому что вы не можете заменить их свойствами. В любом другом случае нет абсолютно никакой разницы между использованием поля или авто-свойства без модификаторов.
источник
YAGNI
но я чувствую , отклоняясь в этом случае не стоит ничего);
на{ get { ... } set { ... } }
любой больше работы , чем изменения{ get; set; }
в{ get { ... } set { ... } }
?