Một số mẹo lập trình thú vị

Một số mẹo lập trình thú vị

Đôi khi, trong quá trình làm việc, tôi bắt gặp những mẹo hữu ích và tuyệt vời cần ghi nhớ nhưng có thể sẽ không đủ để lấp đầy một bài viết. Thay vì để những khám phá đó dần trôi vào quên lãng, tôi nghĩ mình sẽ biên tập chúng thành một bài viết.

Những mẹo này sẽ tập trung vào các công nghệ và kỹ thuật lập trình có thể giúp xây dựng một ứng dụng và hy vọng rằng, biết một số mẹo này sẽ giúp bạn giải quyết các vấn đề trong tương lai.

Khám phá SQLite

SQLite là một công cụ cơ sở dữ liệu SQL nhỏ, nhanh, khép kín, độ tin cậy cao, đầy đủ tính năng. Theo những người tạo ra nó, nó là công cụ cơ sở dữ liệu được sử dụng nhiều nhất trên toàn cầu, được sử dụng trong hầu hết mọi tình huống có thể tưởng tượng được từ thiết bị di động, lập trình nhúng và ứng dụng web.

SQLite có tất cả các tính năng điển hình mà chúng ta mong đợi từ một hệ thống cơ sở dữ liệu quan hệ tuân thủ ACID. SQLite cung cấp tất cả các chức năng ở định dạng tệp đa nền tảng mà chúng ta có thể chia sẻ trên các thiết bị bằng một bản sao đơn giản.

Ngoài các truy vấn quan hệ cơ bản, SQLite cũng hỗ trợ Full-text search (tìm kiếm toàn văn bản). Tìm kiếm toàn văn bản là một kỹ thuật cho phép người dùng tìm kiếm các token cụ thể trong những bản ghi dữ liệu phức tạp.

Trong khi lưu trữ bảng truyền thống lưu trữ các bản ghi trong bảng, hàng và cột, công cụ tìm kiếm toàn văn bản yêu cầu các kỹ thuật mã hóa đầu vào thành các cấu trúc có thể tìm kiếm được tối ưu hóa cho các truy vấn nhanh.

SQLite có một mô-đun tên là FTS5, viết tắt của Full-Text Search version 5. Để sử dụng mô-đun này, chúng ta cần tạo một bảng ảo (virtual table) sẽ lưu trữ các giá trị hàng ban đầu của chúng ta và xử lý dữ liệu thành các cấu trúc tìm kiếm được tối ưu hóa. Khi được kết nối với một phiên bản SQLite, chúng ta có thể tạo một bảng ảo bằng lệnh sau.

CREATE VIRTUAL TABLE email USING fts5(sender, title, body);

Từ đây, chúng ta có thể chèn dữ liệu vào bảng ảo của mình và thực hiện các truy vấn SQL.

-- Query for all rows that contain at least once instance of the term
-- "fts5" (in any column). The following three queries are equivalent.
SELECT * FROM email WHERE email MATCH 'fts5';
SELECT * FROM email WHERE email = 'fts5';
SELECT * FROM email('fts5');

Có các tính năng bổ sung cho FTS5 có thể làm cho nó trở thành một lựa chọn hấp dẫn để tìm kiếm. Ví dụ, chúng ta có thể đánh dấu các kết quả phù hợp bằng cách sử dụng hàm highlight. Ở đây, chúng tôi sẽ đánh dấu cụm từ fts5khi được tìm thấy trong trường email của chúng tôi.

-- Query for rows that match "fts5". Return a copy of the "body" column
-- of each row with the matches surrounded by <b></b> tags.
SELECT highlight(email, 2, '<b>', '</b>') FROM email('fts5');

Chúng ta cũng có thể có các tiêu chí tìm kiếm nâng cao, chẳng hạn như các toán tử * (wildcard), and, ornear để giúp chúng ta tìm kiếm mờ.

Mặc dù không mạnh bằng các công cụ tìm kiếm được xây dựng theo mục đích như Elasticsearch, nhưng việc có một công cụ tìm kiếm gốc cho các tình huống đơn giản là một trường hợp sử dụng hấp dẫn cho những người viết ứng dụng demo hoặc ứng dụng concept.

Để tìm hiểu thêm về FTS5, hãy xem tài liệu tại trang tài liệu SQLite chính thức.

SQLite có thể phân tích cú pháp JSON

Lưu trữ JSON trong cơ sở dữ liệu thường đi kèm với sự đánh đổi, tùy thuộc vào cơ sở dữ liệu. May mắn thay, hầu hết các cơ sở dữ liệu quan hệ hiện đại đều có khả năng JSON được tích hợp sẵn và SQLite cũng không ngoại lệ.

SQLite có một loạt các hàm có tiền tố json_ để tương tác với các giá trị JSON được lưu trữ trong bảng. Lấy ví dụ sau.

-- columns include key, value, type, atom, id, parent, fullkey, path
SELECT key, value, type
FROM json_tree('{ "name" : "khalid", "info" : ' ||
                    '{ "twitter" : "@buhakmeh", "followers" : [10000] }' ||
               '}');

Việc thực thi kết quả truy vấn trong kết quả sau:

key value type
NULL {“name”:”khalid”,”info”:{“twitter”:”@buhakmeh”,”followers”:[10000]}} object
name khalid text
info {“twitter”:”@buhakmeh”,”followers”:[10000]} object
twitter @buhakmeh text
followers [10000] array
0 10000 integer

