12/08/2018, 15:12

Debug Linq nay thực sự dễ dàng

LINQ ( Language Integrated Query ) là một tính năng mạnh mẽ được ra mắt đầu tiên ở phiên bản .NET Framework 3.5, là 1 công cụ mạnh mẽ, sử dụng cú pháp SQL-like để query , thao tác với dữ liệu. LINQ có thể query ở trên nhiều kiểu dữ liệu khác nhau như arrays, enumerable classes, relational ...

LINQ (Language Integrated Query) là một tính năng mạnh mẽ được ra mắt đầu tiên ở phiên bản .NET Framework 3.5, là 1 công cụ mạnh mẽ, sử dụng cú pháp SQL-like để query , thao tác với dữ liệu. LINQ có thể query ở trên nhiều kiểu dữ liệu khác nhau như arrays, enumerable classes, relational databases, XML... nó cho phép lập trình viên viết code dễ đọc, chính xác và súc tích.

Vấn đề

Debug với LINQ đôi khi rất khó (thỉnh thoảng là impossible), đối với những câu lệnh query khá phức tạp và khó hiểu, linq có thể khiến chúng ta lao lực để biết nó làm gì trong đó. Một vài công ty còn không cho sử dụng LINQ vì một khi có bug thì nó khó debug để tìm ra lỗi. Nhưng đó là câu chuyện của hôm qua rồi. Ở bài viết này mình xin giới thiệu 1 plugin cho Visual Studio khá mạnh mẽ dùng để debug LINQ. Đó chính là OzCode

var text = @"99 little bugs in the code, 99 bugs in the code.
                         Take one down, patch it around, 127 bugs in the code.
                        (Repeat until NO MORE BUGS)";

var mostFrequentWord = text
    .Split(' ', '.', ',')
    .Where(i => i != "")
    .GroupBy(i => i)
    .OrderBy(i => i.Count())
    .Last();

Đoạn code trên thể hiện sức mạnh của linq, nếu không dùng linq, đoạn code trên có thể phải viết dài như thế này

var splitText = text.Split(' ', '.', ',');
var wordsDictionary = new Dictionary<string, int>();
foreach(var word in splitText)
{
    if(word != "")
    {
        if(!wordsDictionary.ContainsKey(word)
        {
            wordsDictionary.Add(word, 0);
        }
 
        wordsDictionary[word]++;
    }
}
 
string mostUsedWord = null;
int max = 0;
foreach(var entry in wordsDictionary)
{
    if(entry.value > max)
    {
        word = entry.key;
        max = entry.value;
    }
}

Linq vẫn là một lựa chọn tuyệt vời. Nhưng với đoạn code sử dụng linq, ta không biết được sau mỗi dấu "." thì kết quả trả về bao gồm những giá trị gì và gồm bao nhiêu phần tử. Với cách truyền thống thì VS cho phép sử dụng Immediate Windows hoặc Watch để xem kết quả trả về cho từng câu lệnh. Nhưng với cách này thì không thể có cái nhìn overview về cách mà toàn bộ code work, nhất là khi câu lệnh query càng dài. Với ozCode, số lượng phần tử trả về sau mỗi expression được hiển thị rõ ràng. Như trên ta thấy được mảng sau khi split() có 79 phần tử, nhưng sau khi group by thì còn lại 19 phần tử mà thôi, còn khi get last thì chỉ có 1 phần tử mà thôi.

Thậm chí, OzCode còn đưa ra một cửa sổ Linq Analytics để đưa ra cái nhìn tổng quát sau mỗi condition query. Có thể search luôn trên dữ liệu trả về ở mỗi expression. Thật không thể tuyệt vời hơn.

Ngoài ra, khi câu lệnh LINQ có exception, thì OzCode chỉ ra lỗi xảy ra ở expression nào luôn. Như vậy thì ta có thể dễ dàng biết được lỗi ở đâu, từ đó tìm cách fix hiệu quả nhất. Như trên ta thấy khi thực hiện select 10/i thì exception DevideByZero đã được OzCode dự đoán trước và hiện thị message cảnh báo.

OzCode thực sự là 1 plugin mạnh mẽ cho dân lập trình .NET, debug LINQ đã không còn là impossible. OzCode support các phiên bản Visual Studio 2012, 2013, 2015 and 2017. Có thể Ozcode còn có thêm nhiều tính năng mạnh mẽ mà mình còn chưa khám phá hết. Các bạn có thể cài và tự khám phá.

0