Какая практика программирования, которая вам когда-то нравилась, вы изменили? [закрыто]

99

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

Пример практики, которую я когда-то использовал довольно часто, но в последние годы изменился, - это использование шаблона объекта Singleton .

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

Мои вопросы к сообществу в духе самосовершенствования:

  • Какие шаблоны или практики программирования вы недавно пересмотрели и теперь стараетесь избегать?
  • Чем вы решили их заменить?
Л.Бушкин
источник

Ответы:

159


//Coming out of university, we were taught to ensure we always had an abundance 
//of commenting around our code. But applying that to the real world, made it 
//clear that over-commenting not only has the potential to confuse/complicate 
//things but can make the code hard to follow. Now I spend more time on 
//improving the simplicity and readability of the code and inserting fewer yet 
//relevant comments, instead of spending that time writing overly-descriptive 
//commentaries all throughout the code.


Люк Баулч
источник
+1. Я собирался опубликовать тот же ответ. Несколько недель назад я нашел некоторые из моих старых заданий по программированию на архивном диске. Все выглядело одинаково. Соотношение строк комментариев и строк кода было почти 1: 1.
Майкл Мусса,
32
Похоже, вы неправильно прокомментировали , не слишком много. Код не говорит сам за себя. Нет, это действительно не так. Прочтите последнюю версию NT Insider, чтобы получить хорошую тираду об этом. Если вы думаете, что комментарии будут излишними, то вы либо ошибаетесь, либо делаете это неправильно. Кажется, университеты не учат правильному комментированию (или отслеживанию ошибок, или контролю версий ... * вздох *). Там слишком мало комментариев. (и меньше хороших)
Томас
5
В Code Complete есть хорошие советы по комментированию и данные для их резервного копирования.
Thomas
20
Комментарии должны использоваться для описания того, почему код делает то, что он делает (если это не очевидно), а не то, что делает код. Возможное исключение - сумасшедший тиддлинг / языковой хак, вроде магического числа Кармака 0x5f3759df.
Крис Симмонс,
6
@Thomas: Я лично считаю, что проблема в том, что обучение хорошему комментированию - это не то, что университет может показать студентам. Практически все программы в школах разовые; студенты не получают опыта, оглядываясь на код, который они написали год назад, и совсем не понимают его. Кроме того, классы нижнего уровня преподают действительно простые концепции кодирования - комментирование на этом уровне почти всегда утомительно из-за того, что происходит. Другими словами, это все равно, что пытаться научить кого-то плавать в бассейне; это просто неподходящий контекст для понимания движений.
Дэн Лью
117

Единичные точки возврата.

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

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

Карл Манастер
источник
3
Я согласен, в сочетании с типами данных, которые автоматически очищаются, такими как autoptr, scoped_ptr, CComPtr и т. Д.
i_am_jorf 07
3
Очистка кода
@banjollity: кроме языков, которые не поддерживают finally {}. И обратите внимание, что даже в языках, которые его поддерживают, finally {} не ВСЕГДА гарантированно выполняется.
Chris K
1
@banjollity, Крис: В C ++ деструктор предназначен для очистки, и, за исключением крайних случаев (exit (), деструктор генерирует исключение во время раскрутки стека, белки сокращают вашу мощность), он гарантированно запускается.
Дэвид Торнли
4
Согласовано. Замените вложенные условия на защитные предложения ftw!
Jonik 01
111
  • Пытаться идеально кодировать с первой попытки.
  • Попытка создать идеальную объектно-ориентированную модель перед написанием кода.
  • Все проектируется с учетом гибкости и будущих улучшений.

Одним словом сверхинженерия .

оборота вууб
источник
6
Подождите, у меня всегда получается с первой попытки. :)
i_am_jorf 07
18
Настоящие деньги заключаются в том, чтобы с первого раза сделать неуловимую ошибку и выпустить на волю. Затем, когда люди привыкли к обдуманной версии, проявите высокомерие и исправьте ошибку / неэффективность, чтобы получить дополнительную славу! ;)
Эрик
7
@jeffamaphone - Нет, только Джон Скит понимает это с первого раза.
Jordan Parmer
Мне нравится слово «сверхинженерия»
Нилверт Новаль
@jeffamaphone - У меня тоже всегда получается с первой попытки. Но дальнейшие попытки дают то, что мне нужно :)
umbr 07
78