Ồ! Các hàm chức năng JSON khác bao gồm json_each, json_insert, json_array và nhiều hơn nữa. Đây là một ví dụ khác trong đó chúng tôi truy vấn các giá trị từ một mảng JSON.

SELECT key as [index], value
FROM json_tree(json_array(1, 2, 3))
where type = 'integer'

Đọc thêm về các hàm JSON của SQLite tại tài liệu chính thức.

Ba cách sử dụng string.IsNullOrEmpty

Với C# 9, chúng ta có nhiều lựa chọn hơn để viết cùng một logic. Liệu đa dạng có phải là một điều tốt hay không là một cuộc tranh cãi gay gắt trong cộng đồng, nhưng chúng ta hãy xem xét ba cách để kiểm tra xem một chuỗi là chuỗi trống hoặc null hay không.

string? empty = null;

if (string.IsNullOrEmpty(empty))
{
    Console.WriteLine($"{nameof(string.IsNullOrEmpty)}");
}

if (empty is null || empty is { Length: 0 })
{
    Console.WriteLine("Pattern Matching");
}

if ((empty?.Length).GetValueOrDefault() == 0)
{
    Console.WriteLine("Elvis operator");
}

Việc sử dụng string.IsNullOrEmptylà phương pháp đã thử và đúng để kiểm tra các giá trị chuỗi là nullhoặc trống. Phương pháp thứ hai sử dụng so khớp mẫu C# 9 và phương pháp cuối cùng sử dụng toán tử Elvis (.?). Bạn thích cách tiếp cận nào hơn và tại sao?

.NET 6 giới thiệu giá trị mặc định cho các phương thức OrDefault của LINQ

Với bản phát hành .NET 6, người dùng LINQ sẽ nhận được một phương thức mở rộng bổ sung cho tất cả các phương thức OrDefault, cho phép chúng ta đặt giá trị mặc định nếu chúng ta không tìm thấy kết quả phù hợp nào trong một danh sách. Hãy xem ví dụ sau bằng cách sử dụng FirstOrDefault.

var numbers = Array.Empty<int?>();
var ugh = numbers.FirstOrDefault() ?? 42;

Vì danh sách của chúng ta trống, chúng ta sẽ luôn nhận được giá trị default của kiểu dữ liệu của danh sách, là một số nguyên có thể null. Trong .NET 6, chúng ta có thể rút ngắn mã của mình.

var meaningOfLife = numbers.FirstOrDefault(42);

Tuyệt vời! Có thêm một số cải tiến về chất lượng đến với LINQ trong bản phát hành .NET 6.

Fake JSON REST API cho ví dụ

Trang web {JSON}Placeholdercung cấp một số REST API đơn giản cho các khái niệm như todosblog để giúp bạn tập trung vào học tập UI framework, chứ không phải là xây dựng các backend API tẻ nhạt.

Chạy các container Docker để kiểm tra tích hợp

Với ASP.NET Core và Docker, việc chạy các bài kiểm tra tích hợp end-to-end (e2e) hoàn chỉnh chưa bao giờ dễ dàng hơn thế. Những loại thử nghiệm này giúp chúng ta tin tưởng rằng những gì chúng tôi đang cung cấp sẽ hoạt động hiệu quả.

Tôi đã sử dụng một gói NuGet có tên Ductus.FluentDocker. Đây là một số mã mẫu để khởi động container Microsoft SQL Server cho Linux từ C#. Lưu ý, bạn sẽ cần cài đặt và chạy Docker trên máy chủ.

using var container =
     new Builder()
     .UseContainer()
     .WithName("dapper_benchmark")
     .UseImage("mcr.microsoft.com/mssql/server")
     .ExposePort(11433, 1433)
     .WithEnvironment("SA_PASSWORD=Pass123!", "ACCEPT_EULA=Y")
     .WaitForMessageInLog("Starting up database 'tempdb'.", TimeSpan.FromSeconds(30))
     .Build()
     .Start();

Có một số lưu ý với cách tiếp cận này, điều quan trọng nhất là nếu các bài kiểm tra không kết thúc một cách thuận lợi, bạn sẽ có một container bị mất tích.

Gỡ lỗi IDE bằng IDE

Tôi là một người dùng JetBrains Rider và tôi cũng thích sống cuộc sống ảo của mình một cách nguy hiểm. Tôi thường thử nghiệm các bản phát hành Chương trình truy cập sớm của sản phẩm và mặc dù nó ổn định trong phần lớn thời gian, nhưng nó có thể gặp một số sự cố không mong muốn.

May mắn thay, JetBrains Toolbox cho phép cài đặt nhiều phiên bản Rider song song với nhau. Khi có sự cố lặp lại, tôi có thể đính kèm phiên bản Rider cũ hơn ổn định vào phiên bản EAP mới và xem chính xác ngoại lệ do cơ sở mã đưa ra.

Nhìn thấy ngoại lệ làm cho việc hiểu và gửi lỗi trở nên đơn giản hơn nhiều và giúp tôi làm cho IDE yêu thích của mình tốt hơn nhiều. Đáng kinh ngạc!

Phần kết luận

Chà, đó là một vài điều tôi đã học được trước đây. Trong khi một số trong số đó là thú vị, hy vọng của tôi là ít nhất một trong số này sẽ hữu ích. Nếu bạn thấy bất kỳ mẹo nào trong số này hữu ích, hãy nhớ chia sẻ bài đăng này.

Như mọi khi, cảm ơn vì đã đọc.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *