Tôi sẽ không được ưa chuộng và nói Có, đó là một thực tế tồi. NẾU chức năng của mã của bạn đang dựa vào nó để thực hiện logic có điều kiện.
I E
if(quickLogicA && slowLogicB) {doSomething();}
là tốt, nhưng
if(logicA && doSomething()) {andAlsoDoSomethingElse();}
là xấu, và chắc chắn không ai sẽ đồng ý với?!
if(doSomething() || somethingElseIfItFailed() && anotherThingIfEitherWorked() & andAlwaysThisThing())
{/* do nothing */}
Lý do:
Lỗi mã của bạn nếu cả hai bên được đánh giá thay vì chỉ đơn giản là không thực hiện logic. Người ta đã tranh luận rằng đây không phải là vấn đề, toán tử 'và' được định nghĩa trong c # nên ý nghĩa rất rõ ràng. Tuy nhiên, tôi cho rằng điều này không đúng.
Lý do 1. Lịch sử
Về cơ bản, bạn đang dựa vào (mục đích ban đầu là) tối ưu hóa trình biên dịch để cung cấp chức năng trong mã của bạn.
Mặc dù trong c #, đặc tả ngôn ngữ đảm bảo toán tử boolean 'và' không bị đoản mạch. Điều này không đúng với tất cả các ngôn ngữ và trình biên dịch.
wikipeda liệt kê các ngôn ngữ khác nhau và họ sử dụng ngắn mạch http://en.wikipedia.org/wiki/Short-circuit_ev Assessment vì bạn có thể có nhiều cách tiếp cận. Và một vài vấn đề nữa tôi không đi vào đây.
Cụ thể, FORTRAN, Pascal và Delphi có các cờ biên dịch chuyển đổi hành vi này.
Do đó: Bạn có thể thấy mã của mình hoạt động khi được biên dịch để phát hành, nhưng không phải để gỡ lỗi hoặc với trình biên dịch thay thế, v.v.
Lý do 2. Sự khác biệt về ngôn ngữ
Như bạn có thể thấy từ wikipedia, không phải tất cả các ngôn ngữ đều có cùng cách tiếp cận với đoản mạch, ngay cả khi chúng chỉ định cách các toán tử boolean nên xử lý nó.
Cụ thể, toán tử 'và' của VB.Net không bị đoản mạch và TSQL có một số đặc thù.
Cho rằng một 'giải pháp' hiện đại có khả năng bao gồm một số ngôn ngữ, chẳng hạn như javascript, regex, xpath, v.v. bạn nên tính đến điều này khi làm rõ chức năng mã của mình.
Lý do 3. Sự khác biệt trong một ngôn ngữ
Ví dụ: nội tuyến của VB nếu hành xử khác với if. Một lần nữa trong các ứng dụng hiện đại, mã của bạn có thể di chuyển giữa, ví dụ mã phía sau và một biểu mẫu web nội tuyến, bạn phải nhận thức được sự khác biệt về ý nghĩa.
Lý do 4. Ví dụ cụ thể của bạn về việc kiểm tra null tham số của hàm
Đây là một ví dụ rất tốt. Trong đó đó là điều ai cũng làm, nhưng thực tế là thực tế tồi tệ khi bạn nghĩ về nó.
Rất phổ biến để xem loại kiểm tra này vì nó làm giảm đáng kể các dòng mã của bạn. Tôi nghi ngờ bất cứ ai sẽ đưa nó lên trong một đánh giá mã. (và rõ ràng từ các bình luận và đánh giá bạn có thể thấy nó phổ biến!)
Tuy nhiên, nó thất bại thực hành tốt nhất vì nhiều hơn một lý do!
Của nó rất rõ ràng từ nhiều nguồn khác nhau, mà thực hành tốt nhất là để kiểm tra các thông số của bạn cho hiệu lực trước khi bạn sử dụng chúng và để ném một ngoại lệ nếu họ không hợp lệ. Đoạn mã của bạn không hiển thị mã xung quanh, nhưng có lẽ bạn nên làm gì đó như:
if (smartphone == null)
{
//throw an exception
}
// perform functionality
Bạn đang gọi một hàm từ trong câu lệnh có điều kiện. Mặc dù tên hàm của bạn ngụ ý rằng nó chỉ đơn giản là tính toán một giá trị, nhưng nó có thể ẩn các tác dụng phụ. ví dụ
Smartphone.GetSignal() { this.signal++; return this.signal; }
else if (smartphone.GetSignal() < 1)
{
// Do stuff
}
else if (smartphone.GetSignal() < 2)
{
// Do stuff
}
thực hành tốt nhất sẽ đề nghị:
var s = smartphone.GetSignal();
if(s < 50)
{
//do something
}
Nếu bạn áp dụng các thực tiễn tốt nhất này cho mã của mình, bạn có thể thấy rằng cơ hội để đạt được mã ngắn hơn thông qua việc sử dụng các điều kiện ẩn sẽ biến mất. Thực hành tốt nhất là làm một cái gì đó , để xử lý trường hợp điện thoại thông minh là null.
Tôi nghĩ rằng bạn sẽ thấy rằng đây cũng là trường hợp cho các tập quán phổ biến khác. Bạn phải nhớ chúng tôi cũng có:
điều kiện nội tuyến
var s = smartphone!=null ? smartphone.GetSignal() : 0;
và hợp nhất null
var s = smartphoneConnectionStatus ?? "No Connection";
cung cấp chức năng độ dài mã ngắn tương tự với sự rõ ràng hơn
nhiều liên kết để hỗ trợ tất cả các điểm của tôi:
https://stackoverflow.com/questions/1158614/what-is-the-best-practice-in-case-one-argument-is-null
Xác thực tham số của nhà xây dựng trong C # - Thực tiễn tốt nhất
Có nên kiểm tra null nếu anh ta không mong đợi null?
https://msdn.microsoft.com/en-us/l Library / reyhszts% 28v = vs.110% 29.aspx
https://stackoverflow.com/questions/1445867/why-would-a-lingu-not-use-short-circuit-ev Assessment
http://orcharddojo.net/orchard-resource/L Library / DevelopmentD Guide / BestPractices / Sharp
ví dụ về các cờ biên dịch ảnh hưởng đến ngắn mạch:
Fortran: "sce | nosce Theo mặc định, trình biên dịch thực hiện đánh giá ngắn mạch trong các biểu thức logic được chọn bằng quy tắc XL Fortran. Chỉ định sce cho phép trình biên dịch sử dụng quy tắc Fortran không XL. Trình biên dịch sẽ thực hiện đánh giá ngắn mạch nếu quy tắc hiện tại cho phép Mặc định là không rõ ràng. "
Pascal: "B - Một lệnh cờ điều khiển đánh giá ngắn mạch. Xem Thứ tự đánh giá toán hạng của toán tử dyadic để biết thêm thông tin về đánh giá ngắn mạch. Xem thêm tùy chọn trình biên dịch -sc cho trình biên dịch dòng lệnh để biết thêm thông tin ( được ghi lại trong Hướng dẫn sử dụng). "
Delphi: "Delphi hỗ trợ đánh giá ngắn mạch theo mặc định. Nó có thể được tắt bằng cách sử dụng chỉ thị trình biên dịch {$ BOOLEVAL OFF}."