Венгерская нотация (как формы, так и системы). Раньше я все ставил префиксом. strSomeString или txtFoo. Теперь я использую someString и textBoxFoo. Это гораздо более читабельно и легче для кого-то нового. В качестве дополнительного бонуса сохранить его единообразие тривиально - используйте camelCase для элемента управления и добавьте полезное / описательное имя. У Forms Hungarian есть недостаток, заключающийся в том, что они не всегда последовательны, а Systems Hungarian не особо помогает. Объединение всех ваших переменных вместе не так уж и полезно, особенно с современными IDE.

Кенни Манн
источник
А как насчет языков с динамической типизацией, таких как Python или JavaScript? Я по-прежнему считаю полезным использовать венгерскую нотацию в этих языках, чтобы, глядя на переменные, я знал, какой тип переменной ожидать (если есть тип, которого следует ожидать - конечно, было бы безрассудно обрабатывать язык с динамической типизацией в точности как статически типизированный язык.)
Дэн Лью,
4
Я делаю то же самое, за исключением того, что fooTextBox и строка, надеюсь, очевидны: numberOfEntries => int, isGreat => bool и т. Д.
rball
+1 за избавление от венгерской нотации. Я согласен с rball; fooTextBox, fooService, fooString, когда это действительно необходимо.
blu
3
@ wuub: Я бы сказал, что при правильном именовании вам не нужно ничего добавлять в префиксы.
Kenny Mann,
4
Кстати то, что вы упомянули, не совсем венгерское.
Энтони Карти,
67

«Идеальная» архитектура

Я придумал эту архитектуру пару лет назад. Я продвинулся технически так далеко, как мог, чтобы были 100% слабосвязанные слои, широкое использование делегатов и легкие объекты. Это был технический рай.

И это было чушь. Техническая чистота архитектуры только замедлила мою команду разработчиков, стремясь к совершенству, а не к результатам, и я почти добился полного отказа.

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

Брюс МакЛеод
источник
57

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

Alex
источник
55
Вам нужно выпить еще больше кофе. Если это не сработает, продолжайте курить.
MusiGenesis 07
7
Брэд: Когда у вас есть Python, они вам не нужны: xkcd.com/353
Питер,
Хорошая ссылка на рождественскую историю! :-)
Steve Echols
2
Я сломал эту привычку, а затем снова начал ее снова, несколько раз (это мой третий цикл). Нет ничего лучше кодирования холодным утром с теплой кружкой кофе!
Мэтью Иселин,
15
«Похоже, я выбрала не ту неделю, чтобы отказаться от амфетаминов».
ShreevatsaR
50

Комментируем код. Раньше я думал, что код драгоценен, и что вы не можете просто удалить те прекрасные драгоценные камни, которые вы создали. Теперь я удаляю любой закомментированный код, с которым я сталкиваюсь, если только там нет TODO или NOTE, потому что оставлять его слишком опасно. Я встречал старые классы с огромными закомментированными частями, и меня действительно смущало, почему они были: были ли они недавно закомментированы? это изменение среды разработки? почему он делает этот несвязанный блок?

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

коричневый
источник
6
Я комментирую старый код во время рефакторинга, но только до тех пор, пока не проверю, что код замены работает. Когда новая версия станет полностью работоспособной, я удаляю старые закомментированные строки.
muusbolla
Действительно - я тоже комментирую код, но только на несколько дней. Если я вернусь и пойму, что кое-что пропустил, он будет удален до того, как будет работать над новым кодом.
Colin Mackay
4
Я говорю, проверьте закомментированный код один раз, ТОГДА удалите его. Много раз, когда вы тестируете разные части кода, и вы не хотите проверять битый код ...
DisgruntledGoat
Не говоря уже о том, что контроль версий - ваш друг.
Дэвид Торнли,
+1 Я работал с программистом, который настаивал на комментировании всего кода, который он реорганизовал или переписал. Это сводило меня с ума, потому что иногда мне приходилось пролистывать более 1000 строк дерьма, чтобы найти то, над чем я работаю.
Evan Plaice
46

