Насколько плох этот код?
Я унаследовал приложение онлайн-викторины, написанное на C#, с этими строками кода повсюду.
Так насколько плох этот код?
С какими потенциальными проблемами я могу столкнуться?
Как я мог улучшить это?
Код:
strTestPasses += "<tr valign=\"top\"><td><b>Subject</b></td><td>" + ((Hashtable)((ArrayList)((Hashtable)MultipleTestPasses[i])["HasMultipleDataSet"])[j])["subject"] + "</td></tr>";
12 ответов
Я также ненавижу эти "строки кода". Когда люди спрашивают меня: "Какой самый большой проект, над которым вы работали", я отвечаю "1 строка кода". Когда другие бросают мне вызов: "Сколько строк кода вы можете написать в день?", Я отвечаю им: "Только один мой брат. Но это единственная верная линия
Чтобы начать рефакторинг, могу я предложить:
TestPassesBuilder.AppendFormat(
"<tr valign='top'><td><b>Subject</b></td><td>{0}</td></tr>",
MultipleTestPasses[i]["HasMultipleDataSet"][j]["subject"]
);
или же
TestPassesBuilder.AppendFormat(
"<tr valign='top'><td><b>{0}</b></td><td>{1}</td></tr>",
"Subject",
MultipleTestPasses[i]["HasMultipleDataSet"][j]["subject"]
);
куда TestPassesBuilder
конечно же StringBuilder и MultipleTestPasses
был преобразован для использования соответствующих универсальных типов коллекций, а не мерзости ArrayList/HashTable. Второй вариант также позволит в какой-то момент заголовок для каждой строки быть разложен в переменную.
Для следующего шага MultipleTestPasses должен быть преобразован в реальный объект. Поскольку похоже, что он использует жестко закодированные ключи, каждый "ключ" действительно соответствует свойству класса.
Опять же, как субъективный ответ на субъективный вопрос, это не красиво. Опять же, если это небольшой сайт, возможно, было бы проще сделать это "быстро и грязно", чем что-то более правильное, например, C# / ASP -> XML -> XSLT -> HTML (или что-то подобное линии в любом случае - я немного цепляюсь за соломинку)
Это не здорово, но я видел хуже.
Чтобы никого не шокировать комой или другим неприятным эпизодом, я воздержусь от публикации каких-либо примеров.
Вы знаете, как они говорят "... только мать могла любить..."
Ну, в этом случае, только компилятор может любить.
Это не так уж плохо на самом деле. Очевидно, что программист не ожидал, что кто-то когда-нибудь возьмет на себя его проект (отсутствие профессионального опыта), но не должно быть трудно преобразовать эти общие хэш-таблицы и массивы в нечто более значимое.
Также при рефакторинге используйте строковые литералы с @ для html.
Мне лично все равно, использует ли он какие-либо шаблоны для html, если это маленький проект. Шаблоны часто для небольших проектов излишни.
Не зная ничего о размере и объеме кодовой базы, я вижу две вещи, которые действительно беспокоят меня об этой строке кода.
- HTML-макет не отделен от контента.
- Тема должна быть возвращена из описательно названной функции.
Я бы предпочел увидеть что-то вроде:
strTestPassesStringBuilder.Append(newTableRow("Subject", getSubject());
где параметры и valign контролируются с помощью CSS.
Это очень плохо, так как содержит следующие недостатки:
- конкатенация строк, тогда как StringBuilder или шаблон View могут быть намного лучше
- Просмотр информации (например, HTML) на уровне, не связанном с пользовательским интерфейсом (вероятно)
- Неоднозначная бизнес-логика ("HasMultipleDataSets")
- Нетипизированные наборы данных (значение индекса столбца - строка)
- Слишком много в одной строке кода
((Hashtable)((ArrayList)((Hashtable)MultipleTestPasses[i])["HasMultipleDataSet"])[j])["subject"]
Ох... мои глаза...