2017-12-25 60 views
5

Khi đánh giá tiêu cực trong mệnh đề if sẽ gây ra một cuộc gọi return bên trong một hàm/phương pháp, được đề xuất trong Python, để lồng các mệnh đề hoặc sử dụng đánh giá nghịch đảo và gọi hàm trở về? ví dụ .:Làm tổ nếu các mệnh đề so với kết quả phân tầng theo yêu cầu

if required_condition_1: 
    if required_condition_2: 
     if required_condition 3: 
      pass 
     return 'error for condition 3' 
    return 'error for condition 2' 
return 'error for condition 1' 

Hoặc:

if not required_condition_1: 
    # preparation... 
    return 'error for condition 1' 

if not required_condition_2: 
    # preparation... 
    return 'error for condition 2' 

if not required_condition_3: 
    # preparation... 
    return 'error for condition 3' 

# if runtime reaches this point it means that it has passed all conditions 

Hãy tưởng tượng bạn phải đăng ký một người sử dụng, và bạn cần điều kiện khác nhau để được thỏa mãn. Người dùng sẽ chỉ được đăng ký nếu tất cả đều hài lòng, nhưng thông báo lỗi phụ thuộc vào điều kiện nào không thành công.

Tôi đoán là trong các trường hợp khác, như người dùng đề cập trong phần câu trả lời, các hành động khác có thể áp dụng nếu một điều kiện nhất định không thành công. Sau đó, tôi nghĩ rằng tôi nên làm tổ ifs. Tuy nhiên, tôi sẽ chỉ trả về một thông báo lỗi, vì vậy tôi nghĩ tùy chọn thứ hai là thích hợp hơn.

Tôi cũng đã nghĩ đến việc khẳng định:

try: 
    assert(required_condition_1) 
    try: 
     assert(required_condition_2) 
     # do tasks 
    except AssertionError: 
     # error for condition 2 
except AssertionError: 
    # error for condition 1 

Mặc dù tôi nghĩ rằng cách cuối cùng này là không đẹp recommendable như trong điều trị ngoại lệ. Cũng như một người sử dụng SO mentions:

Nếu mã là đúng, chặn rối loạn đơn kiện, lỗi phần cứng và như vậy, không khẳng định sẽ không bao giờ thất bại. Đó là lý do tại sao hành vi của chương trình cho người dùng cuối không được bị ảnh hưởng. Đặc biệt, một khẳng định không thể thất bại ngay cả trong điều kiện đặc biệt có lập trình. Nó chỉ không bao giờ xảy ra. Nếu điều đó xảy ra, lập trình viên nên được zapped cho nó.

Tôi biết điều này có vẻ chủ yếu dựa vào ý kiến ​​, nhưng đối với tôi nó là không vì tất cả các ngôn ngữ có hướng dẫn phong cách tạo ra một môi trường bền vững hơn, khả năng mở rộng và có thể đọc được tùy thuộc vào đặc điểm và chức năng của nó. Tôi muốn biết nếu có một cách được đề nghị để xử lý vấn đề này bên trong phương pháp và quan trọng nhất, tại sao.

+4

Dựa trên thực tế là mã nên có một số "địa phương", tôi đoán đoạn mã thứ hai dễ đọc hơn. Nhưng điều này giữ trong * bất kỳ * ngôn ngữ. –

Trả lời

3

Mặc dù điều này có thể được xem là dựa trên ý kiến, tôi nghĩ rằng khách quan cách thứ hai có vẻ dễ đọc hơn nhiều. Trong ví dụ đầu tiên của bạn, ai đó đọc mã của bạn sẽ phải giải mã rằng mỗi câu lệnh không liên quan một cách hợp lý với câu lệnh được lồng vào, điều mà bạn không muốn xảy ra. Nói chung, các khối lồng nhau ngụ ý một số loại logic được kế thừa.

Ví dụ thứ hai được viết gọn gàng hơn nhiều và không đòi hỏi nhiều suy nghĩ để nhận ra luồng logic. Thay vì giẫm lên sâu hơn và sâu sắc hơn nhiều điều kiện bạn muốn áp dụng, dòng chảy logic có vẻ ngụ ý rằng mỗi điều kiện phải được thỏa mãn bất kể.

Kiểu đầu tiên có các trường hợp sử dụng của nó, không chỉ cho tác vụ đã có trong tay: kiểm tra điều kiện.


Đối với câu hỏi thứ hai của bạn, việc sử dụng xác nhận trong trường hợp sử dụng này sẽ không được coi là phù hợp.Theo quy tắc chung, chỉ sử dụng assert khi một cái gì đó mà không bao giờ bị sai, nhưng rất quan trọng đối với việc thực thi chương trình, sẽ bị lỗi. Một trong những cách sử dụng rõ ràng nhất là viết các trường hợp kiểm thử, một hàm sẽ cho một đầu ra nào đó, và nó rất tệ nếu nó không cung cấp cho bạn đầu ra đó.

Trường hợp ngoại lệ dành cho những thứ bạn có thể gặp phải sai số ví dụ: chia cho số không lỗi, lỗi thuộc tính, và như vậy khi giao dịch với đầu vào của người dùng.

+0

Sự cố xảy ra nếu bạn không còn ở trong một hàm nữa. – qaztype

2

Như Ziyad Edher trả lời, thứ hai là dễ đọc hơn:

if not required_condition_1: 
    # preparation... 
    return 'error for condition 1' 

if not required_condition_2: 
    # preparation... 
    return 'error for condition 2' 

if not required_condition_3: 
    # preparation... 
    return 'error for condition 3' 

Và, nếu bạn muốn chỉ có 1 return thì:

if not required_condition_1: 
    # preparation... 
    _error = 'error for condition 1' 

elif not required_condition_2: 
    # preparation... 
    _error = 'error for condition 2' 

elif not required_condition_3: 
    # preparation... 
    _error = 'error for condition 3' 

else: 
    _error = None 

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