Là sử dụng ELSE lập trình xấu? [đóng cửa]


18

Tôi thường gặp các lỗi đã được gây ra bằng cách sử dụng ELSEcấu trúc. Một ví dụ điển hình là một cái gì đó dọc theo dòng:

If (passwordCheck() == false){
    displayMessage();
}else{
    letThemIn();
}

Đối với tôi điều này hét lên vấn đề an ninh. Tôi biết rằng passwordCheck có khả năng là một boolean, nhưng tôi sẽ không đặt bảo mật ứng dụng của mình lên nó. Điều gì sẽ xảy ra nếu nó là một chuỗi, int vv?

Tôi thường cố gắng tránh sử dụng ELSEvà thay vào đó chọn hai câu lệnh IF hoàn toàn riêng biệt để kiểm tra những gì tôi mong đợi. Bất cứ điều gì khác sau đó hoặc bị bỏ qua HOẶC được xử lý cụ thể.

Chắc chắn đây là một cách tốt hơn để ngăn chặn các lỗi / vấn đề bảo mật xâm nhập vào ứng dụng của bạn.

Làm thế nào để các bạn làm điều đó?


3
Vấn đề bảo mật cho bạn là gì? "PasswordCheck" nghĩa là gì? Có kiểm tra mật khẩu không? Có cần phải kiểm tra mật khẩu? Người dùng đã qua? Người dùng đã không nhập đúng mật khẩu?
LennyProgrammer

20
I know that passwordCheck is likely to be a boolean...Ý anh là gì? Trong bất kỳ ngôn ngữ gõ mạnh. passwordChecksẽ là bất cứ điều gì bạn muốn nó được.
Bobby

31
Tôi nghĩ rằng các thực hành thụt đầu dòng xấu dẫn đến nhiều lỗi hơn là sử dụng các elsecâu lệnh ...
gablin

15
Điều này có vẻ kỳ lạ. Đầu tiên, bạn phàn nàn về kiểu trả về passwordCheck()có thể không phải là boolean (có thể là mối quan tâm hợp lý), và sau đó bạn đổ lỗi cho nó else? Tôi không thấy những gì vấn đề elsenguyên nhân.
David Thornley

8
Mmm, tôi nghĩ rằng hỏi nếu sử dụng khác là lập trình xấu thì lập trình xấu
Muad'Dib

Câu trả lời:


90

Các elsekhối nên luôn luôn bao gồm những gì bạn muốn hành vi mặc định được.

Không cần phải tránh chúng, chỉ cần cẩn thận để sử dụng chúng một cách thích hợp.

Trong ví dụ của bạn, trạng thái mặc định sẽ không cho phép truy cập. Một chút tái cấu trúc để lại cho bạn:

If (passwordCheck)
{
   letThemIn();
}
else
{
   displayMessage();
}

tức là nếu kiểm tra mật khẩu hoạt động, hãy để chúng vào, nếu không nó luôn hợp lệ để hiển thị một số thông báo lỗi.

Tất nhiên bạn có thể thêm các kiểm tra bổ sung cho logic của mình bằng cách sử dụng else ifthay vì các ifcâu lệnh hoàn toàn riêng biệt .


2
@ dave.b trong bối cảnh của ví dụ, tôi đoán đó sẽ là một vấn đề bảo mật, nhưng nếu đây là tất cả các vị trí trong cơ sở mã mà bạn đang xem, thì đó là dấu hiệu của bất cứ ai đã viết nó cần thêm một chút thực hành :)
RYFN

9
Ai đó có thể giải thích về khía cạnh bảo mật của điều này? if (! Something) {do a} other {do b} so với if (Something) {do b} other {do a} có tương đương logic không? Tôi đang cố gắng để hiểu sự khác biệt về bảo mật này là gì?
Chris

11
@Chris: Tôi nghĩ OP sử dụng ngôn ngữ đánh máy yếu. Do đó passwordCheckcó thể là bất cứ điều gì, fe null, mà sẽ làm cho passwordCheck == falseđến falsevà người sử dụng sẽ cho phép đăng nhập vì một lỗi nội bộ.
Bobby

1
@Chris, tôi hiểu rằng trạng thái mặc định là cho phép truy cập, điều này không nhất thiết phải được khuyến khích.
RYFN

3
Vâng, điều này rất phụ thuộc vào ngôn ngữ. Trong C #, trong đó ifyêu cầu a bool, các biến phải được gán chắc chắn, tất cả các đường dẫn phải trả về một giá trị, v.v., tôi không thể nghĩ ra bất kỳ lý do nào thứ tự ifelsesẽ quan trọng bên cạnh khả năng đọc. Đó là, if(a){b();}{c();}nên tương đương với if(!a){c();{b();}. Mặt khác, trong JavaScript, bạn phải biết rằng passwordCheckcó thể undefined, v.v.
Tim Goodman

57

Không, không có gì sai với ELSE. ELSEkhông phải là mới GOTO. Trong thực tế, sử dụng hai IFs thay vì ELSEcó thể dẫn đến một số vấn đề.

Ví dụ một:

if (this(is(a(very())==complex(check())))) {
   doSomething();
}

if (!this(is(a(very())==complex(check())))) {
   doTheOtherThing();
}

Bạn thấy bản sao-dán? Nó chỉ chờ ngày khi bạn thay đổi cái này và quên cái kia.

Ví dụ hai:

foreach(x in y) {
  if (first_time) {
    first_time = false;
    doSomething();
  }

  if (!first_time) {
    doTheOtherThing();
  }
}

Như bạn có thể thấy, cái thứ hai IFcũng sẽ được thực thi cho mục đầu tiên, vì điều kiện đã thay đổi. Trong các chương trình thế giới thực, những lỗi như vậy khó phát hiện hơn.


12
Tôi đồng ý với điều này. Sao chép-dán một ifcâu lệnh và đảo ngược biểu thức boolean của nó chỉ để tránh một else- bây giờ đó là lập trình xấu! Bạn không chỉ sao chép mã ( lập trình xấu ), bạn còn làm chậm hiệu suất (nếu kiểm tra thực sự phức tạp, giờ bạn đang thực hiện hai lần - ba-- ừ, bạn biết họ nói gì về tối ưu hóa sớm ngày nay ... lập trình không tốt lắm !).
gablin

Thành thật mà nói, nếu kiểm tra phải theo phương thức riêng để trả về đúng / sai
billy.bob

Các ví dụ hay, đừng quên hiệu suất của việc sử dụng 2 nếu kiểm tra so với một nếu được ghép nối với người khác. Tôi sẽ giả sử trong hầu hết các ngôn ngữ sử dụng if / other sẽ hoạt động tốt hơn so với sử dụng hai câu lệnh if với một sử dụng không theo điều kiện.
Chris

1
dave.b: chắc chắn, nhưng nó có thể bắt đầu đơn giản và phát triển chậm; kiểm tra phức tạp trong ví dụ của tôi là ở đây để làm cho vấn đề rõ ràng hơn.
user281377

3
Yup - và đừng quên rằng các điều kiện có thể có tác dụng phụ trong hầu hết các ngôn ngữ và nếu có chức năng trong các điều kiện bạn thực sự không thể biết bằng cách tìm kiếm.
David Thornley

18

Luôn có ELSE. Nếu bạn viết

if(foo)
  bar();

bạn thực sự viết

if(foo)
{
  bar();
}
else
{
   // do nothing
}

Bất cứ điều gì bạn đặt trong đường dẫn ELSE là trách nhiệm của bạn.


7
-1. Câu trả lời này quá vô lý. Tôi không nói nó không đúng sự thật. Nó chỉ bỏ lỡ điểm. Những gì trình biên dịch tạo ra từ mã của bạn không liên quan gì đến các hoạt động mã hóa và các lỗi bạn viết

3
Các câu hỏi là "Sử dụng ELSE có lập trình xấu không?". Câu trả lời của tôi là: bạn có thể giả vờ nó không có ở đó, nhưng không tránh được.
LennyProgrammer

5
ngôn ngữ nào ? trong Java, cái khác không nằm trong mã byte: P
IAd CHƯƠNG

@ acidzombie24 - thực tế rất tốt để xem xét "cái khác" là gì từ bất kỳ câu hỏi nào. Đôi khi chỉ là - làm mọi thứ khác trong fucntion, nhưng nó cho thấy bạn đã nghĩ về nó
Martin Beckett

14

Cá nhân tôi có xu hướng tránh elsecàng nhiều càng tốt, nhưng nó không phải là vấn đề bảo mật .

Khi đọc mã, các câu lệnh lồng nhau làm cho việc theo logic trở nên khó khăn hơn, bởi vì bạn cần nhớ tập hợp các điều kiện nào sẽ dẫn đến đó. Vì lý do này, tôi là một fan hâm mộ lớn của lối ra sớm:

if (checkPassword != OK) { displayMessage(); return; }

letThemIn();

Điều này cũng áp dụng cho forwhilecác vòng lặp mà tôi sẽ sử dụng continuebreakbất cứ khi nào nó tránh được mức độ thụt.

Chris Lattner nói rằng nó tốt hơn tôi làm trong Tiêu chuẩn mã hóa LLVM .


Tôi đồng ý. "Khác" tạo ra một "ngã ba" tinh thần và con người chúng ta là những sinh vật nối tiếp nhau.
dùng187291

Fyi, nó được gọi là điều kiện bảo vệ
CaffGeek

@Chad: ah cảm ơn, luôn luôn tốt đẹp để đặt tên cho mọi thứ :)
Matthieu M.

1
+1. Đây là câu trả lời duy nhất tôi có thể đứng có số điểm> 1. *writes an answer*

Tôi không cố gắng tránh những thứ khác như vậy, nhưng tôi nghĩ tôi đồng ý với những gì bạn viết. Vấn đề là thứ bạn đang kiểm tra phải là ngoại lệ và không phải là trường hợp thông thường ( stackoverflow.com/questions/114342/ .). Ở đây, xác thực thất bại là ngoại lệ và (chỉ) cần được kiểm tra.
hlovdal

5

Sau đó, chỉ cần thay thế chúng,

If (passwordCheck == true)
{
     letThemIn();
}
else
{
     displayMessage();
}

21
Thế còn If ((passwordCheck == true) == true)? :-)
Hippo

1
Vâng, đó là phong cách của tôi, để cải thiện khả năng đọc. Bạn có thể viết if (! Value) nhưng tôi thích if (value! = True)
Ahmet Kakıcı

7
Nó không cải thiện khả năng đọc. Nó chỉ thêm tiếng ồn. Tệ hơn nữa là các lập trình viên viết lồng nhau nếu các cấu trúc chỉ vì họ sợ các toán tử Boolean.
ak2

3
Nếu tên biến là mô tả, không có lý do tại sao: if (someBooleanValue == true) là cần thiết. Điều này sẽ tốt hơn: if (validPassword) {...
Mark Freedman

Vâng, tôi chỉ thay thế các khối mã trong câu hỏi. Nếu bạn đọc bình luận đầu tiên của tôi, tôi nói rằng tôi thích sử dụng if (value! = True) thay vì if (! Value). Tôi hy vọng bạn có thể thấy sự khác biệt giữa if (value) và if (! Value). Tôi có nghĩa là tôi không sử dụng toán tử bổ sung. Nếu không thì bạn đúng, đúng nghĩa là đúng.
Ahmet Kakıcı

3

Giống như Matthieu M., tôi thích lối ra sớm hơn các khối khác được lồng sâu ... Nó minh họa chương trình phòng thủ tốt (nếu điều kiện xấu, không có điểm nào để tiếp tục). Rất nhiều người sẽ không đồng ý với chúng tôi, thích một điểm thoát duy nhất; nó không phải là điểm của cuộc tranh luận (tôi nghĩ).

Bây giờ, tôi chắc chắn sử dụng elsekhi nó có ý nghĩa, đặc biệt cho các lựa chọn đơn giản, ngắn. Như đã nói, sao chép thử nghiệm là một sự lãng phí thời gian (của lập trình viên và CPU), một nguồn gây nhầm lẫn và sau đó là các lỗi (khi một thay đổi, không phải là khác).
Thỉnh thoảng, tôi thêm một nhận xét về elsephần này, nhắc nhở điều kiện là gì (đặc biệt nếu ifphần đó dài, ví dụ như trong mã kế thừa) hoặc cái gì thay thế.

Lưu ý rằng một số người ủng hộ lập trình chức năng cực đoan đề xuất loại bỏ hoàn toàn if, ủng hộ việc khớp mẫu ... Một chút quá cực đoan đối với sở thích của tôi. :-)


1
như một lưu ý phụ: nếu bạn có một cấu trúc if trong ngôn ngữ chức năng thuần túy của mình, thì bạn thực sự cần phải có một ngôn ngữ khác. Mỗi biểu hiện phải trả lại một cái gì đó!
tokland

