2012-06-20 24 views
7

Rất đơn giản câu hỏi:Preferred Python (hoặc bất kỳ ngôn ngữ nào, thực sự) style: Nên sử dụng khác khi nào nếu trả về?

Cụ thể trong Python (kể từ Python thực sự có "khuyến khích mạnh mẽ" hướng dẫn phong cách quy định tại PEP 8, nhưng thực sự này áp dụng đối với bất kỳ ngôn ngữ), nên một chức năng với một khoản if luôn lợi nhuận có thay thế mã trong mệnh đề else hay không? Nói cách khác, func_style_one()func_style_two() trong đoạn mã sau là (rõ ràng) chính xác tương đương:

def func_style_one(): 
    if some_conditional_function(): 
     do_something() 
     return something() 
    else: 
     do_something_else() 
     return something_else() 

def func_style_two(): 
    if some_conditional_function(): 
     do_something() 
     return something() 
    do_something_else() 
    return something_else() 

Rõ ràng, phong cách tốt nhất và có thể đọc được hầu hết phụ thuộc vào tình hình, và ý kiến ​​ sẽ khác nhau rất nhiều trên đó là tốt hơn, nhưng tôi yêu cầu được cộng đồng Python cốt lõi ưu tiên đặc biệt. (ví dụ: Thư nào được sử dụng thường xuyên hơn trong thư viện chuẩn, tất cả những thứ khác bằng nhau?)

+2

Tôi có xu hướng chọn câu hỏi thứ hai –

+1

Tôi nghĩ rằng thứ hai là an toàn hơn. Ít có khả năng thay đổi một người khác thành một elif trong một trình tái cấu trúc và vô tình tạo một đường dẫn mã không có giá trị trả về. –

+0

Nếu tất cả số tiền tương đương với số tiền còn lại sẽ trả về, thì đầu tiên. Nếu người khác tính toán bổ sung - thứ hai. –

Trả lời

3

Theo quy tắc chung, bạn nên tránh thêm sự phức tạp không cần thiết vào mã của mình. Nó cũng thường là một ý tưởng tốt để cố gắng chia mã của bạn thành các phần phụ có ý nghĩa ngữ nghĩa.

Với những chẩn đoán này, không có câu trả lời dứt khoát. Nó thực sự nắm bắt những gì bạn đang cố gắng đạt được.

Tôi sẽ minh họa điều này với các ví dụ.

Nếu chúng ta có một chức năng để kiểm tra các điều kiện lỗi khác nhau trước khi tiếp tục, nó có thể làm cho tinh thần để viết nó mà không else:

def do_stuff(): 
    if error1(): 
     return cleanup_and_fail() 
    return ok() 

Điều này là tốt như bạn thường kết thúc kiểm tra một số lỗi trong thời trang tương tự như trong một chuỗi:

def do_stuff(): 
    if error1(): 
     return cleanup_and_fail() 
    if error2(): 
     return do_different_cleanup_and_fail() 
    return ok() 

Tuy nhiên, nếu chức năng của bạn thay vì các chi nhánh để hai chi nhánh bằng nhau, nó ngữ nghĩa có thể có ý nghĩa hơn đối với bạn khác:

def do_stuff(): 
    if option1(): 
     return do_option1() 
    else: 
     return do_option2() 

Điều này là do bạn thường kết thúc thêm một số tùy chọn khác với elif:

def do_stuff(): 
    if option1(): 
     return do_option1() 
    elif: 
     return do_option2() 
    else: 
     return do_option3() 

Để tóm tắt: suy nghĩ về ngữ nghĩa của mã của bạn và chọn cú pháp cho phù hợp.

+1

Cảm ơn câu trả lời. Đây thường là những gì tôi làm, tôi chỉ tự hỏi liệu có bất kỳ sự đồng thuận nào không, ví dụ: WWGD (Guido sẽ làm gì?). Nhưng nó là tốt để biết rằng các lập trình viên khác nghĩ tương tự. –

+0

Ít nhất là tôi nghĩ vậy. Ngoài ra tôi thực sự đánh giá cao rằng bạn đang nắm lấy PEP 8 - mọi người đọc hướng dẫn phong cách cách quá ít. Tuy nhiên, các hướng dẫn kiểu luôn là các quy tắc mềm - nếu vấn đề trong tay yêu cầu bạn phải đi chệch khỏi chúng, thì bạn nên làm như vậy. Ví dụ, nếu bạn đang mở rộng một ứng dụng Python với các quy ước đặt tên giống như Java, có thể tốt hơn nếu sử dụng quy ước đó thay vì những gì PEP 8 đề xuất nghiêm ngặt. – jsalonen

+1

Đối với lợi nhuận có điều kiện nhỏ như bạn cung cấp ở đây, tôi nghĩ rằng một cơ chế lập bản đồ ('tùy chọn = ['opt1', 'opt'2] tùy chọn trả về [opt]') là cả hai rõ ràng hơn và duy trì hơn. Với các điều kiện phức tạp hơn, đặc biệt là với các điều kiện lồng nhau trong điều kiện, nó có thể nhanh chóng trở nên khó khăn để đảm bảo mọi đường dẫn mã có giá trị trả về, do đó tại sao dòng cuối cùng của phương thức là một trở lại catchall mặc định giữ mọi thứ dễ quản lý hơn chạy. Tất nhiên, nếu một mặc định làm cho không có ý nghĩa theo ngữ cảnh, bạn không nên có một, nhưng sau đó 'else' làm cho không có ý nghĩa hoặc. –

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