Article: Thứ tự biểu thức logic 1585

as, actionscript, best practice, logic expression
phananhvu.myopenid.com 125
Updated 7 months ago

Sẽ là không tốt khi ta coi thường ai đó hay một cái gì đó. Đặc biệt, sẽ rất tệ khi developer coi thường thứ tự các biểu thức logic. Nếu anh nghĩ rằng ((a>b) && (a<c)) với ((a<c) && (a>b)) chả khác gì nhau thì ...

WATCH OUT!

Pòm. Ôi cái chân của ... anh.

Xem đoạn mã sau:

var a:Array = new Array(SIZE);
var i:int = someValue;
while ((a[i] == someThing) &&
(i<SIZE)) {
// Do something.
}

Nhìn thì biểu thức logic của while có vẻ như không có vấn đề gì nhưng nếu vì một lí do nào đó, someValue có giá trị lơn hơn size SIZE thì sao nhỉ. Trình dịch sẽ không xác định được phần tử a[someValue] đó và crashhh. Đặc biệt, đây lại là một lỗi runtime nên rất khó phát hiện.

Khắc phục? Chỉ cần đảo thứ tự trong biểu thức logic của while như sau:

var a:Array = new Array(SIZE);
var i:int = someValue;
while (
(i<SIZE) && (a[i] == someThing)) {
// Do something.
}

OK, that's it.

 

Comments

cmpitg.myopenid.com 1
over 2 years ago

Mình không lầm thì mình đã giải thích rất cụ thể rồi đó chứ, và còn hỏi bạn mấy câu hỏi nữa nhưng bạn không trả lời {#emotions_dlg.tongue_out}. Còn bây giờ thì mình hiểu sâu hơn nữa là vừa rồi "thực sự không hiểu ý nhau" {#emotions_dlg.embarassed}

BTW, quan điểm của bạn với của mình khá khác nhau, tốt nhất là nên dừng cuộc tranh luận ở đây.

{#emotions_dlg.smile}

otaku-2r.myopenid.com 2
over 2 years ago

Chả hiểu mấy người này cãi nhau vì cái gì.

Nếu có lỗi xảy ra (ko nói đến syntax error) thì là do thằng đì zai cái thuật toán (mà nhiều khi nó chính là thằng coder) gây ra, nguyên nhân chủ yếu là do sự mập mờ trong việc kiểm tra điều kiện biên.

Về lý thuyết, các mã lệnh được thực hiện tuần tự, vì vậy thuật toán được thiết kế ra cũng phải theo từng bước tuần tự và không được có lệnh gộp (ngoại trừ trong lập trình xử lý song song,nhưng cái này phức tạp và chả liên quan lắm ở đây nên ko bàn)

ngocdaothanh.myopenid.com 149
over 2 years ago

Trong Ruby, thay vì viết 3 dòng:

if b
f()
end

Có thể viết gọn thành một dòng:

f() if b

Các ngôn ngữ khác có thể bắt chước kiểu này bằng mẹo sau, ví dụ trong C:

b && f();

 

otaku-2r.myopenid.com 2
over 2 years ago

Dùng phương pháp shorten code này thì code gọn đi, đặc biệt là trong các website thì đây là một trong những cách để nén code để load cho nhanh.

Mỗi tội lúc peer review thì mệt đặc biệt là với những ngôn ngữ như C, code gọn thì lại phải tăng cường comment lên, performance nói chung là 'nguyễn y vân' hoặc thậm chí tệ hơn {#emotions_dlg.undecided}

ngocdaothanh.myopenid.com 149
over 2 years ago

đặc biệt là trong các website thì đây là một trong những cách để nén code để load cho nhanh.

Nén mãi mới được mấy KB, nhưng bị bạn Vũ chơi mấy tấm ảnh cỡ trăm KB thì cũng toi công{#emotions_dlg.laughing}

phananhvu.myopenid.com 125
over 2 years ago

Nén mãi mới được mấy KB, nhưng bị bạn Vũ chơi mấy tấm ảnh cỡ trăm KB thì cũng toi công


Ơ hay, ảnh được load từ server khác cơ mà. Nhưng dù sao thì bạn Vũ cũng chỉ chơi ảnh to nhất là 2 hay 3 chục K  thôi, làm gì đến trăm K hi hí

alide.myopenid.com 32
7 months ago

Vấn đề này gọi là Short-circuit evaluation.

You must login to be able to comment

Uploaded files

No file uploaded yet

You must login to be able to upload

Nhà tài trợ:

Mọi người đều tự do viết bài, sửa bài của người khác, và bình luận ở trang web này. Bạn muốn chủ động tạo bài mới để chia sẻ kinh nghiệm với mọi người? Xin click link ở dưới.

Create new content