Ở bài viết này mình sẽ giới thiệu đến các bạn về Microservices là gì và những đặc điểm, điểm đáng chú ý của nó. Hãy cũng mình tìm hiểu qua bài viêt này nhé.

Kiến trúc MONOLITHIC

Mình sẽ giới thiệu tới các bạn kiến trúc monolithic trước để bạn hiểu rõ về microservice cũng như có cái để so sánh với microservice. Monolithic là một kiến trúc phần mềm dạng nguyên khối, nghĩa là mọi tính năng sẽ nằm trong một project.

Microservices là gì?

Microservice là kiến trúc có triết lý thiết kế ngược lại hoàn toàn so với kiến trúc monolithic được nêu ở trên.

Các module trong phần mềm được chia thành các service rất nhỏ (microservice). Mỗi service sẽ được đặt trên một server riêng. Vì thế nó dễ dàng để nâng cấp và scale ứng dụng.

Microservices va monolithic
Microservices va monolithic

Kiến trúc của microservices là gì?

Khác biệt với kiến trúc của Monolith, thay vì gom tất cả module thành một khối (monolith). Ở Microservices  ta tách các module thành những service siêu nhỏ. Mỗi service sẽ được đặt trên một server riêng và thực hiện giao tiếp với nhau thông qua mạng.

Kiến trúc

Ở Microservices thì các services sẽ tồn tại độc lập nhau về xử lý, lưu trữ và request. Như hình bên dưới:

kiến trúc của microservices
kiến trúc của microservices

Ví dụ: Nếu như bạn cần xây dựng một ứng dụng để bán hàng dựa trên Microservices thì giả sử đơn hàng sẽ cần tối thiểu 4 service với database độc lập như sau:

  • Employee service (sử dụng table tc-employee)
  • Store service (sử dụng table tc-store)
  • Inventory service (sử dụng table tc-warehouse)
  • Order service (sử dụng table tc-order)

Và trong số đó, thì Store service – table tc-order sẽ chỉ chứa khóa ngoại chính là ID của nhân viên tại cửa hàng và ID của kho theo đúng với thiết kế chuẩn hóa database.

Tính chất khối Monolithic ảnh hưởng đến cấu trúc Microservices như thế nào:

  • Monolithic được thiết kế, phát triển và triển khai dựa theo một khối duy nhất.
  • Những ứng dụng thiết kế theo monolithic rất phức tạp và nó sẽ gây ra nhiều khó khăn cho quá trình nâng cấp, bảo trì hay là thêm các tính năng mới.
  • Thường rất khó để có thể áp dụng triển khai dựa theo kiểu agile.
  • Cần phải triển khai lại toàn bộ một hệ thống mặc dù chỉ phải cập nhật hay nâng cấp một phần duy nhất.
  • Khi mở rộng được các khối ứng dụng nếu như gặp khó khăn thì sẽ có các yêu cầu về những tài nguyên khác nhau.
  • Với một service thường không có tính độ ổn định nên có thể làm sập cả hệ thống.
  • Khó trong việc đổi mới: Bởi vì ứng dụng monolithic cần phải sử dụng chung một công nghệ vì vậy nó rất khó có thể thay đổi hay áp dụng thêm các công nghệ mới.

Những tính chất giới hạn nên trên của kiến trúc Monolithic dẫn đến sự phát triển của kiến trúc mới là Microservices.

Xem thêm: Mô hình client-server là gì?

Những lợi ích của Microservices

Những lợi ích mà microservices đem lại:

  • Source code tinh gọn: do hệ thống cấu thành từ những dự án nhỏ, mỗi dự án sẽ đơn giản hơn và tập trung vào 1 hoặc 1 vài nghiệp vụ chính nên source code gọn nhẹ hơn. Giúp mang lại tính gọn nhẹ, dễ bảo trì và mở rộng.
  • Bảo mật source code: vì dev nào làm việc ở dự án nào thì chỉ truy cập được source code trong dự án đó.
  • Tồn tại độc lập: vì các dự án khác nhau và có thể có cách deploy riêng, và một service nào đó chết thì service khác vẫn hoạt động bình thường.
  • Scale độc lập: theo những nhu cầu sử dụng của hệ thống mà có thể scale riêng service đó.

Những ưu nhược điểm của Microservices

1. Ưu điểm của microservices

  1. Microservices giúp dễ dàng continuous delivery và deployment các ứng dựng lớn, phức tạp:
  • Cải thiện về khả năng bảo trì – mỗi service tương đối nhỏ vì vậy dễ hiểu và thay đổi hơn.
  • Khả năng testing dễ dàng hơn – vì những services nhỏ hơn và nhanh hơn để test.
  • Khả năng triển khai tốt hơn – các services có thể được triển khai độc lập.
  • Mỗi services có thể được phát triển bởi những team khác nhau. Mỗi team có thể phát triển, thử nghiệm, triển khai và mở rộng quy mô dịch vụ của mình một cách độc lập.
  1. Giảm thiểu được rủi ro: Ví dụ như có lỗi trong một service thì chỉ có service đó bị ảnh hưởng. Các services khác sẽ vẫn tiếp tục xử lý các yêu cầu.
  2. Dễ dàng thay đổi để sử dụng các công nghệ mới: Khi thực hiện triển khai các services bạn có thể lựa chọn nhiều công nghệ mới phù hợp.
  3. Agility – microservice hỗ trợ phát triển theo mô hình Agile.

