Up and Going – Hiểu về lập trình (Phần 2)

Up and Going – Hiểu về lập trình (Phần 2)

August 28, 2018 0 By Nam Vu

Bình luận trong code
Nhân viên cửa hàng điện thoại có thể liệt kê vài tính năng của loại điện thoại mới hoặc một số kế hoạch của công ty cô ta đưa ra. Những ghi chú đó chỉ dành cho nhân viên — nó không phải dành cho khách hàng. Tuy nhiên, những ghi chú đó đó giúp cô ta làm việc tốt hơn bằng cách tài liệu hoá những gì cô có thể nói với khách hàng.
Một trong những bài học quan trọng là bạn có thể học bằng cách viết code không chỉ cho máy tính, mà còn dành cho lập trình viên cũng như trình biên dịch.
Máy tính của bạn chỉ quan tâm đến mã máy, một chuỗi nhị phân 0s và 1s đến biên dịch. Có vô số chương trình mà bạn có thể viết và mang lại kết quả tương tự với chuỗi 0–1. Sự lựa chọn là bạn viết chương trình tế nào — không chỉ riêng bạn, mà còn là thành viên khác trong nhóm và kể cả tương lai của chính bạn.
Bạn có thể phấn đấu không chỉ viết chương trình cho nó chạy đúng, mà còn dễ dàng kiểm định. Bạn có thể mất nhiều thời gian cho việc chọn một cái tên tốt cho biến, cho hàm.
Nhưng phần quan trọng khác là code comment. Có một số văn bản trong chương trình của bạn được đưa vào thuần tuý là để giải thích cho người. Trình thông dịch/ biên dịch sẽ bỏ qua
những comment đó. Có rất nhiều quan điểm về việc điều gì làm nên một comment tốt; chúng ta thực sự không thể xác định một quy tắc bao trùm. Nhưng có một số nhận xét và hướng dẫn có ích:
● Code không có comment là chưa đủ tối ưu.
● Quá nhiều comment là dấu hiệu của code tồi.
● Comment nên giải thích vì sao thay vì cái gì. Nó có thể giải thích vì sao nếu có chút phức tạp.
Trong JavaScript, có hai kiểu comment khả dụng: là comment dòng đơn và comment đa dòng.
Nhận biết:

// Đây là comment dòng đơn
/* Đây là 
comment 
đa dòng
*/

// Comment dòng đơn thích hợp với việc bạn đặt comment ngay trên một biểu thức hoặc cuối dòng. Những gì trên dòng có dấu // đều được coi như là comment (được bỏ qua bởi biên dịch) từ đầu cho đến cuối dòng đó. Không có bất kỳ cá biệt nào có thể xuất hiện trên comment dòn đơn.
Xem:
var a = 42; // 42 là ý nghĩa cuộc đời
/* .. */ Comment đa dòng thích hợp với việc nếu bạn có một vài dòng cần giải thích.
Đây là cách sử dụng comment đa dòng thông thường:
/* Giá trị sau đây được sử dụng bởi vì nó đã thể hiện rằng nó chính là câu trả lời mọi câu hỏi trong vũ trụ */
var a = 42;
Nó có thể xuất hiện trong một dòng, thậm chí giữa dòng, bởi vì có */ là kết thúc. Ví dụ:
var a = /* arbitrary value */ 42;
console.log( a ); // 42
Thứ duy nhất không thể xuất hiện trong comment đa dòng là */ , bởi vì nó có thể tạo ra kết comment.
Bạn sẽ muốn bắt đầu học lập trình bằng cách bắt đầu bằng thói quen comment code. Trong suốt phần còn lại của chương này, bạn sẽ thấy bạn muốn dùng comment để giải thích các
thứ, hãy làm tương tự với sự luyện tập của bạn. Tin tôi đi, mọi người đọc code của bạn sẽ cảm ơn bạn!

