2010-05-14 38 views
5

Tôi đã nhìn thấy rất nhiều loại mã này thời gian gần đây:Chuyển nhượng trong điều kiện

if ($foo = $bar->getFoo()) 
{ 
    baz($foo); 
} 

Đây có phải là coi thực hành tốt hay xấu?

Ví dụ, Netbeans IDE cho một thông báo nếu bạn sử dụng loại mã này:

có thể tình cờ chuyển nhượng, bài tập trong điều kiện nên tránh

Bạn nghĩ gì?

+0

Ý của bạn là ($ foo == $ bar-> getFoo())? –

+8

Không, đó là điểm :) – DuoSRX

+0

Điều này rõ ràng đã bay qua đầu của tôi :) Vì vậy, điều kiện là để kiểm tra rằng $ bar-> getFoo() không gây ra lỗi? Có đúng không? –

Trả lời

4

Đó là một công cụ hữu ích mà tôi phải thừa nhận để sử dụng nhân dịp để tránh thêm một dòng cho một nhiệm vụ. Một mặt, nó có thể thực hành xấu bởi một số vì:

  • Nó không phải là một thành ngữ có sẵn trong các ngôn ngữ phổ biến khác
  • Đó là ít có thể đọc

Mặt khác:

  • Chuyển đổi boolean ngầm định không xảy ra ở các ngôn ngữ khác, nhưng chúng được tính rộng rãi vào nơi chúng tồn tại. Ngược lại, các toán tử gán điều kiện tồn tại trong Ruby và Javascript (làm ví dụ), nhưng không có trong PHP. Chúng tôi có nên giới hạn việc sử dụng các cấu trúc ngôn ngữ của chúng tôi chỉ cho những ngôn ngữ được tìm thấy trong tất cả các ngôn ngữ tương tự không? Chắc là không.
  • Ít người đọc hơn?

Tôi nên lưu ý rằng tôi cố gắng tránh điều này vì tôi thấy nó ít có thể đọc được hầu hết thời gian, nhưng nó hoàn toàn là sở thích cá nhân đối với tôi. Nơi tôi thấy nó hữu ích, tôi sử dụng nó.

4

Đây là cách dễ dàng để tìm ra lỗi, nhưng thực tế phổ biến trong PHP. Đặc biệt là trong những thứ như traversals thư mục mà bạn đang làm những việc như while (($dir = readdir($handle)) !== FALSE)

Nếu bạn có thể tránh nó. Tránh nó đi.

+0

'! == FALSE' là thừa, nhưng làm cho câu lệnh dễ hiểu hơn. Nhưng tại sao không sử dụng '== TRUE'? Nó thậm chí còn đơn giản hơn! – T30

+1

readdir trả về SAI nếu thư mục trống. Nếu không, nó sẽ trả về mục tiếp theo trong thư mục. Bạn phải kiểm tra không sai để tiếp tục đọc. Nó nên làm một kiểm tra loại nghiêm ngặt với một bằng ba. – jlindenbaum

2

Trong khi đây là cú pháp hợp lệ và kết quả sẽ như mong đợi, đó là một thói quen xấu. Khả năng đọc là thiếu, có một tiềm năng để phát triển một thói quen xấu của việc đưa = khi bạn có nghĩa là ==, và đôi mắt của bạn sẽ tiếp tục trở lại dòng này khi bạn đang cố gắng tìm lỗi thực sự trong một ứng dụng. Tôi sẽ không sử dụng phong cách viết này. Trong trường hợp này, chỉ cần lấy giá trị trả về và sau đó xác minh giá trị trả về ... hoặc tốt hơn, sử dụng xử lý ngoại lệ để tránh bị sa lầy với nhiều câu lệnh if.

+1

+1 đây là phần còn lại từ ngày C, nơi thực hành phổ biến (xấu) này. Rất nhiều người vẫn làm điều này bởi vì họ nghĩ rằng nó làm cho họ [nhìn thông minh] (http://stackoverflow.com/questions/2101875/what-are-some-programming-questions-or-mistakes-you-get-wrong- chỉ-như-bạn-get-b/2151844 # 2151844). –

4

Tôi sử dụng cú pháp này mọi lúc ... Tôi thấy nó có thể đọc được 100%, vì tôi rất quen với việc xem loại dòng này. Có thêm một dòng mã cho nhiệm vụ giống như một sự lãng phí không gian cho tôi.

+1

Mã có nghĩa là để được đọc. Nếu một dòng mã bổ sung tăng khả năng đọc -> thêm một dòng. Tôi không muốn kế thừa mã được rút gọn của bạn. –

Các vấn đề liên quan