2. Nhược điểm của microservices là gì?

  1. Các nhà phát triển phần mềm phải đối mặt với sự phức tạp của việc tạo ra một hệ thống phân tán:
  • Cần phải implement việc communication giữa các inter-services.
  • Việc Handle partial failure là rất phức tạp vì một luồng xử lý cần đi qua nhiều services.
  • Việc thực hiện những requests ở nhiều services khó khăn hơn, nó cũng đòi hỏi sự phối hợp cẩn thận giữa các teams.
  • Những khó khăn trong việc đảm bảo toàn vẹn CSDL nếu triển khai theo kiến trúc cơ sở dữ liệu phân vùng.
  1. Việc triển khai và quản lý microservices nếu làm theo cách thủ công so với ứng dụng một khối phức tạp hơn nhiều.
  2. Phải xử lý sự cố khi kết nối chậm.
ưu nhược điểm của microservices
ưu nhược điểm của microservices

Liên lạc giữa Microservices

Mình sẽ liệt kê những loại liên kết thường dùng của các ứng dụng microservices hiện nay.

Gửi Tin Bất Đồng Bộ – AMQP, STOMP, MQTT

Trong một số điều kiện, hoàn cảnh việc truyền tin bất đồng bộ là cần thiết (client không mong đợi response ngay lập tức, hoặc không cần response). Những giao thức truyền tin bất đồng bộ như AMQP, STOMP hay MQTT được sử dụng rộng rãi.

Gửi Tin Đồng Bộ – REST, Thrift

Truyền tin đồng bộ (người gửi – client sẽ đợi một khoảng thời gian để nhận kết quả từ service), REST là sự lựa chọn ưu tiên hàng đầu vì nó cung cấp hệ thống truyền tin đơn giản qua giao thức HTTP dạng request – response. Vì thế, nhiều microservices sử dụng HTTP với API.

Các Kiểu Tin Nhắn – JSON, XML, Thrift, ProtoBuf, Avro

Với kiểu tin nhắn phù hợp cho microservices và cũng là một yếu tố quan trọng. Với phần lớn các ứng dụng microservices, thường sử dụng những kiểu tin nhắn dạng chữ như JSON và XML trên nền giao thức HTTP với API. Trong các trường hợp cần truyền tin dạng nhị phân, microservices có thể dùng dạng Thrift, Proto hay Avro.

Service Contracts – Định Nghĩa Service Interfaces – Swagger, RAML

Khi bạn đang có một nghiệp vụ được xây dựng như một dịch vụ thì bạn cần định nghĩa và thông báo hợp đồng dịch vụ (service contract thể hiện giao kèo của service).

Vì chúng ta xây dựng microservices trên kiểu kiến trúc REST nên ta có thể sử dụng cùng kiểu REST API để định nghĩa hợp đồng của microservices. Vì thế microservices sử dụng các ngôn ngữ định nghĩa REST API tiêu chuẩn như Swagger, RAML để định nghĩa cho hợp đồng dịch vụ.

Những sự khác biệt giữa API và microservice

Dưới đây là một số sự khác biệt chính giữa API và microservice:

  • API là một tập hợp những định nghĩa về chương trình con, các giao thức truyền thông và những công cụ để xây dựng, phát triển phần mềm. Tóm lại, nó là một tập hợp các phương thức giao tiếp được xác định rõ ràng giữa các thành phần khác nhau.
  • Microservice là một thiết kế kiến ​​trúc nó giúp tách các phần của ứng dụng chia thành các dịch vụ nhỏ, tự vận hành.

Như vậy, nghĩa là API thường là một phần của microservice, nó cho phép tương tác với chính microservice. Hay có thể nói là API đóng vai trò như là hợp đồng cho các tương tác trong microservice.

sự khác biệt giữa api và microservice
sự khác biệt giữa api và microservice

Mỗi một microservice được xây dựng hơi khác nhau dựa trên nhu cầu của nó(hình trên). Dưới đây là một số ví dụ về các chức năng khác nhau mà microservice có thể có:

  • Cung cấp những hoạt động CRUD cho một loại thực thể cụ thể, ví dụ như khách hàng, sự kiện, v.v. Dịch vụ này sẽ có vai trò giữ khả năng duy trì dữ liệu trong cơ sở dữ liệu.
  • Cung cấp một phương tiện để chấp nhận các tham số và trả về kết quả dựa trên các tính toán .

Nên sử dụng kiến trúc Microservices khi nào?

Kiến trúc Microservices khi nào chúng ta nên sử dụng nó.
Khi bạn phát triển phiên bản đầu tiên của ứng dụng, bạn thường sẽ không gặp phải các vấn đề mà Microservices giải quyết được.

Ngoài ra, việc sử dụng một kiến trúc phân tán, phức tạp sẽ làm chậm quá trình phát triển. Đây cũng là một vấn đề rất lớn đối với các start-up vì họ cần phát triển nhanh mô hình kinh doanh cùng với phát triển một ứng dụng đi kèm.
Vì vậy, theo mình trừ khi bạn có một hệ thống quá phức tạp, lớn để quản lý bằng Monolithic Architecture, hay là bạn xác định tương lai của ứng dụng sẽ trở nên như vậy. Thì kiến trúc Monolithic vẫn đủ tốt đối với bạn.

Đây là những chia sẻ của mình về microservices là gì. Cảm ơn các bạn đã theo dõi bài viết của mình.

Ở bài viết này, chúng ta sẽ tìm hiểu .NET Core là gì, những điểm mạnh của nó. Và các nền tảng .NET Framework, .NET core có gì khác nhau.

.NET Core là gì?

.NET Core là một framework được Microsoft phát triển. Đây là một nền tảng phát triển đa mục đích. .Net Core là nền tảng chéo (hỗ trợ Windows, macOS và Linux) và có thể được sử dụng để xây dựng các ứng dụng thiết bị, đám mây và IoT.

Ngôn ngữ hỗ trợ

.NET Core hỗ trợ các ngôn ngữ như: C # và F # (và C ++ / CLI kể từ 3.1; chỉ được bật trên Windows) và nó còn hỗ trợ một phần của Visual Basic .NET.

Cụ thể:

  • C#: Là loại ngôn ngữ lập trình phát triển theo hướng đối tượng và mục đích.
  • F# : Là loại ngôn ngữ lập trình cho chức năng đa nền tảng, mã nguồn mở. Nó cũng thường bao gồm lập trình cho hướng đối tượng và mệnh lệnh.
  • Visual Basic : Là ngôn ngữ lập trình có cú pháp đơn giản giúp xây dựng cho các ứng dụng hướng tới đối tượng an toàn.

Những công cụ (gọi tắt là IDE)  để lập trình với .NET core:

Các phiên bản .Net Core được ra đời từ năm 2016 đã phát triển rất đều đặn và nhận được những sự tiếp đón từ phía cộng đồng lập trình viên. Trong đó bản được đánh giá là ổn định và được ưa chuộng nhất chính là 3.1.2.

.NET Core ra đời trong hoàn cảnh nào?

ASP.NET đã xuất hiện cách đây 15 năm trước. Nó là một phần của .NET Framework. Nó đã có hàng triệu lập trình viên đã sử dụng để xây dựng những ứng dụng web. Và Microsoft đã phát triển thêm nhiều tính năng mới qua từng năm.

lịch sử ra đời .net core
lịch sử ra đời .net core

ASP.NET Core có một số thay đổi lớn. Từ việc học hỏi các framework module hóa khác. ASP.NET Core không còn dựa trên System.Web.dll nữa. Mà được dựa trên một tập hợp các gói, các module hay cũng được gọi là các Nuget packages.

Với ASP.NET Core bạn có thể:

  • HTTP request được tối ưu nhẹ hơn.
  • Hợp nhất xây dựng web UI và web APIs.
  • Tích hợp những client-side frameworks hiện đại và những luồng phát triển.
  • Hệ thống cấu hình dựa trên môi trường đám mây thật sự.
  • Dependency injection được xây dựng sẵn.
  • Có thể host trên IIS hoặc self-host trong process của riêng bạn.
  • Được xây dựng trên .NET Core, hỗ trợ thực sự app versioning.
  • Những công cụ mới để đơn giản hóa quá trình phát triển web tối ưu.
  • Xây dựng và chạy đa nền tảng(Windows, Mac và Linux).
  • Mã nguồn mở và tập trung vào cộng đồng.

Thành phần của .Net Core

.NET Core bao gồm các nền tảng: .NET Compiler Roslyn, .NET Core framework CoreFX, .NET Core runtime CoreCLR, và ASP.NET Core.