2

Không có gì sai khi sử dụng ELSE. Tuy nhiên, nó có thể dẫn đến mã quá phức tạp, khó đọc và khó hiểu. Nó có thể chỉ ra một thiết kế xấu. Nó chắc chắn chỉ ra các trường hợp sử dụng bổ sung sẽ cần phải được kiểm tra.

Cố gắng loại bỏ ELSE nếu bạn có thể - nhưng đừng hoang tưởng về nó. Steve McConnell gọi mã đường thẳng này trong Code Complete. Tức là có một đường dẫn rõ ràng đơn giản thông qua mã của bạn.

Cách tiếp cận để thử cho vấn đề cụ thể của bạn:

  • sử dụng đa hình. Tại ranh giới hệ thống của bạn xác nhận thông tin xác thực bảo mật của người dùng. Nếu chúng hợp pháp thì trả về một đối tượng phiên - với quyền truy cập vào các phần có liên quan của hệ thống hoặc ném ngoại lệ. Tuy nhiên điều này có thể làm cho hệ thống của bạn phức tạp hơn. Vì vậy, bạn quyết định những gì dễ hiểu và duy trì.

Nói chung - những điều sau đây có thể giúp giảm ELSE trong mã của bạn:

  • yêu cầu tốt có thể làm giảm sự cần thiết cho các quyết định như vậy trong mã. Bạn có thể không cần phải thực hiện trường hợp sử dụng (khác).
  • thiết kế rõ ràng hơn. Sự gắn kết tối đa và giảm thiểu khớp nối. Điều này đảm bảo các thành phần không trùng lặp các quyết định được thực hiện trong các thành phần khác.
  • xử lý ngoại lệ để quản lý các trường hợp lỗi.
  • đa hình (xem ví dụ trên).
  • tuyên bố chuyển đổi - đây là ELSE được tôn vinh nhưng tốt hơn trong một số tình huống.

2
Tôi cũng sẽ bao gồm "Di chuyển kiểm tra boolean phức tạp vào một chức năng riêng biệt".
gablin

2

Giả sử của bạn về mã bị rò rỉ bảo mật có thể đúng hoặc không đúng tùy thuộc vào ngôn ngữ bạn đang sử dụng. Trong mã C, nó có thể là một vấn đề (đặc biệt vì trong C, boolean chỉ là một số không khác không hoặc bằng 0) - nhưng trong hầu hết các ngôn ngữ được gõ mạnh (ví dụ: kiểm tra kiểu thời gian chạy) nếu passwordCheckbiến được khai báo là boolean, không có cách nào để gán một cái gì đó khác cho nó. Trong thực tế, mọi thứ trong một ifvị ngữ phải phân giải thành boolean, cho dù bạn sử dụng toán tử boolean hay chỉ đơn giản là sử dụng giá trị. Nếu bạn quản lý để có một loại đối tượng khác bị ràng buộc với passwordCheckthời gian chạy sẽ ném một số loại ngoại lệ bất hợp pháp.

Các cấu trúc if / other đơn giản dễ đọc hơn nhiều so với các cấu trúc if / if - và ít gặp phải các sự cố vô ý nếu ai đó cố gắng lật công trình. Hãy lấy ví dụ tương tự trong một giây:

if(passwordCheck == false) {
    denyAccess();
}

if(passwordCheck) {
    letThemIn();
}

Ý nghĩa của các mệnh đề loại trừ lẫn nhau mà bạn muốn thực hiện ở trên bị mất. Đó là những gì nếu / khác xây dựng lồi. Hai nhánh hành quyết loại trừ lẫn nhau, trong đó một trong số chúng sẽ luôn chạy. Đây là một phần quan trọng của bảo mật - đảm bảo không có cách nào letThemInsau khi bạn gọi denyAccess.

Với mục đích rõ ràng về mã và cho mục đích đảm bảo các phần quan trọng được bảo vệ nhiều nhất, chúng phải nằm trong mệnh đề chính ( ifphần). Hành vi không tuân thủ mặc định phải ở trong mệnh đề thay thế ( elsephần). Ví dụ:

if(passwordCheck) {
    letThemIn();
} else {
    denyAccess();
}

