[BC-PROGRAMMING] BIẾN VÀ KIỂU DỮ LIỆU

GIỚI THIỆU
Đây là những bài viết tập hợp các khái niệm cũng như kiến thức cơ bản về lập trình mà mình rút ra được trong 4 năm học tại Đại học. Chắc chắn sẽ có nhiều thiếu sót nên các bạn cứ thoải mái góp ý để bài viết được tốt hơn nhé.
Mỗi phần mình sẽ đều note lại những ý quan trọng, các bạn có thể chỉ cần ghi nhớ những ý chính là đủ. Cảm ơn các bạn!!!

BASIC CONCEPTS OF PROGRAMMING LANGUAGE — VARIABLE AND DATA TYPE

BIẾN (VARIABLE):
Đầu tiên chúng ta cần phân biệt “biến” trong lập trình và biến trong toán học, trong toán học biến thường đặt trong các phương trình và ta thường phải đi tìm giá trị hoặc khoảng xác định của nó.

Biến trong lập trình được xem như một khu vực lưu trữ với một địa chỉ xác định, để dễ hiểu các bạn hãy tưởng tượng biến trong lập trình như một ngôi nhà. Trong ngôi nhà đó có rất nhiều đồ đạc — giá trị của biến (value), và nhà thì đương nhiên phải có địa chỉ nhà (address) hay ít nhất sổ hồng sổ đỏ để thể hiện quyền chính chủ. Các bạn lưu ý đến khái niệm địa chỉ của biến trong máy, vì thường người khác đặt câu hỏi liên quan đến nó nhằm kiểm tra trình độ hiểu “sâu” về lập trình của bạn như thế nào, về phần địa chỉ mình sẽ nói ở các bài viết sau.

Mình xin trích dẫn định nghĩa của biến từ wiki như sau:


In computer programming, a variable or scalar is a storage location paired with an associated symbolic name (an identifier), which contains some known or unknown quantity of information referred to as a value.


Các bạn có thể thấy rằng wiki định nghĩa về biến khá rõ ràng, bao gồm 3 keyword chính đó là: storage location, value, symbolic name. Mình đã nói các bạn về 2 keyword đầu là bản chất và giá trị của biến, keyword thứ ba đó là symbolic name, đây là khái niệm gần như tới năm thứ 3 đại học mình mới bắt đầu hiểu ra tác dụng của nó, và thường thì thầy cô cũng không yêu cầu cao về vấn đề này nên thường bỏ qua và sinh viên cũng quên bén nó đi luôn, nói dễ hiểu rằng khi bạn đặt tên biến thì tên biến đó phải có nghĩa hoặc mang một ý nghĩa tượng trưng nào đó.
Đồng ý rằng mặc dù các bạn có thể đặt biến của mình tên là Tèo, Tí, Tủn,.. gì gì đấy, không sao, chương trình bạn vẫn chạy bình thường, vì đó chỉ là cái tên biến, không ảnh hưởng gì. Tuy nhiên sẽ có 2 vấn đề xảy ra khi bạn đặt tên biến quá theo “cảm xúc” như thế:

- Cực kỳ khó khăn trong việc fix lỗi
Chắc chắn sau này bạn sẽ phải code một chương trình lên tới hàng trăm thậm chí hàng nghìn dòng code, và code bạn bỗng dưng đưa ra kết quả sai, mình không nói là code bạn chạy sai nhé, nếu sai thì sửa cũng khá dễ vì các IDE hiện tại đều báo chi tiết và vị trí xảy ra lỗi. 
Bạn trông chờ chương trình sẽ trả về chuỗi “Tèo đẹp trai” mà code bạn khi build xong thì lại trả về chuỗi “Tí xấu trai”, bây giờ bạn phải ngồi đọc code lại xem là mình đã làm sai chỗ nào, không biết là chỗ biến Tèo, hay chỗ biến Tủn, hay ở điều kiện so sánh giữa biến Tí và biến Tèo,…, Tèo Tún Tỉ nó cứ loạn xà ngầu lên.
Hoặc một hai tháng sau, khi bạn mở lại code của mình ra, và nhìn vào các tên biến “không đụng hàng” ấy, bạn sẽ phải thốt lên một câu: “Tôi đã từng code cái gì thế này” — tin mình đi, bạn sẽ gặp rất nhiều anh chị đi trước nói câu này hoài luôn.

- Thiện ác báo ứng, nhân quả tuần hoàn
Chuyện bạn tự gây khó khăn cho bạn thì mình cũng không ý kiến gì nhiều, đó là bạn tự làm tự chịu, nhưng vấn đề là, sau này các bạn đi làm, chắc chắn các bạn sẽ phải fix code hoặc code tiếp chương trình của người khác. Vì sao? Người trước code chương trình bình thường chạy ngon ơ, người ta chuyển công ty, bỗng dưng chương trình phát sinh lỗi, và biết đâu bất ngờ bạn là người may mắn được gọi lên fix bug. Hoặc một anh đẹp trai, chị xinh gái đang code dở một project to tướng, giờ người ta cần anh chị đó làm lead một project khác, các yêu cầu cơ bản của project trước đã có rồi, giờ chỉ phát triển nó thêm thôi, công ty nhờ bạn, đương nhiên bạn không thể nói: “Em chỉ có thể sửa hoặc upgrade code của em viết thôi!”.
Và tada, bạn nhận code về, những người đi trước đặt tên biến theo kiểu $homnaytroinang, int ngaymaitroimua, bool truanayangi,… Bạn nghĩ mình đủ dũng cảm và mạnh mẽ trước một mớ bug với đống code lằng nhằng và được bonus thêm khoảng 100–200 tên biến cực kỳ cute kiểu vậy hay không? Nếu là mình thì chắc mình xin chuyển qua bộ phận khác luôn.

Do đó khi đặt tên biến thì hãy đặt tên mang một ý nghĩa tượng trưng nào đó, khuyến khích sử dụng tiếng Anh, để khi người khác hoặc bạn khi nhìn vào tên biến, thì có thể mơ hồ dự đoán được mục đích của biến đó dùng để làm gí. Các bạn có thể tìm hiểu sâu hơn về việc đặt tên biến bằng từ khóa: naming convention in programming.

KIỂU DỮ LIỆU (DATA TYPE):
Một vài bạn hay lầm lẫn giữa data type và data structure, đây là hai khái niệm hoàn toàn khác nhau nhé, kiểu dữ liệu là dạng dữ liệu mà người dùng muốn sử dụng hoặc muốn trả về (int, float,…), cấu trúc dữ liệu là một kiểu dữ liệu đặc biệt được người dùng xây dựng và sử dụng (list, hash,…)

Ở đây mình sẽ không liệt kê chức năng cũng như mục đích sử dụng của tất cả các thể loại kiểu dữ liệu trên đời như int, float, string, char,… Mình chỉ đề cập đến các kiểu dữ liệu mà bất cứ ngôn ngữ nào cũng cần có:
- Kiểu dữ liệu bool: Đây là kiểu dữ liệu thường được sử dụng trong các câu điều kiện, kiểu dữ liệu bool chỉ mang hai giá trị: “true” và “false” tương đương với giá trị 1 và 0 trong kiểu dữ liệu số.
- Kiểu dữ liệu số: Khá đơn giản, đây là kiểu dữ liệu lưu trữ các giá trị số và có thể tính toán như trong toán học. VD: a=3, b=5, c=a+b => c=8.
- Kiểu dữ liệu chuỗi: Đây là kiểu dữ liệu chứa các ký tự, và khá nhiều ngôn ngữ sẽ hỗ trợ các phép tính nối chuỗi, so sánh chuỗi bằng các phép tính +, — như bên kiểu dữ liệu số, tuy nhiên lưu ý là kết quả trả về hoàn toàn khác nhau. VD: a=”3", b=”5", c=a+b => c=”35"
- Kiểu dữ liệu mảng (hoặc tương tự): Đây là kiểu dữ liệu được sử dụng rất nhiều, mảng là một tập hợp với các phần tử có thể là một tập hợp con hoặc một giá trị. Ở một vài ngôn ngữ, các giá trị và các tập hợp con trong mảng không nhất thiết phải cùng kiểu dữ liệu. Người ta thường gọi các mảng đó là mixed array hoặc junk array.
Kiểu dữ liệu mảng rất quan trọng vì nó được sử dụng gần như là trong tất cả các trường hợp, các bạn có thể chuyển các kiểu dữ liệu khác về dạng mảng để xử lý, do đó các bạn nên tìm đọc các khái niệm về mảng, đặc biệt là mảng đa chiều (multidimensional array).

Ngoài ra sẽ có các kiểu dữ liệu đặc trưng khác ở các ngôn ngữ lập trình như stack, queue, hashtable, binary tree,… Tuy nhiên với 4 kiểu dữ liệu trên, mình nghĩ là đã đủ để giải quyết các bài toán cũng như công việc thông thường, và hiện nay nhiều ngôn ngữ đã gộp chung các kiểu dữ liệu thành 2 kiểu duy nhất là array và không phải array. Do đó cũng khá dễ dàng cho việc lập trình, chúng ta không cần phải bận tâm suy nghĩ nên để kiểu dữ liệu gì cho thích hợp với mục đích sử dụng của biến.

TÓM TẮT (SUMMARY):
Mình tóm tắt lại các điểm cần phải lưu ý sau:
- Đặt tên biến phải rõ ràng và mang ý nghĩa (có thể mang ý nghĩa tượng trưng).
- Biến là một khu vực để lưu trữ giá trị.
- Mỗi biến đều có một địa chỉ nhất định và không trùng với địa chỉ nào khác.
- Lưu ý về mục đích sử dụng mà chọn kiểu dữ liệu cho phù hợp.