Чрезмерное использование / злоупотребление директивами #region. Это просто мелочь, но раньше в C # я бы повсюду использовал директивы #region для организации своих классов. Например, я бы сгруппировал все свойства класса вместе в регионе.

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

Скотта Фергюсона
источник
31
Ненавижу регион. Люди в моей команде используют их легкомысленно. Я называю их «скрывающими плохой код».
rball 06
9
Это определенно запах кода.
Франк Швитерман, 06
3
Я НЕНАВИЖУ регионы. В настоящее время я поддерживаю код, в котором функция составляет почти 500 строк, и для управления им умный разработчик разместил фрагменты кода в 10-15 регионах.
SolutionYogi
6
@Solution Yogi: Я не думаю, что регионы являются реальной проблемой в вашем случае :-)
Эд С.
9
Я думаю, что регионы могут быть прекрасными, если их использовать экономно.
Грегори Хигли,
39

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

Поль Сонье
источник
3
Скажите , что мой клиент ... Я в середине написания некоторых бесполезно «Я программист с хрустальным шаром , так что я точно знаю , как мой дизайн низкого уровня будет выглядеть в течение 6 месяцев» спецификация документа :)
Игорь Брейц
36

Никогда не рушится.

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

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

Мой любимый шаблон "не сбои" таков:

public User readUserFromDb(int id){
    User u = null;
    try {
        ResultSet rs = connection.execute("SELECT * FROM user WHERE id = " + id);
        if (rs.moveNext()){
            u = new User();
            u.setFirstName(rs.get("fname"));
            u.setSurname(rs.get("sname"));
            // etc
        }
    } catch (Exception e) {
        log.info(e);
    }
    if (u == null){
        u = new User();
        u.setFirstName("error communicating with database");
        u.setSurname("error communicating with database");
        // etc
    }
    u.setId(id);
    return u;
}

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

оборота gustafc
источник
Какова вероятность того, что пользователь выдаст вам фактическое сообщение об ошибке, по сравнению с вашими журналами, вызывающими проблему? (Очень низкий в данном конкретном случае, но пользователи почти никогда не цитируют сообщения об ошибках!) Они вообще их читают?
Арафангион,
1
Я допускаю, что вероятность того, что случайный пользователь отправит вам сообщение об ошибке, мала, но вероятность отлична от нуля (тривиальный пример: иногда вы используете свое собственное приложение), и некоторые пользователи со временем узнают, что копировать / вставлять. Я не говорю , что вы не должны войти (вы должны), но когда приложение разбито, оно будет нарушено. Показывать сообщение об ошибке гораздо лучше, гораздо честнее для пользователя, чем делать вид, будто имя пользователя - «ошибка связи с базой данных» (или, что еще хуже, nullили пустая строка).
gustafc
Во второй строке есть
исключение NullReferenceException
Спасибо, о, я исправил. (Хотя с этим там было немного хуже: все эти проблемы, чтобы избежать исключений и других "сбоев", и все же он безоговорочно
вылетал
33

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

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

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

molf
источник
2
Прошу извинить меня за незнание рубина, но почему бы нам не использовать с ним фабричный паттерн?
Майк Чемберлен,
Здесь не rubyist, но factory должен избегать зависимости от реализации, но ruby ​​динамичен, и вы можете имитировать или заглушить что угодно. Так что на самом деле вы не зависите от реализации.
Стефан
27

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

Действительно, рабское соблюдение чего-либо может нанести вред.

Yalestar
источник
22
Это очень хорошо работает с ракушками.
MusiGenesis 07
Охват тестированием должен быть пропорционален выгоде. Все, что вы делаете, действительно должно приносить пользу. 100% покрытие не даст вам всего этого. отличие от 80 или 90 в форме, которой нет в сценарии жизнеобеспечения / запуска ракет.
Spence
+1 зависимость от модульного тестирования в отличие от тестирования.
Preet Sangha
25

Это мелочь, но: Заботясь о том, где идут фигурные скобки (в той же строке или в следующей?), Предлагает максимальную длину строки кода, соглашения об именах для переменных и другие элементы стиля. Я обнаружил, что все, кажется, заботятся об этом больше, чем я, поэтому я просто плыву в потоке тех, с кем работаю в настоящее время.

Изменить: исключение из этого, конечно, когда я тот, кто заботится больше всего (или тот, кто в состоянии установить стиль для группы). В таком случае я делаю то, что хочу!

(Обратите внимание, что это не то же самое, что отсутствие согласованного стиля. Я думаю, что согласованный стиль в кодовой базе очень важен для удобочитаемости.)

Дэниел Лью
источник
5
Кто-то проголосовал против, но я думаю, что это практическая перспектива. Какой стиль кода лучше всего? Не важный. Посмотрите вверх и вниз в одном файле и сделайте копию.
Франк Швитерман, 06
12
Лучший стиль кода - это то, что является стандартом для этого магазина.
Дэвид Торнли,
Вот почему мне нравятся параметры автоматического форматирования в Visual Studio. Неважно, как другие разработчики написали код, я просто быстро форматирую и именно так, как мне это нравится ... в большинстве случаев.
corymathews 07
5
@cory: разве это не мешает вашей программе управления версиями показывать вам разницу между версиями файла, который вы только что переформатировали?
Steve Melnikoff,
Вот почему меня как бы привлекает изучение Python ... я просто должен беспокоиться о том, на что установлены мои табуляторы, а не о стилях крепления. Это довольно убедительно.
Chris K
24

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

Ниппизавр
источник
20

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

На самом деле я просто создал огромное пространство имен с множеством плохо организованных функций.

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

Джеймс Уэмплер
источник
12
Есть хорошая цитата (в настоящий момент я не могу найти оригинал), которая была примерно такой: «Даже не думайте о создании общей процедуры, пока вам не понадобится решить ту же проблему 3 раза».
ДэйвР
9
«Три удара - и ты рефакторинг» - Рефакторинг Мартина Фаулера. Правило трех , стр. 58.
Ник Дандулакис 07
20

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

Пол Натан
источник
44
Иногда я использую фразу: «Если вы обнаружите, что слишком много думаете, остановитесь и делайте. Если вы обнаружите, что делаете слишком много, остановитесь и подумайте».
Нил N
Это хорошо, но сколько это уже перебор?
Hamish Grubijan 03
Слишком большая зависимость от UML (бесполезный язык моделирования). Он иногда имеет свои преимущества. Но как только я вижу, что кто-то начинает рисовать диаграммы классов и проповедовать о преимуществах «как здорово было бы генерировать код из диаграмм», я зашнуровываю свои кроссовки. Кроме того, Visual Studio имеет встроенный интерактивный генератор диаграмм классов, который делает все это автоматически и работает как обозреватель объектов при взломе.
Evan Plaice,
15

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

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

Эрик Шнайдер
источник
15

Сокращение переменной / метода / таблицы / ... Имена

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

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

Рис Джонс
источник
Да, надо любить такие типы объявлений: void Foo (x1, y, x2, y2, p, r, j) ... WTF ?!
Эд С.
Или того хуже (и да, я действительно видел это) и Foo(int arg0, String arg1, float arg2)т. Д.
Mac
14

Обертывание существующих компонентов доступа к данным, таких как Enterprise Library, настраиваемым уровнем вспомогательных методов.

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

Я впервые услышал об объектно-ориентированном программировании, когда читал о Smalltalk в 1984 году, но у меня не было доступа к oo-языку, пока я не использовал компилятор cfront C ++ в 1992 году. Я наконец-то смог использовать Smalltalk в 1995 году. Я с нетерпением ожидал oo технологии, и поддержал идею, что это спасет разработку программного обеспечения.

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

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

Грег Грэм
источник
13

В C # используется _notationдля закрытых членов. Теперь я думаю, что это некрасиво.

Затем я изменил на this.notationдля частных участников, но обнаружил, что использую его непоследовательно, поэтому отказался и от этого.

JulianR
источник
29
Я все еще использую _notation и считаю, что это здорово.
Арнис Лапса
3
Я ненавижу _notation; Я использую ThisNotation для публичных участников и thisNotation для частных.
Каллум Роджерс
Я тоже это ненавижу. Это меня смущает :(
Broken_Window 04
4
Я не согласен. Это значительно упрощает управление именами. Используйте PascalCase для свойств или общедоступных / внутренних членов, _UnderscorePascalCase для членов, которые предоставляются через свойство, и camelCase для имен параметров в методах / конструкторах и закрытых членах. Ключевое слово this необходимо только в том случае, если вам нужно передать ссылку на текущий класс за пределы класса или вам нужно получить доступ к автоматически сгенерированному члену внутри класса (например, имя, элементы управления и т. Д.).
Evan Plaice
@Evan: Я делаю именно то, что вы описываете, за исключением последней части. Я обычно использую thisили Me(соответственно C # и VB.NET) при вызове методов и свойств. ИМО, это облегчает чтение и понимание моего кода позже, особенно когда в этой конкретной области есть четыре или более объекта.
Alex Essilfie
11

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

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

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

ralphtheninja
источник
10

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

Франк Швитерман
источник
Меня учили так программировать. Конечно, меня учил учитель математики HS, поэтому я полагаю, имеет смысл, что он хотел, чтобы все его функции проверяли себя самостоятельно.
Alex
10

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

Rball
источник
10

Проверенные исключения

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

Конечно, на практике получился такой бардак. До такой степени, что сегодня есть библиотеки, такие как Spring JDBC, в котором скрытие устаревших проверенных исключений является одной из основных функций.

Григорий Мостицкий
источник
9

Что-нибудь стоящее было закодировано только на одном конкретном языке. В моем случае я считал, что C - лучший язык на свете, и у меня никогда не было причин кодировать что-либо на каком-либо другом языке ... никогда.

С тех пор я начал ценить много разных языков и их преимущества / функциональность. Если я хочу написать что-то маленькое - быстро - я бы использовал Python. Если я хочу работать над большим проектом, я буду писать код на C ++ или C #. Если я хочу развить опухоль мозга, я буду писать код на Perl .

оборота Патрик Грычук
источник
8

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

Инь
источник
я могу вспомнить, сколько раз это меня
укусило
8

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

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

Лиам
источник
7

Инициализация всех членов класса.

Раньше я явно инициализировал каждый член класса чем-нибудь, обычно NULL. Я понял, что это:

  • обычно означает, что каждая переменная инициализируется дважды перед чтением
  • это глупо, потому что в большинстве языков переменные автоматически инициализируются значением NULL.
  • фактически приводит к небольшому снижению производительности на большинстве языков
  • может раздувать код в больших проектах
Ниппизавр
источник
4
Иногда последствия НЕ инициализации всех членов класса могут действительно укусить вас за $$.
muusbolla
Если только вы не используете язык на основе прототипов, который создает новые экземпляры путем клонирования. Инициализация всех участников действительно может избавить вас от многих проблем.
Wojciech Bederski,
6

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

Короче говоря, я использую «мини» фреймворки, чтобы помочь в создании программного обеспечения более быстро и эффективно. Эти мини-фреймворки экономят много времени и, если все сделано правильно, могут сделать приложение очень простым в обслуживании в будущем. Подключи и играй для победы!

ajawad987
источник
-1 Я терпеть не могу разрастание IoC и фреймворков. Развязка хорошая, IoC и фреймворки = ненужная сложность
Пол Холлингсворт,
Как можно хвалить разделение и при этом ненавидеть IoC и другие фреймворки? Именно этим и занимаются многие фреймворки и шаблоны проектирования IoC.
ajawad987 08