LƯU Ý: khi làm việc với các ngôn ngữ khác nhau, tôi đã phát triển một loại mã hóa giúp tránh câu hỏi "nếu đó là một chuỗi thì sao?" Về cơ bản, nó là đặt hằng số đầu tiên trong biểu thức boolean. Ví dụ, thay vì kiểm tra passwordCheck == falsetôi đang kiểm tra false == passwordCheck. Điều này cũng tránh được vấn đề chuyển nhượng ngẫu nhiên có thể có trong C ++. Sử dụng phương pháp này, trình biên dịch sẽ khiếu nại nếu tôi gõ =thay vì ==. Trong các ngôn ngữ như Java và C #, trình biên dịch sẽ coi phép gán trong mệnh đề if là một lỗi, nhưng C ++ sẽ vui vẻ chấp nhận nó. Đó là lý do tại sao tôi cũng có xu hướng kiểm tra null với nulllần đầu tiên.

Nếu bạn thường xuyên thay đổi ngôn ngữ đặt hằng số đầu tiên là rất hữu ích. Tuy nhiên, trong nhóm của tôi, nó trái ngược với tiêu chuẩn mã hóa và trình biên dịch vẫn nắm bắt được những vấn đề đó. Nó có thể là một h khó khăn để phá vỡ.


1

Nói rằng sử dụng elsekhi lập trình là xấu cũng giống như nói rằng sử dụng otherwisekhi nói là xấu.

Chắc chắn, cả hai đều có thể được sử dụng theo những cách xấu, nhưng điều đó không có nghĩa là chúng nên được tránh chỉ vì bạn đã phạm sai lầm xảy ra trong đó có cả chúng. Tôi sẽ không ngạc nhiên nếu nhiều lỗi phụ thuộc vào một defaulttrường hợp mất tích trong một switchtuyên bố.


1

Hãy nghĩ về Elsedanh sách trắng dòng chảy ứng dụng của bạn. Bạn kiểm tra các điều kiện NÊN cho phép dòng ứng dụng tiếp tục và nếu những điều này không được đáp ứng, thì bạn Elsesẽ được thực thi để giải quyết vấn đề, ngừng thực thi ứng dụng hoặc một cái gì đó tương tự.

Else Bản thân nó không tệ, nhưng nếu bạn sử dụng nó kém, bạn có thể thấy các hiệu ứng không mong muốn.

Ngoài ra, liên quan đến tuyên bố của bạn về

"Tôi biết rằng passwordCheck có khả năng là một boolean, nhưng tôi sẽ không đặt bảo mật ứng dụng của mình lên nó."

Đối với các phương thức mà bạn phát triển, LUÔN LUÔN trả về một loại dữ liệu. Mặc dù PHP Core chứa đầy mã trả về hai hoặc nhiều kiểu dữ liệu, đây là một thực tiễn tồi vì nó thực hiện phỏng đoán các lệnh gọi hàm. Nếu bạn phải trả lại nhiều hơn một kiểu dữ liệu, hãy cân nhắc việc ném một ngoại lệ (tôi thấy đây thường là lý do tôi muốn trả về một loại dữ liệu khác - một cái gì đó đã trở nên khủng khiếp, sai lầm khủng khiếp) hoặc xem xét cấu trúc lại mã của bạn để bạn có thể chỉ trả về một kiểu dữ liệu.


Tôi không biết rằng có những ngôn ngữ trả về nhiều kiểu dữ liệu! Bạn đang đề cập đến các chức năng đa hình? Tôi tin rằng bất cứ khi nào tôi quá tải một hàm, nó luôn trả về cùng một kiểu dữ liệu, mặc dù nó có thể có các đối số khác nhau.
Michael K

1
Trong các ngôn ngữ được gõ lỏng lẻo và đặc biệt là trong PHP, các hàm có thể trả về nhiều loại dữ liệu. ví dụ: stristr- "Trả về chuỗi con phù hợp. Nếu không tìm thấy kim, trả về SAI"
Craige

@Michael, Một hàm PHP có thể trả về bất cứ thứ gì bạn muốn. Không có giới hạn về kiểu dữ liệu. Hàm phức tạp nhất của tôi trả về true / false / null, nhưng không có gì (ngoại trừ ý nghĩa thông thường) ngăn bạn viết một hàm trả về true / số nguyên / null / chuỗi / float / mảng.
TRiG

Hấp dẫn. Tôi chưa bao giờ làm việc với PHP. Cảm ơn vì lời giải thích mặc dù - có thể giúp tôi trong tương lai! Kiểu như Javascript thì sao?
Michael K

@Michael - Khá giống với Javascript.
Craige

1

Đầu tiên. CƯỜI LỚN! Không có LÝ DO để tránh khác, tất cả. Nó KHÔNG thực hành xấu trong bất kỳ cách, hình dạng hoặc hình thức.

Nếu bất cứ điều gì mã phải được

if(!IsLoggedIn) { ShowBadLoginOrNoAccessPage(); return }

Không có hai ifs ở đó và nó không có khác. Đây là những gì tôi làm trong tất cả các ứng dụng của mình ngoại trừ một ứng dụng mà tôi ném ngoại lệ. Ngoại lệ được bắt gặp trong chức năng của tôi để kiểm tra url cho trang thích hợp để hiển thị (hoặc cách khác tôi có thể đặt chức năng bắt / kiểm tra trong hàm lỗi asp.net). Nó in ra một trang chung nói rằng không cho phép hoặc bất kỳ thông báo nào tôi sử dụng trong ngoại lệ (tôi luôn kiểm tra loại ngoại lệ và đặt mã trạng thái http).

-Chỉnh sửa- như thể hiện trong ammoQ ví dụ hai ifs là vô lý. Thực sự khác chỉ là tốt hoặc tốt hơn sau đó nếu. Nếu có bất cứ điều gì cần tránh (mặc dù cá nhân tôi thì không. Nhưng tôi sử dụng return và break rất nhiều) vì người ta nói nhiều đường dẫn mã hơn làm tăng khả năng xảy ra lỗi. Xem độ phức tạp chu kỳ

-Chỉnh sửa 2- Nếu bạn lo lắng về việc sử dụng if / other. Tôi cũng sẽ lưu ý rằng sở thích của tôi là đặt khối mã ngắn nhất lên trên cùng, chẳng hạn như

if(cond == false) {
    a()
    b()
    c()
    onetwothree()
}
else
{
    a()
    b()
    c()
    more()
    onetwothree()
    code()
    longer()
}

Thay vào đó

if(cond) 
{
    a()
    b()
    c()
    more()
    onetwothree()
    code()
    longer()
}
else
{
    a()
    b()
    c()
    onetwothree()
}

0

Tôi muốn đặt mặc định trước các điều kiện khi tôi có thể. Tôi cảm thấy như nó dễ đọc hơn một chút và rõ ràng hơn một chút, nhưng đây chỉ là một sở thích. Tôi có xu hướng thử và tránh các điều kiện tiêu cực trong mã của mình. Tôi không phải là một fan hâm mộ lớn của việc kiểm tra! Foo hoặc false == foo và tôi cảm thấy như người khác là loại tương đương có điều kiện của một phủ định.

foo = bar;

if ('fubar' == baz) {
    foo = baz;
}

thay vì ...

if ('fubar' == baz) {
    foo = baz;
} else {
    foo = bar;
}

Khối mã trước có vẻ dễ đọc hơn một chút. Nó có vẻ tự nhiên hơn đối với tôi có một loại hoang tưởng hoài nghi về mã của tôi. Đặt mặc định bất kể điều kiện nào làm tôi cảm thấy thoải mái: P


0

Tôi sẽ lập luận rằng nên sử dụng logic phân nhánh của bất kỳ loại nào càng nhiều càng tốt. Mặc dù không có gì sai với ELSE hoặc IF, có rất nhiều cách để viết mã để giảm thiểu nhu cầu sử dụng bất kỳ logic phân nhánh nào. Tôi không nói rằng logic phân nhánh có thể được loại bỏ hoàn toàn - nó sẽ cần thiết ở một số nơi - nhưng có thể cấu trúc lại mã để loại bỏ một đoạn tốt của nó. Trong hầu hết các trường hợp, điều này sẽ cải thiện tính dễ hiểu và chính xác của mã của bạn.

Một ví dụ, các nhà khai thác ternary cũng thường là ứng cử viên tốt:

If VIP Then 
  Discount = .25
Else
  Discount = 0
End If
Total = (1 - Discount) * Total

Sử dụng một cách tiếp cận ternary:

Discount = VIP ? .25 : 0
Total = (1 - Discount) * Total

Các nhà khai thác ternary chuyển nhánh sang bên phải một cách tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.