Biến
Hầu hết chương trình hữu ích đều muốn theo dõi một giá trị và sự thay đổi của chúng suốt chương trình, trải qua những biểu thức được gọi theo dự tính của chương trình.
Cách đơn giản nhất để thực hiện điều này là gán một giá trị cho một biểu tượng chứa nó, nó gọi là biế n — bởi vì giá trị trong vật chứa này có thể biế n đổ i trong suốt quá trình như
mong muốn.
Vài ngôn ngữ lập trình, bạn khai báo một biến để chứa một giá trị có kiểu riêng biệt, ví dụ number hoặc string . Static typing hay còn gọi là kiểu thực thi thường được dẫn chứng là một lợi ích cho sự chính xác của chương trình bằng cách bảo vệ nó khỏi sự
chuyển đổi giá trị không mong muốn.
Một số ngôn ngữ khác nhấn mạnh kiểu cho giá trị thay vì biến. Weak typing , hay còn gọi là dynamic typing , cho phép một biến có thể giữ bất kỳ kiểu giá trị tại bất kỳ thời điểm nào. Nó thường được dẫn chứng về lợi ích linh động của chương trình bằng cách cho phép một biến đại diện cho một giá trị cho dù nó là kiểu giá trị gì tại bất kỳ thời điểm nào theo chu trình logic của chương trình.
JavaScript sử dụng cách tiếp cận thứ hai, dynamic typing, nghĩa là biến có thể giữ bất kỳ giá trị của bất kỳ kiể u nào mà không bắt buộc kiểu thực thi.
Như đã giới thiệu, chúng ta khai báo một biến sử dụng biểu thức var — chú ý rằng không có thông tin kiểu trong khai báo.
Xem một chương trình đơn giản sau:

var amount = 99.99;
amount = amount * 2;
console.log( amount ); // 199.98
// chuyển `amount` sang một string, và thêm "$"
// ở đầu.
amount = "$" + String( amount );
console.log( amount ); // "$199.98"

Biến amount ban đầu giữ một number 99.99, và sau đó giữ kết quả number kết quả của amount * 2 tức là 199.98 .
Lệnh console.log(..) đầu tiên ngầ m buộc giá trị number thành string để in ra. Tiếp đó lệnh amount = “$” + String(amount) rõ ràng ép giá trị 199.98 thành một string và thêm ký tự “$” đằng trước. Tại đây, amount có string giá trị “$199.98” , vì thế console.log(..) thứ hai không cần phải cưỡng ép gì cả để in nó ra.
Lập trình viên JavaScript sẽ lưu ý tính linh hoạt của việc sử dụng biến amount cho các giá trị 99.99 . 199.98 , và “$199.98”. Những người thích static-typing sẽ thích tách biến kiểu như amountStr để giữ gía trị “$199.98” cuối cùng, bởi vì nó là một kiểu khác.
Dù thế nào, bạn cũng để ý rằng amount giữ một giá trị đang chạy mà thay đổi trong quá trình hoạt động của chương trình, minh họa cho mục đích chính của các biến là: quản lý state của chương trình.
Nói theo cách khác, state là theo dõi các thay đổi của giá trị khi chương trình hoạt động.
Một cách sử dụng phổ biến khác của các biến là tập trung hóa thiết lập giá trị. Thường được gọi là constants , khi bạn khai báo một biết với một giá trị xác định không thay đổi suốt chương trình.
Bạn khai báo constants , thường là ở đầu chương trình, tiện để bạn có một chỗ để thay đổi giá trịnh khi cần. Theo quy ước, các biến JS hằng số thường được viết hoa, hay có gạch dưới _ giữa các liên từ.
Dưới đây là ví dụ:

var TAX_RATE = 0.08; // 8% sales tax
var amount = 99.99;
amount = amount * 2;
amount = amount + (amount * TAX_RATE);
console.log( amount ); // 215.9784
console.log( amount.toFixed( 2 ) ); // "215.98"

Chú ý: Tương tự như làm thế nào console.log(..) là một function log(..) truy cập như một thuộc tính object trong giá trị console , toFixed(..) ở đây là một function có thể truy cập các giá trị number. Các number JavaScript không tự động định dạng cho dollars — cơ chế không thể biết được ý định của bạn và không có kiểu tiền tệ. toFixed(..) cho phép chúng ta chỉ định làm tròn số thập phân number như mong muốn, và nó tạo ra
string như ý.
Biến TAX_RATE là một constant theo quy ước — không có gì đặc biệt trong chương trình ngăn cho nó không thay đổi. Nhưng nếu thành phố tăng thuế bán lên 9%, chúng ta có thể dễ dàng
cập nhật chương trình bằng cách cấu hình lại TAX_RATE bằng giá trị 0.09 cùng một nơi, thay vì phải tìm nhiều nhiều giá trị 0.08 rải rác khắp chương trình và cập nhật tất cả.
Phiên bản mới nhất của JS tại thời điểm biết bài này (thường gọi là “ES6”) đã có cách mới để khai báo constants, bằng cách sửa dụng const thay cho var :

// as of ES6:
const TAX_RATE = 0.08;
var amount = 99.99;
// ..

