Злоупотребление или злоупотребление методами программирования [закрыто]

38

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

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

Анто
источник
33
Я согласен, что IE используется гораздо чаще, чем следовало бы, но это в первую очередь непрограммисты. , ,
Эрик Уилсон
7
@FarmBoy - я думаю, что он имел в виду IE: «Ie» означает просто «то есть», что полностью написано на латыни «id est».
Рафаэль
Исправлено сейчас :)
Anto
4
Любая техника может (и часто злоупотребляется), она просто должна быть представлена ​​как следующая серебряная пуля, и вы найдете кого-то, кто рассматривает каждую проблему как гвоздь (чтобы смешать метафоры).
ChrisF
8
@Rapheal - я, конечно, шутил. Спасибо за образование.
Эрик Уилсон

Ответы:

73

Комментарии в коде

Я просто хотел бы, чтобы преподаватели университета поняли, что им не нужно учить своих студентов писать 10 строк комментариев, в которых говорится, что следующий код является циклом for, повторяющимся от 1 до числа x. Я вижу это в коде!

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

Дэн МакГрат
источник
26
Самодокументируемый код не Профессора также делают это, чтобы научить студентов осмысливать проблему и подходить к ней. Кроме того, я никогда не видел, чтобы кто-то жаловался на слишком много документации. Будьте аккуратны с документацией.
Woot4Moo
24
@ Woot4Moo: если вы читаете Clean Code, Фаулер четко заявляет, что устаревшая документация хуже, чем никакая документация, и что все комментарии имеют тенденцию становиться устаревшими и переходить от кода, который они документируют. Вся эта книга о том, как написать самодокументированный код.
Скотт Уитлок
12
Хорошим началом будет научить их заменять комментарии кодом.
Shog9
15
+1. Я на самом деле видел следующее в коде реального мира: "loopVar ++; // инкремент loopVar". AAAAAAAAAAAAARRRRRGH!
Бобби Столы
7
@ Билл: Я считаю, что вам не нужно документировать общую логику и управляющие структуры, даже если они относительно сложные. По сути, все, что хороший разработчик, знающий язык, должен уметь анализировать, не нуждается в комментариях. например. Набор вложенных циклов for с некоторыми перерывами внутри них и т. Д. Но то, что ДОЛЖНО быть прокомментировано, - это конкретное приложение, объясняющее, почему код принимает такие решения: например. «Если завтра в компании появится новый программист и посмотрит на код, будет ли это иметь смысл без намеков на комментарии?»
Бобби Столы
57

Синглтон дизайн шаблона.

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

Рафаэль
источник
Я использую это плохо продуманное оправдание для рамок каждый день. codeigniter.com/user_guide/libraries/email.html Они думают, что ООП выполняет функции с префиксами $this->. PHP - гнилой язык, поэтому я не могу ожидать, что фреймворки будут отличными.
Кейо
7
Я думаю, что любой программист, который реализует синглтон и не раскаивается, сгорит в огненном аду за грехи, которые он (или она) совершил.
2
Я однажды реализовал синглтон в своей профессиональной карьере (в многозадачном контексте), и мне пришлось покаяться в своем грехе, переписав его.
Спойк
3
Одиночки могут быть полезны для нескольких вещей, но почти всегда используются, когда они не должны быть. Это не означает, что синглтоны никогда не должны использоваться - просто потому, что чем-то злоупотребляют, не означает, что его нельзя использовать правильно.
конфигуратор
2
@Rapahel: Именно поэтому я не верю, что изучение шаблонов дизайна - это хорошая вещь.
конфигуратор
53

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

        try
        {
            int total = 1;
            int avg = 0;
            var answer = total/avg;
        }
        catch (Exception)
        {

        }

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

