Запутываемый код C#

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

Однако многие более новые функции C# предлагают удивительную возможность запутать код к. Я задавался вопросом, было ли у кого-либо мнение о нахождении правильного баланса между краткостью и ясностью в коде. Позвольте мне предложить один пример для обсуждения, задачи заполняющихся объектов в ListView. (Да я знаю, что можно сделать это с привязкой данных, но пойти со мной сюда.)

Управление составляет два столбца, чтобы быть заполненным массивом Человека структуры {общедоступное имя строки; общедоступный строковый адрес;};

Один, ясный и простой путь - это:

private void Fill(Person[] people)
{
    foreach(Person person in people)
    {
        string[] columns = new string[2];
        columns[0] = person.name;
        columns[1] = person.address;            
        ListViewItem item = new ListViewItem(columns);
        listView1.items.Add(item);
    }
}

Ясный и простой понять.

Я мог также записать это как это:

private void Fill(Person[] people)
{
    foreach(Person person in people)
    {
        string[] columns = new string[] { person.name, person.address };
        ListViewItem item = new ListViewItem(columns);
        listView1.items.Add(item);
    }
}

или даже:

private void Fill(Person[] people)
{
    foreach(var person in people) // Note use implicit typing here
    {
        listView1.items.Add(new ListViewItem(
        new string[] { person.name, person.address }));
    }
}

Наконец, я мог также записать это как это:

private void Fill(Person[] people)
{
    Array.ForEach(people, item =>
    listView1.items.Add(new ListViewItem(
    new string[] { person.name, person.address}));
}

Каждый использует различные новые функции языка до большей или меньшей степени. Как Вы находите баланс между краткостью и ясностью? У нас должен быть ежегодный Запутываемый конкурс C#?

5
задан Esteban Araya 24 January 2010 в 03:36
поделиться

5 ответов

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

6
ответ дан 18 December 2019 в 05:31
поделиться

код для максимальной читаемости, , но :

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

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

Более конкретно, пример 1 имеет слишком много синтаксического шума для чего-то столь простого. Пример 4 очень сложен для человека для анализа. Я бы сказал, что 2 и 3 являются довольно хорошими, хотя в случае примера 3 я бы немного переформатирую, просто чтобы упростить человеку разобрать все вложенности всех функций:

private void Fill(Person[] people)
{
    foreach(var person in people)
    {
        listView1.items.Add(
            new ListViewItem(
                new string[] { person.name, person.address }
            )
         );
    }
}

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

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

2
ответ дан 18 December 2019 в 05:31
поделиться

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

Разница в том, что все эти примеры на C# находятся на одном уровне абстракции - чем более лаконичные примеры, тем больше удаляется "пуха". В C у вас есть возможность неоднозначности благодаря A) произвольно переименованным/сглаженным конструкциям и B) нескольким уровням доступа к памяти, объединенным в один оператор.

Тогда, в целом, можно исправить непонятный код на ЛЮБОМ языке, но я не думаю, что C# к нему склонен, как к C, и, действительно, я думаю, что это более понятный язык, чем многие - даже при использовании некоторых более продвинутых конструкций.

1
ответ дан 18 December 2019 в 05:31
поделиться

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

"Любой дурак может написать код, который понимает компьютер. Хорошие программисты пишут код, который понимает человек"

  • "Мартин Фаулер, Рефакторинг: Улучшение дизайна существующего кода
1
ответ дан 18 December 2019 в 05:31
поделиться

Дело в том, что если, например, имеется список указателей на базовый класс ( List < A * > list ), а затем вызывается f () , повторно реализованный метод в B вызываться не будет.

-121--2896549-

Как правило, я предлагаю указать ему игнорировать родительские свойства (которые создают циклы) - в данном случае, добавив [StartIgnore] - но я не вижу ничего, кроме базовых членов, - достаточно ли этого класса для того, чтобы вызвать ошибку?

-121--2975512-

Знаете, что трудно? Написание кода, который другие могут читать и поддерживать. Любой идиот может написать код, который компилирует и невозможно поддерживать.

Всегда в пользу ремонтопригодности: вот как вы находите баланс.

Изменить:

"Любой дурак может написать код, который может понять компьютер. Хорошие программисты пишут код, который люди могут понять ".

  • Мартин Фаулер, рефакторинг: улучшение дизайна существующего кода

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

24
ответ дан 18 December 2019 в 05:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: