Почему они использовали этот синтаксис C # для создания списка ссылок в ASP.NET MVC 2? - PullRequest
5 голосов
/ 03 сентября 2010

Мне трудно понять следующий код C #.Этот код был взят из Pro ASP.NET MVC 2 Framework Стивеном Сандерсоном.Код по существу создает URL-адреса на основе списка категорий.

Вот код:

        Func<string, NavLink> makeLink = categoryName => new NavLink { 
            Text = categoryName ?? "Home", 
            RouteValues = new RouteValueDictionary(new { 
                controller = "Products", 
                action = "List", 
                category = categoryName, 
                page = 1 
            }),
            IsSelected = (categoryName == currentCategory)

Здесь много чего происходит.Я предполагаю, что он определяет функцию, которая ожидает два параметра типа string и NavLink.Тогда я вижу лямбду categoryName => new NavLink etc....Я думаю, что все, что он делает - это создает экземпляр NavLink.

. Затем вызывается функция в том же действии контроллера:

        // Place home link on top
        List<NavLink> navLinks = new List<NavLink>();
        navLinks.Add(makeLink(null));

        // Add link for each distinct category
        var categories = productsRepository.Products.Select(x => x.Category.Name);
        foreach (string categoryName in categories.Distinct().OrderBy(x => x))
            navLinks.Add(makeLink(categoryName));

.,Я не понимаю, почему Стивен Сандерсон написал это так.Разве он не мог написать что-то вроде:

var categories = productsRepository.Products.Select(x => x.Category.Name);
foreach (string categoryName in categories.Distinct().OrderBy(x => x))
{
    var newlink = new Navlink{
        text = categoryName,
        RouteValues = new RouteValueDictionary(new {
           controller = "Products",
           action = "List",
           category = categoryName,
           page = 1
        }),
        IsSelected = (categoryName == currentCategory)
    }
    navLinks.Add(newlink);
}

Есть ли преимущество в том, чтобы делать это способом Стивена по сравнению с моим?

Ответы [ 5 ]

5 голосов
/ 03 сентября 2010

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

2 голосов
/ 03 сентября 2010

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

Редактировать: Стоит добавить, что «особые изощренные хитрые способы», по крайней мере, должны быть соответствующим образом прокомментированы ...

1 голос
/ 03 сентября 2010

(это просто мнение, не предназначенное для оскорбления или провокации)

Лично мне нравится твой путь лучше. (или модель, в которой вы просто пишете простую старую частную функцию, которая вызывается из foreach).

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

1 голос
/ 03 сентября 2010

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

Некоторые преимущества: (1) повторное использование функции для будущего использования и (2) циклы могут быть сокращены - этостановится довольно трудно найти подходящие фигурные скобки, когда они длинные и вложенные в несколько уровней.

1 голос
/ 03 сентября 2010

Я предполагаю, что она определяет функцию, которая ожидает два параметра типа string и NavLink.

Он принимает один параметр строки и возвращает NavLink.

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

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