Cấu trúc của.Net Core chi tiết

  • CoreFX:Nó được xem là nền tảng thư viện dành cho .NET Core.
  • CoreCLR: Đây là công cụ thực thi .Net trong .Net Core. Nó hỗ trợ thực hiện một số chức năng như thu gom và biên dịch rác thành mã máy.
  • .Net Core runtime: Sẽ cung cấp một kiểu hệ thống, tải lắp ráp, trình thu gom rác và các dịch vụ cơ bản khác.
  • Net Core runtime: Cung cấp framework để việc xây dựng các ứng dụng hiện đại tối ưu, dựa trên đám mây, ứng dụng web, kết nối internet,…
  • .Net Core SDK và trình biên dịch ngôn ngữ (Roslyn và F#): giúp cho phép phát triển .Net Core
  • Lệnh dotnet:Lệnh dùng cho việc khởi chạy ứng dụng .NET Core và các lệnh CLI.
cấu trúc .net core
cấu trúc .net core

Phân biệt .NET Framework, .NET Core, và Mono

Với người mới làm quen với .NET hay kể cả một số người đã làm việc với .NET lâu năm. Những thuật ngữ, khái niệm như .NET Framework, Mono hay .NET core vẫn hay gây ra nhầm lẫn. Về cơ bản thì .NET Framework, .NET core và Mono là ba phiên bản .NET khác nhau (có nghĩa là mỗi phiên bản có Runtime, Libraries và Toolings riêng).

  1.  .NET Framework: Được Microsoft đưa ra chính thức từ năm 2002. .NET Framework chỉ hoạt động trên hệ điều hành Windows. Những nền tảng như: WPF, Winforms, ASP.NET(1-4) hoạt động dựa trên .NET Framework.
  2. Mono là phiên bản cộng đồng giúp mang .NET đến những nền tảng ngoài Windows. Mono được phát triển để xây dựng những ứng dụng với giao diện người dùng và được sử dụng rất rộng rãi như: Unity Game, Xamarin…
  3. .NET core: Đến năm 2013, Microsoft định hướng đa nền tảng và phát triển .NET core. .NET core hiện được sử dụng trong các ứng dụng Universal Windows platform và ASP.NET Core.

Xem thêm: .NET Framework là gì?

Bạn nên chọn .Net Framework hay là .Net Core?

Bạn nên lựa chọn .NET Framework nếu:

  • Bạn muốn chọn một môi trường làm việc ổn định.
  • Bạn là người không có quá nhiều thời gian để tìm hiểu về nền công nghệ mới.
  • Bạn đang sở hữu một đội ngũ có chuyên môn.
  • Bạn đã từng làm việc trên một ứng dụng và hiện có khả năng mở rộng chức năng.
  • Bạn không muốn phải liên tục nâng cấp cũng như thay đổi liên tục.
  • Bạn cần xưng dựng lên những ứng dụng khách trên hệ điều hành Windows bằng Windows Forms hay WPF.

Bạn nên lựa chọn .NET Core nếu như:

  • Bạn đang muốn xây dựng ứng dụng của mình chạy đa nền tảng: Windows, Linux và Mac.
  • Bạn có sẵn các tinh thần học hỏi, không sợ sai bởi vì .NET Core vẫn chưa có thể hoàn thiện.
  • Phát triển ứng dụng theo kiểu Microservices:Xây dựng các ứng dụng phức tạp dựa theo module với khả năng tách rời và với mỗi module có thể sử dụng các công nghệ khác nhau. Hiện nay .Net Core chính là một trong những lựa chọn chính xác nhất.
  • Nếu hệ thống của bạn cần hiệu năng và khả năng mở rộng tốt nhất cho dù có nhiều người dùng thì .NET Core và ASP.NET Core sẽ vẫn là trợ thủ sáng giá nhất bạn nên lựa chọn.
.net core và .net framework
.net core và .net framework

Những cái mới trong .Net Core

Chạy đa nền tảng

Trong khi .Net truyền thống chỉ chạy được trên nền hệ điều hành Windows.

Chỉ có Mono có thể chạy trên Linux. Nhưng đây không phải một sản phẩm của MS. Với .Net Core bạn có thể phát triển các ứng dụng trên Linux, Mac, Windows.

Hiện nay, thế giới đang chuyển sang mã nguồn mở. Microsoft tạo .Net Core là một open source. Source Code của nó được lưu trữ trên GIT.

Tối ưu việc thực thi

 Đã có nhiều sự thay đổi trong thư viện. Như thư viện “System” bao gồm cả System.IO, System.Net, System.Configuration. Nhờ vậy làm cho thư viện gọn hơn và tối ưu hơn. .NET Core hỗ trợ nuGet packages để người phát triển có thể phát triển các gói .Net Core.

.Net Core là một trong những loại framework dễ học và có tính hiện đại, tính linh hoạt cao. Nhờ đó cơ hội việc làm cho những lập trình viên.Net Core rất nhiều.

Trong hầu hết các hệ quản lý dữ liệu, thao tác tìm kiếm thường được thực hiện nhất để khai thác thông tin khác nhau.

Bởi vậy, khi xây dựng một hệ quản lý thông tin trên máy tính, bên cạnh các thuật toán tìm kiếm, các thuật toán sắp xếp dữ liệu cũng là một trong những chủ đề được quan tâm hàng đầu. Hãy cũng mình tìm hiểu về thuật toán tìm kiếm phổ biến nhé.

Thuật toán sắp xếp là gì?

Thuật toán sắp xếp Là bài toán giải quyết việc tổ chức dữ liệu theo một trật tự nhất định, thường là tăng dần hoặc giảm dần.

Ví dụ điển hình nhất trong thực tế như:

Các ứng dụng quản lý danh bạ ở điện thoại thì có sắp xếp theo số, theo tên. Quản lý học sinh thì có sắp xếp theo mã, điểm, theo lớp, theo trường, …

Như vậy, trong cuộc sống có rất nhiều mục đích cần phải sắp xếp các phần tử theo một trình tự nhất định. Như lúc bạn học lập trình bạn cần sắp xếp dãy số tăng dần, giảm dần bởi các kỹ thuật sắp xếp được nghiên cứu và phân tích kỹ lưỡng.

thuật toán sắp sếp là gì
thuật toán sắp sếp là gì

Trong ngành khoa học máy tính và toán học, thuật toán sắp xếp là một thuật toán sắp xếp các phần tử của một danh sách (hay một mảng) theo thứ tự tăng hoặc giảm tùy thuộc.

Có những thuật toán sắp sếp như:

  • Sắp xếp chọn
  • Sắp xếp chèn
  • Sắp xếp nổi bọt
  • Sắp xếp Quick sort
  • Sắp xếp Help sort
  • Sắp xếp Merge sort

Thuật toán tìm kiếm là gì?

Tìm kiếm là quá trình tìm một phần tử nằm trong một tập hợp rất nhiều phần tử dựa vào một yêu cầu nào đó. Ví dụ bạn cần tìm học sinh giỏi có tổng điểm cao nhất trong một danh sách học sinh của trường có 1000 học sinh thì quá trình đó ta gọi là tìm kiếm.

Nếu như một tập hợp đã được sắp xếp thì quá trình tìm kiếm trong tập hợp đó sẽ nhanh hơn.

Như ví dụ trên nếu điểm số học sinh đã được sắp xếp theo tăng dần hoặc giảm dần thì ta rất dễ tìm kiếm được học sinh đó. Còn nếu đó là một danh sách tùm lum không có thú tự thì bạn có thể sẽ mất nhiều thời gian để xử lý chúng.

thuật toán tìm kiếm là gì
thuật toán tìm kiếm là gì

Hiện nay, chúng ta thường sử dụng hai thuật toán tìm kiếm đó là

  • Thuật toán tìm kiếm tuyến tính.
  • Thuật toán tìm kiếm nhị phân.

Thuật toán tìm kiếm nhị phân là quá trình tìm kiếm trong một tập hợp đã được sắp xếp theo thứ tự.

Thuật toán tìm kiếm tuyến tính là quá trình tìm kiếm trong một tập hợp chưa sắp xếp.

Cả hai thuật toán đều có những ưu và nhược điểm khác nhau.

Xem thêm: Web dành cho lập trình viên

Thuật toán tìm kiếm tuyến tính

Ý tưởng

Thực hiện tìm kiếm từ đầu cho đến cuối mảng (hoặc ngược lại).

  • Nếu tìm thấy trả vị trí của kết quả tìm kiếm.
  • Nếu không tìm thấy thì trả về 1.

Các bước thực hiện

  • Bước 1: Duyệt mảng (n phần tử) từ vị trí đầu tiên i = 0.
  • Bước 2: Thực hiện so sánh giá trị arr[i] và key. Nếu arr[i] == key trả về vị trí i.
  • Bước 3: Nếu như duyệt hết phần tử mảng vẫn không tìm thấy thì trả về -1.

Đánh giá

  • Trong trường hợp tốt nhất, phần tử cần tìm nằm ngay ở vị trí đầu tiên, thuật toán sử dụng 1 lần so sánh.
  • Trong trường hợp xấu nhất, phần tử cần tìm nằm ngay ở vị trí cuối hoặc không nằm trong mảng, thuật toán cần sử dụng n-1 lần so sánh.
  • Linear Search đây là một giải thuật đơn giản khi hiện thực nó và giải thuật này khá hiệu quả với danh sách đủ nhỏ hoặc một danh sách chưa được sắp xếp.

Thuật toán tìm kiếm nhị phân

Thuật toán tìm kiếm nhị phân là một thuật toán tìm kiếm nhanh so với thuật toán tìm kiếm tuần tự, nhất là đối với một danh sách lớn, nhiều phần tử.

Ý tưởng

Để triển khai được thuật toán này hãy chắc chắn là mảng đã được sắp xếp. Dưới đây là ý tưởng triển khai thuật toán.

Xét đoạn mảng arr[left…right] cần phần tử tìm kiếm phần tử x. Ta so sánh x với phần tử ở vị trí giữa của mảng(mid = (left + right)/2). Nếu:

  • Nếu phần tử arr[mid] = x. Đưa kết luận và thoát chương trình.
  • Nếu arr[mid] < x. Ta chỉ thực hiện tìm kiếm trên đoạn arr[mid+1…right].
  • Nếu arr[mid] > x. Ta chỉ thực hiện tìm kiếm trên đoạn arr[left…mid-1].

Khi áp dụng thuật toán tìm kiếm nhị phân. Độ phức tạp cho trường hợp xấu nhất gặp là O(log(n)).

Tại sao cần phải có thuật toán tìm kiếm?

Trong thực tế ở cuộc sống, có rất nhiều bài toán khác nhau. Nhưng hầu như tất cả những bài toán đó chúng ta đều quy về một bài toán duy nhất, chính là bài toán tìm kiếm.

Ví dụ đơn giản là khi bạn thực hiện giải một bài toán. Có thể bạn sẽ có nhiều cách thực hiện nó, nhưng mục đích cuối cùng của bạn chính là đi tìm lời giải của bài toán. Hay là khi bạn thực hiện một phép sắp xếp, lọc các phần tử của danh sách, mục đích chính của bạn đó là tìm kiếm những phần tử giúp thỏa mãn yêu cầu.

Dựa trên các nhu cầu thực tế, các bài toán tìm kiếm dẫn đến chúng ta cần tạo ra thuật toán tìm kiếm để giải quyết những vấn đề này.

Tùy vào cấu trúc dữ liệu mà chúng ta sẽ có những thuật toán tìm kiếm khác nhau sao cho phù hợp cho từng cấu trúc đó. Vì vậy, chúng ta không nên học thuộc lòng thuật toán tìm kiếm trên một tập dữ liệu duy nhất. Mà bạn hãy học ý tưởng của thuật toán và thực hiện áp dụng nó một cách linh hoạt cho các cấu trúc dữ liệu khác nhau ở các ngôn ngữ lập trình khác nhau. Từ đó lựa chọn được thuật toán nhanh nhất, tối ưu nhất cho mục đích của bạn.

Xử lý ngoại lệ(Exception) giúp ứng dụng, chương trình của bạn tránh được những sự cố, lỗi khi thực thi chương trình. Trong C# cung cấp, hỗ trợ việc sử lý ngoại lệ thông qua các khối lệnh try, catch, finally. Hãy cùng mình tìm hiểu cách sử lý ngoại lệ qua bài viết này nhé.

Ngoại lệ Exception là gì

Ngoại lệ (hay exception) là vấn đề – lỗi phát sinh trong khi chương trình được thực thi. Thông thường khi ứng dụng, chương trình đang chạy mà phát sinh ngoại lệ (lỗi) sẽ dẫn đến chương trình bị kết thúc(dừng lại) ngay lập tức. Có rất nhiều nguyên nhân dẫn tới việc chương trình đang chạy mà phát sinh ngoại lệ, ví dụ như:

  • Dữ liệu do người dùng nhập bị sai, mà chương trình kiểm soát không được.
  • Thực hiện các phép toán không cho phép (ví dụ như chia một số cho 0).
  • Thực hiện thao tác với tài nguyên không tồn tại (ví dụ mở file không có trên đĩa, thực hiện kết nối đến CSDL không tồn tại …).
  • Do thiếu bộ nhớ.

Ở trong C# khi có một lỗi(Exeption ) phát sinh thì hầu hết các lỗi đều có thể quản lý bởi thư viện C# thì nó sẽ phát sinh ra một đối tượng lớp Exeption (System.System) hay là một đối tượng lớp nào đó kế thừa từ Exception.

Exception Handling (Xử lý ngoại lệ) ở trong C# được xây dựng dựa trên 4 từ khóa đó là: trycatchfinally, và throw.

  • try: Một khối try nhận diện một khối code mà ở đó các exception cụ thể được kích hoạt. Các khối code được giám sát để bắt lỗi nếu có. nếu có lỗi sẽ phát sinh ngoại lệ Exception. Ngoại lệ này bắt lại được ở khối catch. Theo sau nó bởi một hoặc nhiều khối catch.
  • catch: Đây là một chương trình bắt một Exception với một Exception Handler tại vị trí trong một chương trình nơi mà bạn muốn xử lý vấn đề đó. Từ khóa catchở trong C# chỉ dẫn việc thực hiện bắt một exception.
  • finally: Một khối finally được sử dụng để có thể thực thi một tập hợp lệnh đã cho. Dù là có hay không một exception được ném hay không được ném. Ví dụ như là nếu bạn mở một file, nó phải được đóng, nếu không sẽ có một exception tạo ra.
  • throw: Là một chương trình ném một exception khi có một vấn đề nào đó xuất hiện. Nó được thực hiện bởi việc sử dụng từ khóa throwtrong C#.
exception trong C#
exception trong C#

Cú pháp

Ví dụ ta có một khối tạo một Exeption và một phương thức bắt một exception bởi sử dụng kết hợp những từ khóa try và catch. Ta đặt một khối try/catch xung quanh code mà có thể xảy ra một exception.

Code ở bên trong của một khối try/catch được xem như là code được bảo vệ, và cú pháp để sử dụng try/catch ở trong C# ta viết như sau:

try{

// những lệnh có thể gây ra ngoại lệ (exception)

}catch( tên_ngoại_lệ e1 )

{

// phần code để xử lý lỗi}

catch( tên_ngoại_lệ e2 )

{

// phần code để xử lý lỗi}

catch( tên_ngoại_lệ eN )

{

// phần code để xử lý lỗi}

finally{

// các lệnh được thực thi}

Nếu như ngoại lệ (lỗi thực thi) phát sinh mà chúng ta không xử lý thì chương trình sẽ dừng đột ngột. Nếu muốn xử lý ngoại lệ(lỗi) thì chúng ta cần bắt lấy nó và điều hướng chương trình một cách thích hợp.

Đối tượng lớp Exception trong C# có một số thuộc tính, tiện dụng cho bạn gỡ rối đó là:

  • Message: dạng chuỗi chứa nội dung thông báo lỗi.
  • StackTrace: Là chuỗi chứa các bước thực thi chương trình cho đến khi bị lỗi (có chứa các phương thức, hàm khi thực thi gây lỗi, vị trí file lỗi …)
  • Source: Chứa tên ứng dụng hoặc đối tượng bị lỗi.

Bạn có thể sử dụng nhiều lệnh catch để bắt những loại exception khác nhau tùy vào trong từng trường hợp khối try của bạn xuất hiện nhiều hơn một exception và trong các tình huống khác nhau.

cách xử lý exeption
cách xử lý exeption

Xem thêm:  Csharp là gì?

Thực hành bắt lỗi:

static void Main(string[] args)

{

try {

// khối này được giám sát để bắt lỗi - khi nó phát sinh

int[] mynumbers = new int[] {1,2,3};

int i = mynumbers[10];                  // dòng này phát sinh lỗi

Console.WriteLine(i);                   // dòng này không được thực thi vì lỗi trên

}

catch (Exception loi)

{

// khối này thực thi khi bắt được lỗi

Console.WriteLine("Có lỗi rồi");

Console.WriteLine(loi.Message);

}
}

Có lỗi rồi

Index was outside the bounds of the array.

Lớp Exception trong C# là gì

Các Exception ở trong C# sẽ được biểu diễn bởi các lớp. Các lớp Exception ở trong C# chủ yếu sẽ được kế thừa một cách trực tiếp hoặc không trực tiếp từ lớp System.Exception trong C#. Một số lớp Exception khác kế thừa từ lớp System.Exception là các lớp System.ApplicationException và System.SystemException.

Lớp System.ApplicationException nó hỗ trợ các exception được tạo bởi các chương trình ứng dụng. Vì vậy, những exception mà được định nghĩa bởi lập trình viên nên kế thừa từ lớp này.

Lớp System.SystemException đây là lớp cơ sở cho tất cả system exception tiền định nghĩa.

Một số lớp Exception tiền định nghĩa được kế thừa từ lớp Sytem.SystemException trong C#:

Lớp ExceptionMô tả
System.IO.IOExceptionXử lý các I/O lỗi
System.IndexOutOfRangeExceptionXử lý các lỗi được tạo khi một phương thức tham chiếu tới một chỉ mục bên ngoài dãy mảng.
System.ArrayTypeMismatchExceptionXử lý các lỗi được tạo khi kiểu là không phù hợp với kiểu mảng
System.NullReferenceExceptionXử lý các lỗi được tạo từ việc tham chiếu một đối tượng null
System.DivideByZeroExceptionXử lý các lỗi được tạo khi chia cho số 0.
System.InvalidCastExceptionXử lý lỗi được tạo trong khi ép kiểu.
System.OutOfMemoryExceptionXử lý lỗi được tạo từ việc thiếu bộ nhớ rỗi.
System.StackOverflowExceptionXử lý lỗi được tạo từ việc tràn ngăn xếp (stack).

Ném (throw) các Object trong C#

Bạn có thể thực hiện ném một đối tượng nếu nó: hoặc là trực tiếp hoặc gián tiếp được kế thừa từ lớp System.Exception trong C#. Bạn có thể sử dụng một lệnh throw trong khối catch để ném đối tượng hiện diện đó:

Catch(Exception e)
{
...
Throw e
}

Một số điểm cần lưu ý về xử lý Try/Catch trong C#

  • Khối try phải được theo sau bởi một khối catch hoặc finally hoặc là cả 2.
  • Sử dụng các khối try, catch và finally để xử lý các ngoại lệ ở trong C#
  • Có thể sử dụng nhiều khối catch để bắt và xử lý nhiều loại Exception khác nhau.
  • Khối finally sẽ luôn được thực thi bất kể có hay không có ngoại lệ xảy ra.
  • Khối finally phải đặt sau khối try hoặc catch.
  • Trong khối finally sẽ không dùng được các từ khóa return, continue, break vì nó không cho phép dời khỏi khối này.
  • Trong C# khối try catch lồng nhau được sử dụng.
  • Với một ngoại lệ(Exception) nó sẽ được sử lý ở khối catch bên trong nếu tìm thấy bộ lọc thích hợp, còn không nó sẽ bị bắt và xử lý ở khối catch bên ngoài.
  • Việc sử dụng throw thay vì dùng throw ex sẽ giúp giữ stack trace hỗ trợ việc truy vết và lý lý lỗi dễ hơn.

Cảm ơn các bạn đã xem bài viết của mình. Mong nhận được những góp ý từ các bạn để bài viết được hoàn thiện hơn.

Khi bạn mới bắt đầu vào lập trình, có thể bạn sẽ có đôi chút nhầm lẫn về 2 ngôn ngữ là C và C++. Có thể nhiều bạn nghĩ hai ngôn ngữ này là một. Nhưng thực tế không phải như vậy, Bài viết này sẽ giúp bạn hiểu hơn về hai ngôn ngữ này và sự khác nhau giữa C và C++.

Ngôn ngữ C là gì

Ngôn ngữ C được sử dụng lần đầu trên một hệ thống cài đặt hệ điều hành UNIX. Ngôn ngữ C có nguồn gốc từ ngôn ngữ BCPL do Martin Richards phát triển.

Những kiểu dữ liệu chính của C gồm : kiểu ký tự (character), kiểu số nguyên (interger) và kiểu số thực (float). Ngôn ngữ C liên kết chặt chẽ với hệ thống UNIX nhưng không bị trói buộc vào bất cứ một máy tính hay một hệ điều hành nào.

C cũng được dùng để lập trình hệ thống. C đang được sử dụng rộng rãi bởi vì tính hiệu quả và linh hoạt. Trình biên dịch (compiler) C có sẵn cho hầu hết các máy tính. Mã lệnh viết bằng C trên máy này có thể được biên dịch và chạy trên máy khác chỉ cần thay đổi rất ít hoặc không thay đổi gì cả.

C khi thực thi cũng rất nhanh như hợp ngữ (Assembly). Lập trình viên có thể tạo ra và bảo trì thư viện hàm mà chúng sẽ được tái sử dụng cho chương trình khác. Vì vậy, những dự án lớn có thể được quản lý dễ dàng mà tốn rất ít công sức.

Ngôn ngữ C là gì
Ngôn ngữ C là gì

Ngôn ngữ C++ là gì?

Ngôn ngữ lập trình C++ đây là một ngôn ngữ lập trình hướng đối tượng(OOP – Object-oriented programming). C++ là ngôn ngữ lập trình được phát triển trên nên tảng của ngôn ngữ lập trình C. Vì vậy, C++ có cả 2 phong cách là lập trình hướng cấu trúc giống C và có phong cách hướng đối tượng. Có nhiều trường hợp, C++ sử dụng kết hợp cả 2 phong cách trên.

Ngôn ngữ C++ là một ngôn ngữ lập trình cấp trung. Bởi vì nó có các tính chất của cả ngôn ngữ lập trình bậc thấp(Pascal, C…) và ngôn ngữ lập trình bậc cao(C#, Java, Python…).

ngôn ngữ c++
ngôn ngữ c++

Sự khác nhau giữa C và C++

C và C++ có những điểm khác biệt như sau:

  • C++ là ngôn ngữ hướng đối tượng, trong khi C là một ngôn ngữ thủ tục.
  • C++ có xử lý ngoại lệ được thiết kế tốt (khối (Try) và (Catch)), nhờ vậy nó giúp quá trình gỡ lỗi dễ dàng hơn trong C. Tính năng này rất hữu ích để tìm những lỗi khó. Trong C, xử lý lỗi xảy ra thông qua các chức năng.
  • C++ cũng hỗ trợ ẩn thông tin (liên quan chặt chẽ đến tính đóng gói của oop).
  • Dữ liệu trong C++ sẽ an toàn hơn so với C vì C++ cung cấp công cụ sửa đổi để giới hạn quyền truy cập của người dùng.
  • Ngôn ngữ C++ có hỗ trợ nạp chồng hàm, có nghĩa là một hàm có cùng tên có thể được khai báo cho những mục đích khác nhau…
  • C++ cũng hỗ trợ việc sử dụng các không gian tên, nhờ vậy cho phép bạn tổ chức mã theo phạm vi mong muốn. Ví dụ, các thực thể được nhóm có thể được đặt trong những phạm vi hẹp hơn được gọi là phạm vi không gian tên. Ở C không hỗ trợ tính năng này.
  • Những chuyên gia kết nối C++ với khái niệm đa mô hình. Mặc dù chúng ta phân loại C++ là ngôn ngữ hướng đối tượng, nó cũng có các tính năng của ngôn ngữ thủ tục. Do đó, C++ linh hoạt hơn C vì C chỉ tuân theo logic thủ tục.

Xem thêm: Hướng đối tượng là gì?

Vì vậy, việc so sánh 2 ngôn ngữ C và C++ về mặt quy tắc, cú pháp đưa đến một vài kết luận quan trọng trong việc đánh giá C và C++ khác nhau là:

  • Việc sử dụng C và C++ khác nhau sẽ kéo theo các phương pháp lập trình khác nhau.
  • Với C++, những nhà phát triển có thể theo cả lập trình hướng đối tượng và hướng đối tượng.
  • C chỉ cho phép việc lập trình thủ tục.
  • C++ nó cung cấp nhiều tính năng hơn như xử lý lỗi, bảo mật dữ liệu, quản lý phạm vi, ẩn thông tin,..
  • Với người mới bắt đầu vào lập trình, ngôn ngữ C có thể đơn giản và hữu ích hơn trong việc học, hiểu các khái niệm chính của lập trình bậc thấp.

Những điểm giống nhau giữa C với C++

Vì lý do C++ nó được mở rộng từ C nên điểm giống nhau của chúng sẽ là tất cả những gì có từ ngôn ngữ C:

  • Có cùng cú pháp và cách viết code.
  • Cấu trúc code giống nhau
  • Bộ biên dịch code tương đối giống nhau.
  • Mô hình bộ nhớ giống nhau và đều khá gần gũi với phần cứng
  • Đều sử dụng chung các khái niệm như stack, heap, file-scope, static variables …

Và còn những điểm giống nhau khác nữa.

điểm giống nhau giữa c và c++
điểm giống nhau giữa c và c++

Nên chọn học ngôn ngữ C hay C++?

Có một số lời khuyên từ mình rút ra được cho các bạn muốn tìm hiểu về lập trình như sau:

  • Nếu bạn đã biết C thì việc bạn học về C++ sẽ rất dễ dàng .
  • Học C sẽ giúp bạn biết về con trỏ, cách mà máy tính quản lý và cấp phát bộ nhớ cho các chương trình.
  • Trường đại học của bạn lựa chọn ngôn ngữ nào để dạy sinh viên? Theo giáo trình sẽ giúp bạn học hành thuận lợi hơn đó.

Ngôn ngữ C++ có gì cải tiến hơn so với C?

  • Ngôn ngữ lập trình C++ là ngôn ngữ thiên về hướng đối tượng.
  • Là loại ngôn ngữ định kiểu rất mạnh.
  • C++ cung cấp những cách truyền tham số bằng những tham chiếu khác dành cho hàm.
  • C++ cung cấp về cơ cấu thư viện để người lập trình có thể thực hiện tạo hàm thông dụng vào thư viện cũng như việc tái sử dụng về sau.
  • Ngôn ngữ C++ có cơ chế đa dạng hóa cho tên hàm và toán tử.

So sánh giữa Objective-C với C++

Objective-C là một ngôn ngữ lập trình đa năng, nó giúp tăng cường C với tin nhắn kiểu như Smalltalk.
Objective-C chủ yếu để xây dựng các ứng dụng cho hệ điều hành iOS và OS X. Ngôn ngữ này là một biến thể khác của ngôn ngữ lập trình C.

Cả hai ngôn ngữ Objective-C với C ++ đều là ngôn ngữ hướng đối tượng và nó có nguồn gốc từ C. Một số so sánh về 2 ngôn ngữ này:

  • Objective-C năng động hơn ngôn ngữ lập trình tĩnh C++.
  • Objective-C không cung cấp đa kế thừa trong khi C++ thì có.
  • Sự khác biệt trong cách nhìn về mã C++ và Objective-C. Ví dụ, C++ sử dụng true (đúng) và false (sai) cho kiểu bool, nhưng với Objective-C hoạt động với Yes (Có) và No (Không) cho kiểu bool.
  • Ngôn ngữ Objective-C có một tính năng Smalltalk. Nghĩa là một mô hình nhắn tin mà khi bạn chuyển các tin nhắn sẽ được gọi là đến các đối tượng thông qua các chức năng hoặc là bộ chọn.
  • Trong khi ngôn ngữ C++ nó sẽ quản lý các cấu trúc và các lớp giống nhau thì Objective-C xử lý chúng hoàn toàn khác nhau.
  • Objective-C chủ yếu để xây dựng các ứng dụng cho các sản phẩm của Apple, trong khi ngôn ngữ C++ là một ngôn ngữ đa dạng hơn được áp dụng trong nhiều lĩnh vực khác nhau.

So sánh hiệu suất của c và c++

Thực tế cho thấy là C nhanh hơn so với C++. Tuy nhiên, ở trong một số tình huống nhất định, C++ có vẻ nhanh hơn C trong cuộc đua tốc độ này. Tuy nhiên, việc đánh giá sự khác biệt về tốc độ của hai ngôn ngữ được biên dịch là vẫn còn khó khăn.

Tốc độ C vs C++ còn phụ thuộc nhiều vào tổng thể mã code được tạo ra. Mã của C++ được viết tốt có thể hoạt động tốt hơn hoặc giống như mã C được viết tốt.
Vì vậy, C và C++ khác nhau như thế nào hiện vẫn đang là một chủ đề khá tranh cãi và chưa có ngôn ngữ nào hoàn toàn nổi bật hơn ngôn ngữ còn lại.

Mong rằng bài viết này hữu ích cho mọi người. Giúp mọi người hiểu rõ và phân biệt về ngôn ngữ C và C++.