Nickz
источник
4
Забавная вещь - я только что редактировал файл, который делает это сотни раз, и по уважительной причине. Это файл модульного теста, проверяющий, что различные методы выдают исключение, когда ожидается. Блок try содержит вызов и отчет «ожидаемого выброса не произошло». Исключение является ожидаемым и корректным, поэтому никаких корректирующих действий не предпринимается. Очевидно, что модульные тесты - это особый случай, но у меня были подобные случаи в реальном коде. Красный флаг, да, но не абсолютное правило.
Steve314
5
@ Оставьте случай, который вы описали, редкое крайнее состояние. Еще одна вещь, о которой я могу подумать, это регистрация кода - если сама регистрация не удалась, нет смысла регистрировать исключение или прерывать приложение.
dbkk
1
@dbkk - согласился с краевым условием, и я добавил бы, что когда вам действительно нужно перехватить исключение, но не нужно корректирующее действие, добавьте комментарий в блоке перехвата, чтобы объяснить, что это важно, если только для успокоения сопровождающие. Это не так уж редко в модульных тестах, так что я бы оставил комментарий в этом случае.
Steve314
5
при ошибке возобновить следующее
JK.
2
@ jk01 - исключение не является (обязательно) ошибкой. Является ли какое-либо условие ошибкой или нет, зависит от контекста. Например, «файл не найден» не является ошибкой, если вам не нужен файл. Возможно, это просто необязательный файл настроек, который может присутствовать или не присутствовать, и вы можете просто оставить настройки по умолчанию на месте, если этого файла нет (поэтому после перехвата корректирующих действий не требуется).
Steve314
47

Полагайтесь на StackOverflow, чтобы решать свои проблемы, а не решать их трудным путем.

Новые программисты, которые находят много знаний о SO (слишком часто), пишут, прежде чем думать и пробовать.

В свое время нам приходилось кодировать из книг, ни интернета, ни ТАК. А теперь иди с моей лужайки.

Байрон Уитлок
источник
28
Я должен признать, я вздрогнул от дерзости некоторых вопросов по SO. Либо потому, что их спрашивают много раз каждый день, и они, очевидно, вообще не искали; или, что еще хуже, они рассматривают сообщество как бесплатную службу аутсорсинга.
Orbling
2
@dbkk: stackoverflow.com/questions/4665778/… -> первый комментарий "ты когда-нибудь пробовал это?"
Матье М.
5
Я начал учиться по книгам, но когда у меня появился фундамент, я узнал почти все остальное из дискуссий на форумах. Не спрашивая, а главным образом (и сначала, исключительно), читая. Этот метод научил меня нескольким языкам программирования в мучительной глубине (с большим количеством закоулков), и я думаю, что это совсем не плохой метод.
Конрад Рудольф
1
@ Конрад Рудольф: Этот метод хорош и мудр, читает вопросы, хорошо ищет. Спрашивать лучше всего, когда у спрашивающего есть структура, с помощью которой можно понять ответы. Слишком часто люди задают вопросы, которые они (пока) не способны понять.
Orbling
3
проблема в том, что ТАК поощряют это, давая много повторений за очень простой вопрос / ответ на него, на который можно ответить с помощью простого поиска Google. очень сложный вопрос, на который люди отвечают только потому, что очень хотят.
IAdapter
36

ООП видимо. Это очень ценно, но при неправильном использовании он может довольно легко затенить в противном случае понятный код (на ум приходят некоторые примеры программирования на S4 на R) и может привести к огромным накладным расходам, которые не нужны и могут стоить вам больших затрат на производительность.

Другое дело, что (например, в Perl) ООП часто сводится к написанию одной и той же вещи наоборот: result = $object ->function(pars)вместо result = function(object, pars)этого иногда имеет смысл, но в сочетании с процедурным программированием это может сделать чтение кода довольно запутанным. И кроме того, вы просто вводите больше накладных расходов, когда это не улучшает дизайн. Это также сводится к тому, что сказано о синглтон-паттерне: должен использоваться, но не на всем.

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

