Более свободно C # / .NET - PullRequest
       63

Более свободно C # / .NET

15 голосов
/ 16 декабря 2009

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

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

var ddl = Page.FindControl("LocationDropDownList") as DropDownList;

ddl.Visible = true;
ddl.SelectedValue = "123";

if(isAdmin)
    ddl  .SelectedValue = "111";

становится:

Page.FindControl("LocationDropDownList")
    .CastAs<DropDownList>()
    .With(d => d.Visible = true)
    .With(d => d.SelectedValue = "123")
    .WithIf(isAdmin, d => d.Items.Add(new ListItem("Admin", "1")));

Или:

 Page.FindControl("LocationDropDownList")
       .CastAs<DropDownList>()
       .With(d =>
       {
           d.Visible = true;
           d.SelectedValue = "123";
       })
       .WithIf(isAdmin, d => d.SelectedValue = "111");

Методы расширения:

public static TResult CastAs<TResult>(this object obj) where TResult : class
{
    return obj as TResult;
}

public static T With<T>(this T t, Action<T> action)
{
    if (action == null)
        throw new ArgumentNullException("action");

    action(t);

    return t;
}

public static T WithIf<T>(this T t, bool condition, Action<T> action)
{
    if (action == null)
        throw new ArgumentNullException("action");

    if (condition)
        action(t);

    return t;
}

Ответы [ 21 ]

3 голосов
/ 16 декабря 2009

Незначительная нота. Из личного опыта я бы поменял:

if(isAdmin)
    ddl.SelectedValue = "111";

до

if(isAdmin) {
    ddl.SelectedValue = "111";
}

или

if(isAdmin) 
{
    ddl.SelectedValue = "111";
}

Это рано или поздно сэкономит вам время на отладку.

2 голосов
/ 16 декабря 2009

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

Я думаю, что концепция обоснована, и если вы измените «С» на «Пусть», это будет более «функционально» или «F # -ish». Личное мнение.

Page.FindControl("LocationDropDownList")    
    .CastAs<DropDownList>()    
    .Let(d => d.Visible = true)  
    .Let(d => d.SelectedValue = "123");
2 голосов
/ 16 декабря 2009

Похоже, ваш коллега - лямбда-наркоман.

2 голосов
/ 16 декабря 2009

Мои 2 цента: это выглядит хорошо, мой единственный комментарий - то, что «с» подразумевает что-то вроде «где» или «иметь», когда вы фактически устанавливаете свойство. Я бы предложил название метода, например «Do», «Execute» или «Set», но, возможно, это просто мое странное мировоззрение.

Как насчет:

Page.WithControl<DropDownList>("LocationDropDownList")
    .Do(d => d.Visible = true)
    .Do(d => d.SelectedValue = "123")
    .DoIf(isAdmin, d => d.Items.Add(new ListItem("Admin", "1")));
2 голосов
/ 16 декабря 2009

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

1 голос
/ 16 декабря 2009

Это идеальный пример обучения тому, как сделать что-то более сложное, чем нужно.

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

1 голос
/ 16 декабря 2009

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

Вы могли бы пойти еще дальше и покончить с этим "вар":

DropDownList ddl = (DropDownList) Page.FindControl("ddlName");
0 голосов
/ 22 декабря 2009

Хорошее правило:

Если ваше первое впечатление от вашего кода «Это умно» - это, вероятно, не очень хорошая идея .

Хороший код должен быть простым, читаемым и только «умным», если это абсолютно необходимо .

0 голосов
/ 16 декабря 2009

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

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

Если кому-то интересно узнать больше о беглых интерфейсах, я советую проверить эту текущую работу Мартина Фаулера.

0 голосов
/ 16 декабря 2009

Я говорю придерживайтесь первой версии без методов расширения или выражений лямбы. Это относительно новые концепции, поэтому не многие разработчики будут иметь над ними контроль, но они не будут использоваться при извлечении / обработке данных из базы данных. Если вы используете их, у вас могут возникнуть проблемы со стоимостью обслуживания. Приятно сказать «читай, если это тебе по-гречески»; но в реальной жизни это может быть лучшим подходом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...