Подтвердить что ты не робот

.net читаемость и ремонтопригодность кода

В настоящее время существует местная дискуссия о том, какой код более читабельен

У нас есть один программист, который приходит с фона c, и когда этот код программиста выглядит как

string foo = "bar";

if (foo[foo.Length - 1] == 'r')
{

}

У нас есть еще один программист, который не любит эту методологию и предпочитает использовать

if (foo.EndsWith("r"))
{

}

какой способ выполнения этих типов операций лучше?

4b9b3361

Ответ 1

EndsWidth более читабельна для тех, кто никогда не видел C или С++, С# или любого другого языка программирования.

Ответ 2

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

Вот выдержка из моей статьи:

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

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

Ответ 3

Номер 2 лучше читать и читать. Пример: проверьте последние 2 символа...

Вариант 1)

if (foo[foo.Length - 1] == 'r' && foo[foo.Length - 2] == 'a')
{

}

Вариант 2)

if (foo.EndsWith("ar"))
{

}

последние 3? последние 4?...

Ответ 4

Я исхожу из C/С++ фона, и я голосую за Endswith!

Ответ 5

Правила удобочитаемости, особенно если это подразумевает намерение.

В первом примере я должен обнаружить намерение, которое осталось для интерпретации. Если у вас есть ошибка, откуда я знаю, что это не преднамеренно?

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

Ответ 6

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

Ответ 7

Думаю, правильный ответ будет правильным. EndsWith корректно возвращает false для пустого ввода строки, тогда как другой тест генерирует исключение, пытающееся индексировать с -1.

Ответ 8

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

Что делать, если foo == string.Empty?

Ответ 9

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

Ответ 10

EndsWith, вероятно, безопаснее. Но индексатор, вероятно, быстрее.

Endswith, вероятно, проверяет, пуста ли входная строка. Вероятно, они оба выдадут нулевые ссылочные исключения. И indexer будет терпеть неудачу, длина равна 0.

Что касается читаемости,, они оба говорят то же самое для меня, но я программировал какое-то время. .EndsWith(...), вероятно, быстрее понять без учета контекста.

Ответ 11

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

Ответ 12

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

Ответ 13

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

1) Получите доступ к символу в позиции, которая меньше длины, и проверьте, равен ли он символу 'r'

2) Проверьте, заканчивается ли строка "r"

Я думаю, что это дает понять, что является более удобным ответом.

Ответ 14

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

Ответ 15

"Код написан для чтения людьми и, случайно, запущен компьютерами" SICP

EndsWith FTW!!

Доброта,

Dan

Ответ 16

С точки зрения обработки ошибок, EndsWith.

Ответ 17

Я предпочитаю вторую (EndsWith) версию. Это достаточно ясно, чтобы даже мой менеджер понял!

Ответ 18

Лучшая практика - написать код, который легко читается. Если вы использовали первый, разработчики, которые отлаживают ваш код, могут сказать: "Что он пытается сделать?" Вам нужно использовать методы, которые легко объяснить. Если метод слишком сложный для определения, отвлеките несколько методов из него.

Я бы сказал, что второй, разборчивость и простота являются ключевыми!

Кроме того, если оператор if if имеет одну строку, DONT BOTHER ИСПОЛЬЗУЕТ БРАКЫ, ИСПОЛЬЗУЙТЕ ОДИНОЧНОЕ ЗАВЕДЕНИЕ

Ответ 19

Помните, что в классическом C единственное различие между "строкой" и массивом символов заключается в том, что завершение нулевого символа "\ 0", поэтому нам пришлось более активно относиться к ним соответственно и убедиться, что мы не запускали от конца массива. Таким образом, первый блок кода основывает свой мыслительный процесс на понятии массива символов.

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

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

Некоторые из них могут суммировать вклад других в этот момент, но, более точно, вы играете "Bingo()"; или вы "играете в игру с двумерным массивом случайных целых чисел и т.д.?"

Надеюсь, это поможет.

Джим