Йорис Мейс
источник
6
@Craige: я сам использую ООП, но в моей области (научных вычислениях) производительность очень важна, и ООП там часто злоупотребляют, так как в настоящее время все студенты получают Java. Это отлично подходит для решения более крупных проблем, для концептуализации и так далее. Но если вы работаете, например, с последовательностями ДНК в BioPerl, использование объектов каждый раз и работа с геттерами и сеттерами может увеличить время расчета в десять раз. Когда ваш код выполняется несколько дней вместо нескольких часов, эта разница действительно имеет значение.
Йорис Мейс
1
@Craige: Метод цепочки (вроде Foo.DoX().DoY().DoZ()) хорош, но, безусловно, это не единственный способ что-то сделать. Композиция функций (например, doZ . doY . doX $ fooявляется вполне допустимой альтернативой.
Anon.
1
@Joris: что-то, о чем я долго думал (я биоинформатик): если производительность так важна, зачем использовать Perl, а не C ++? Если вы беспокоитесь о сокращении фактора 10 от времени выполнения (действительное беспокойство!), То переход на C ++ дает вам мгновенное удовлетворение. Конечно, язык отстой ... но тогда, как и Perl ... и есть хорошие библиотеки биоинформатики для C ++.
Конрад Рудольф
1
@ Конрад: Это зависит. В BioPerl, пожалуй, самое большое количество пакетов для биоинформатиков из всех языков (я думаю, что Python наверстывает упущенное). Кроме того, в Perl была проделана большая работа, и адаптировать скрипт проще, чем переписывать все на C ++. И, наконец, он не предназначен для написания полного приложения, когда будет работать скрипт. Думаю, именно поэтому Perl все еще так много. И если честно, я не против, мне нравится язык. Это все еще лучшее, что я знаю для работы со строками и файлами. Расчеты, очевидно, выполняются на других языках и связаны по ссылкам (что довольно просто).
Йорис Мейс
1
@ Конрад: это зависит от того, как это сделать. Все возможно в Perl, но Perl можно легко связать с другими инструментами, особенно в Linux. Я часто использую Perl в качестве продвинутого bash-скрипта с сильным манипулированием строками и простым построением наборов данных, которые можно перенести в другие приложения.
Йорис Мейс
27

Проведя несколько лет в ASP.NET Webforms, я бы сказал однозначно:

Умный интерфейс

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

Стив Сандерсон объясняет этот анти-паттерн гораздо лучше, чем я, в его книге Pro ASP.NET MVC:

Чтобы создать приложение Smart UI, разработчик сначала создает UI, обычно перетаскивая серию виджетов UI на холст, а затем заполняет код обработчика событий для каждого возможного нажатия кнопки или другого события UI. Вся логика приложения находится в этих обработчиках событий: логика, позволяющая принимать и проверять ввод данных пользователем, осуществлять доступ к данным и их хранение, а также обеспечивать обратную связь путем обновления пользовательского интерфейса. Все приложение состоит из этих обработчиков событий. По сути, это то, что имеет тенденцию выходить по умолчанию, когда вы ставите новичка перед Visual Studio. В этом дизайне нет разделения интересов вообще. Все слито воедино, организовано только с точки зрения различных событий пользовательского интерфейса, которые могут произойти. Когда логика или бизнес-правила должны применяться в более чем одном обработчике, код обычно копируется и вставляется, или определенные случайно выбранные сегменты разлагаются на статические служебные классы. По стольким очевидным причинам этот тип шаблона проектирования часто называют анти-шаблоном.

richeym
источник
1
GUI - это, по крайней мере, какой-то код спецификации, которого необходимо придерживаться. Я не думаю, что программисты, которых он описывает, сделают лучше, если вместо этого представят пустой текстовый файл.
4
@qpr, я не знаю об этом. Если бы у них был пустой текстовый файл, они могли бы ничего не делать (что может быть просто бонусом).
Кен Хендерсон
Одним из многих преимуществ использования WPF является то, что реализация MVVM разбивает этот анти-шаблон на кусочки.
Роберт Россни
2
Тысячу раз это. Я даже вижу опытных разработчиков .NET, которые полагаются на этот «шаблон», потому что это легче, чем понимать или заботиться о разделении проблем. Даже если они не используют мастера перетаскивания, наиболее распространенный «шаблон» в разработке .NET WebForms - делать все в событиях с выделенным кодом и при необходимости копировать / вставлять код.
Уэйн Молина
23

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

if (someCondition == true)
Corey
источник
16
У него есть преимущество в том, чтобы сделать код более явным
Pemdas
7
Я думаю, что взгляд на этот вопрос в порядке: programmers.stackexchange.com/questions/12807/…
gablin
5
Я этого не делаю, но, серьезно, переживу это. Там чертовски много хуже там. :)
MetalMikester
4
Если вы правильно назвали свои переменные, например, boolначиная с isили has, вам не нужно делать код более явным с помощью = true.
Никто
3
@DisgruntledGoat, потому что он вообще не должен использоваться
Кори
19

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

l0b0
источник
2
Обучение является исключением. При изучении чего-либо часто полезно «изобретать велосипед».
Maxpm
Наверняка - я должен был указать, что это актуально только при создании производственного программного обеспечения.
10
1
Это особенно плохо при реализации всего, что связано с безопасностью. Хорошее программное обеспечение безопасности предотвращает атаки, о которых большинство людей даже не задумываются.
Дэвид Торнли
Я вижу этот путь слишком распространенным. Нам нужен X, давайте напишем наш собственный! Но как насчет пакета с открытым исходным кодом Y? Нет, нам нужно специальное программное обеспечение для наших сверхсекретных коммерческих секретов, которые такие же, как и все остальные в нашей отрасли, мы не можем использовать обычное программное обеспечение для мусора!
Уэйн Молина
18

Наследование.

Не навязывайте это там, где это не имеет смысла.

Комплект
источник
6
Проблема в том, что интуитивно кажется, что «есть-а» очень часто имеет смысл (в частности, поскольку каждое отношение реализации / контракта может быть в разговорной речи выражено как «есть-а»). Требуется твердое понимание ООП, чтобы понять, что это на самом деле ошибка, и что наследование и реализация интерфейса принципиально отличаются.
Конрад Рудольф
@ Конрад - согласен абсолютно. Я стараюсь побуждать людей начинать с композиции , переходить к интерфейсам и рассматривать наследование в последнюю очередь. (Как правило, конечно). Но, может быть, это мой опыт общения с VB ... ;-)
Майк Вудхаус
1
Это в основном вопрос языкового дизайна. Причина, по которой вы должны «предпочесть композицию наследованию (реализации)» в таких языках, как Java или C #, заключается в том, что в этих языках наследование реализации отстой. Некоторые критикуют конструкцию объектно-ориентированного программного обеспечения Бертрана Мейера за чрезмерное использование наследования, но когда вы на самом деле смотрите на Eiffel (язык, используемый в книге), вы понимаете, что он был разработан для наследования реализации , и, таким образом, на самом деле можно использовать наследование над состав. В таком случае, по крайней мере.
Йорг W Mittag
14

Настройка готового программного обеспечения.

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

JB King
источник
Разве это не более вероятно в случае с пользовательским приложением?
JeffO
13

Использование компилятора в качестве отладчика.

Игнорирование предупреждений компилятора или их полное отключение.

Глобальные переменные.

Pemdas
источник
18
Что не так с «использованием компилятора в качестве отладчика»? Наличие компилятора, способного указывать на ошибки в вашем коде до того, как они станут проблемой во время выполнения, является огромным преимуществом.
Мейсон Уилер
3
Я полагаюсь на то, что компилятор улавливает мои синтаксические ошибки и некорректные ошибки соответствия типов. Для поведенческих ошибок я полагаюсь на контрольные примеры.
Габлин
5
Проблема в том, что вы начинаете зависеть от компилятора для обеспечения корректности программы. Это скомпилировано? Нет, позвольте мне заглянуть в этот маленький раздел и посмотреть, исправит ли это. Это скомпилировано? Нет, позвольте мне добавить * здесь и там и посмотреть, если компилируется. ... ЭСТ. Очевидно, это полезно для исправления опечаток
Pemdas
2
Вы говорите так, как будто кодер слепо ковыряется в темноте, пытаясь что-то сделать - что угодно - чтобы заставить код каким-то образом скомпилироваться. Это не так, как работает IME; компилятор дает вам полезное сообщение об ошибке и указывает на место ошибки, и обычно, если что-то не компилируется, это новый код, который вы написали сами, так что у вас есть довольно хорошее представление о том, что не так и как исправить это, как только оно было указано вне. (Хотя, если вы подбрасываете случайные *, вы можете работать в C ++, где ошибки компилятора, как известно, крайне бесполезны, поэтому то, что я сказал, может не применяться.)
Mason Wheeler
3
Опора на компилятор работает очень хорошо, учитывая достаточно сильную систему типов и хорошо типизированную кодовую базу. Часто система типов может моделировать важные ограничения, для которых в противном случае вам пришлось бы писать тесты (например, в системах со слабым типом). При правильном использовании компилятор (и особенно его средство проверки типов) является отличным ресурсом для тестирования и отладки, и нет ничего плохого в том, чтобы полагаться на него. В частности, неправильно говорить, что компилятор может показывать только синтаксические ошибки.
Конрад Рудольф
11

Все шаблоны дизайна.

Они похожи на соль или сахар. Некоторые из них на вашей еде делают это здорово, многие из них делают вашу еду отстойной.

Не пойми меня неправильно. Шаблоны дизайна - это замечательные приемы. Я использовал их много. Но иногда я нахожу программистов (некоторые из них мои бывшие начальники), у которых были такие «вы должны использовать шаблон проектирования», даже если это не соответствует проблеме !!!

Одним из примеров является «Шаблон посетителя», который больше ориентирован на «Линейные / последовательные коллекции». Мне приходилось работать с древовидной структурой данных, один раз. Чтобы «посетить» каждый предмет, я кодирую не шаблонный метод, а бывший босс настаивает на использовании или адаптации «Шаблонов посетителей». Затем я просматриваю сеть, для второго мнения. Ну, другие программисты имели ту же ситуацию и то же решение. И назовите его «Tree / Hierarchical Visitor Pattern»., Как НОВЫЙ шаблон проектирования

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

оборота umlcat
источник
3
Я никогда не использую шаблоны проектирования, хотя они иногда появляются естественным образом в моем коде.
конфигуратор
Как говорится? Вы начинаете использовать шаблоны, не зная, что используете их, затем вы узнаете о них и используете их повсюду, затем они становятся второй натурой, поэтому вы начинаете использовать их, не зная, что вы их используете?
Уэйн Молина
2
@configurator Когда я читаю о шаблонах дизайна; Я также обнаружил, что я и другие разработчики уже использовали некоторые из них ;-)
umlcat
9

Использование исключений в качестве управления потоком. Вроде как на этот ответ , но разные.

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

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

Бобби Столы
источник
Создание исключений для неэффективного кода зависит от вашего языка - создание фрейма стека и т. Д. В Squeak ваш стек полностью усовершенствован, поэтому нет никакой разницы между использованием исключений или нет. (Другими словами, исключения являются частью библиотеки, а не языка.) Однако работа с потоком управления, контролируемым исключениями, сбивает с толку : lshift.net/blog/2011/01/04/try-again-with-exceptions показывает исключения использования цикла, которые я недавно нашел.
Фрэнк Шеарар
Что касается последнего абзаца, опять же, это зависит от вашего языка. Исключения («условия») в Common Lisp представляют собой строгую надстройку представлений большинства языков об исключениях. Смотрите примеры здесь: gigamonkeys.com/book/… Как и во всем, вы можете зайти слишком далеко!
Фрэнк Шиарар
Читаемость и ремонтопригодность перевешивают производительность. Случаи, когда я буду использовать исключения для успеха (то, что вы подразумеваете под «управлением потоком»), очень редки, но они могут дать более чистый код, например, при сложном рекурсивном поиске. В целом, я согласен, хотя. Например, у меня есть контейнеры с методами итератора, которые возвращают значение false для выхода за пределы диапазона (обычно в конце итерации), но выдают исключение, если итератор имеет значение «ноль» (вероятный признак некоторой внутренней несогласованности)
Steve314
7

Я собираюсь пойти с негибкостью через чрезмерное сокрытие данных.

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

Проблема в том, что, как и в случае с поиском правильного баланса для каждого контекста, требуется опыт.

Steve314
источник
7

Экспонирование внутренних массивов

    public class Data {
    int[] x;

    public void setArray(int[] x) {

        this.x = x;
    }

    public int[] getArray() {

        return x;
    }
}

Согласно http://www.oracle.com/technetwork/java/seccodeguide-139067.html

перед возвратом скопируйте изменяемые объекты, если только вы не собираетесь делиться состоянием

Vivart
источник
6

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

Например, это берется непосредственно из потока StackOverflow:

// ECMAScript
var thing, things_by_type = {};
for (var i = 0; i < things.length; i++) {
    thing = things[i];
    if(things_by_type[thing.type]) {
        things_by_type[thing.type].push(thing);
    } else {
        things_by_type[thing.type] = [thing];
    }
}

# Ruby
things_by_type = {}
things.each do |thing|
  (things_by_type[thing.type] ||= []) << thing
end

Они оба делают одно и то же. Но я понятия не имею, что они делают. К счастью, вопрос на самом деле объясняет, что они делают, поэтому я смог переписать их следующим образом:

// ECMAScript
things.reduce(function (acc, thing) {
    (acc[thing.type] || (acc[thing.type] = [])).push(thing);
    return acc;
}, {});

# Ruby
things.group_by(&:type)

// Scala
things groupBy(_.type)

// C#
from thing in things group thing by thing.Type // or
things.GroupBy(thing => thing.Type);

Там нет петель и нет изменяемого состояния. Ну, ладно, никаких явных циклов и счетчиков циклов.

Код стал намного короче, намного проще, намного больше похож на описание того, что код должен делать (особенно в случае с Ruby, он почти прямо говорит «группировать вещи по типу»), и гораздо менее подвержен ошибкам. Нет опасности убежать от конца массива, ошибок столба или ошибок «один за другим» с индексами цикла и условиями завершения, потому что нет никаких индексов цикла и условий завершения.

Йорг Миттаг
источник
Я действительно считаю, что во второй строке вашего «исправленного» ECMAScript следует читать (acc[thing.type] || (acc[thing.type] = [])), а не «= [вещь] , unless you want to add вещь» в списке дважды ... Или я что-то упустил?
Остин Хайд
@ Остин Хайд: Вы правы.
Йорг Миттаг
1
Этот пример ecmascript непонятен многим программистам. Он опирается на слишком много синтаксических трюков. Цикл имеет преимущество очевидности для начинающих разработчиков.
Джори Себрехтс
6

Дразнящий. Он вводит слишком много искусственных требований для чрезмерной развязки в вашем коде, приводит к чрезмерно усиленному коду равиоли и вынуждает дизайн в стиле OO урезать вам горло, когда более процедурный или функциональный дизайн может быть более простым решением вашей проблемы.

dsimcha
источник
Согласился в теории; издевается полезны , но вы не должны иметь их.
Уэйн Молина
Инвазивность насмешек зависит от языка, который вы используете. В C # это может быть очень агрессивно и добавляет плоты ненужных интерфейсов.
Фрэнк Хилман,
3

За последние два года программисты на Delphi со всего мира узнали, как плохо использовать массивы символов для хранения байтов из-за оптового преобразования Unicode.

И «скоро» мы узнаем, как плохо хранить целые числа в списках, когда мы хотим внести изменения в 64-разрядные.

Питер Тернер
источник
2
Я думаю, что огромная часть проблем с Unicode никогда бы не возникла, если бы Borland объявил тип DataString, который был в основном таким же, как AnsiString, но специально для использования с BLOB-объектами, а затем убедился, что люди об этом знают.
Мейсон Уилер
2

Свойства. Я знаю, что это противоречиво, но я чувствую, что свойства очень сильно используются в .net.

В чем разница между этими двумя строками?

public string Property { get; set; }

public string Field;

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

конфигуратор
источник
1
Согласовано; если вы знаете 100%, вам никогда не понадобится ничего делать с получением / установкой «свойства», тогда нет никаких оснований иметь свойство. Однако, если есть вероятность, что вам нужно что-то сделать (например, записать, что значение было изменено), вам следует использовать свойство. Лично я не вижу достаточно большой разницы , чтобы не использовать свойство, только в случае , если вы делаете необходимость изменить его позже (я знаю, я знаю , YAGNIно я чувствую , отклоняясь в этом случае не стоит ничего)
Уэйн Molina
2
@Wayne: Как меняется ;на { get { ... } set { ... } }любой больше работы , чем изменения { get; set; }в { get { ... } set { ... } }?
конфигуратор
Теперь, когда я думаю об этом, это справедливо.
Уэйн Молина