Const rất hữu dụng giống như var với giá trị không đổi, khác biệt là nó ngăn ngừa sự thay đổi giá trị vô tình xảy ra ở đâu đó sau giá trị khởi tạo. Nếu bạn thử gán giá trị khác cho TAX_RATE sau lần khai báo đầu tiên, chương trình của bạn sẽ từ chối thay
đổi (trong strict mode, sẽ thất bại với lỗi).
Tuy nhiên, cách “bảo vệ” khỏi các sai sót này cũng tương tự như các ngôn ngữ static-typing, nên bạn có thể thấy tại sao static types trong ngôn ngữ khác hấp dẫn.

Blocks
Nhân viên cửa hàng điện thoại phải đi qua tất cả các khâu để hoàn tất việc thanh toán khi bạn mua điện thoại. Tương tự, trong code chúng ta thường nhóm các biểu thức với nhau, thường được gọi l2 block . Trong JavaScript, một block được xác định bằng các bao một hoặc nhiều lệnh trong dấu ngoặc {…} . Ví dụ:

var amount = 99.99;
// a general block
{
    amount = amount * 2;
    console.log( amount ); // 199.98
}

Kiểu block {…} chung này hợp lệ, nhưng không thường thấy trong các chương trình JS. Thông thường, block được gắn liền với một lệnh điều khiển, chẳng hạn như biểu thức if. Ví dụ:

var amount = 99.99;
// is amount big enough?
if (amount > 10) { // <-- block attached to `if`
    amount = amount * 2;
    console.log( amount ); // 199.98
}

Chúng ta sẽ giải thích if trong phần tiếp theo, nhưng như bạn thấy, {…} block có 2 câu lệnh được gắn với if (amount > 10);câu lệnh bên trong block sẽ chỉ thực hiện khi điều kiện đáp ứng.
Chú ý: Không giống hầu hết các lệnh khác như console.log(amount); một block lệnh không cần dấu chấm phẩy ( ; ) để kết thúc.

Điều kiện
“Bạn có muốn thêm bảo vệ màn hình với chỉ $9.99 không?” Nhân viên hỗ trợ cửa hàng điện thoại đã tạo một quyết định cho bạn. Nhưng rõ ràng, đây chỉ là một câu hỏi “yes hoặc no”.
Có nhiều cách để bạn diễn đạt điề u kiệ n trong chương trình.
Loại thường thấy là lệnh if . Về cơ bản, khi bạn nói ” Nếu điều kiện này đúng, hãy làm theo…”. Ví dụ:

var bank_balance = 302.13;
var amount = 99.99;
if (amount < bank_balance) {
    console.log( "I want to buy this phone!" );
}

Lệnh if cần một diễn đạt trong dấu ngoặc đơn () được thể hiện như true hoặc false . Trong ví dụ, chúng ta có biểu thức amount < bank_balance , nó sẽ xác định true hoặc false tùy thuộc vào giá trị của biến bank_balance. Bạn cũng có thể cung cấp một sự thay thế điều kiện nếu nó không thỏa, gọi mệnh đề else:

const ACCESSORY_PRICE = 9.99;
var bank_balance = 302.13;
var amount = 99.99;
amount = amount * 2;
// can we afford the extra purchase?
if ( amount < bank_balance ) {
    console.log( "I'll take the accessory!" );
    amount = amount + ACCESSORY_PRICE;
}
// otherwise:
else {
    console.log( "No, thanks." );
}

Tại đây, nếu amount < bank_balance là true, chúng ta sẽ in ra “I’ll take the accessory!” và thêm 9.99 vào biến amount. Nếukhông, mệnh đề else nói ra chúng ta sẽ trả lời lịch sự “No,
thanks.” và amount không thay đổi. Như chúng ta đã thảo luận trong “Giá trị & Loại” ở trên, các giá trị không chuẩn bị sẵn cho kiểu mong muốn mà thường bị ép theo kiểu đó, lệnh if muốn kiểu boolean , nhưng nếu bạn chèn nó gì đó không phải boolean , sự cưỡng ép sẽ xảy ra.
JavaScript xác định một danh sách các giá trị đặc trưng được coi là “falsy” bởi vì khi bị ép là boolean, nó sẽ trở thành false — nó bao gồm các giá trị như 0 và “” . Bất kỳ giá trị nào không trong danh sách “falsy”, sẽ tự động “truthy” — khi bị ép sang boolean nó sẽ trở thành true. Các giá trị truthy bao gồm kiểu như 99.99 và “free” .
Các Điều kiện hiện hữu trong các dạng khác ngoài if. Ví dụ, lệnh switch có thể được sử dụng như như là viết tắt của một loạt lệnh if..else  Vòng lặp sử một điều kiện để diễn đạt nếu vòng lặp diễn ra tiếp hay dừng lại.

— Còn tiếp —