2013-03-20 73 views
5

Tôi đang làm việc trên một dự án. Hiện tại tôi có một câu lệnh điều kiện khá lớn, gán một giá trị cho một biến dựa trên một số tham số đầu vào. Vì vậy, tôi có một cái gì đó như thế này.Tái cấu trúc phép gán biến điều kiện

if some condition 
    x = some value 
elsif another condition 
    x = a different value 
    ... 

Cách tốt nhất để cấu trúc lại cái này là gì? Tôi hy vọng rằng tôi có thể kết thúc với một cái gì đó như

x = some value if some condition || another value if another condition 

Có một mẫu cho loại điều này?

+0

Trước khi chúng tôi có thể cho bạn biết cách tái cấu trúc, bạn cần cho chúng tôi biết lý do bạn muốn cấu trúc lại điều này. Bạn đang cố giải quyết vấn đề gì? –

+2

'refactor = nil trừ khi tồn tại? (: Unit_tests)' – dbenhur

Trả lời

9

Chỉ cần đặt nhiệm vụ ra ngoài nếu.

x = if some condition 
    some value 
elsif another condition 
    a different value 

Hoặc bạn có thể sử dụng hàm băm.

x = dict[some condition] 
0

Nó không phải là một mẫu, mà là một toán tử. Một trong những bạn đang đề cập đến là các nhà điều hành ternary:

If Condition is true ? Then value X : Otherwise value Y 

Dưới đây là một ví dụ:

speed = 90 
speed > 55 ? puts("I can't drive 55!") : puts("I'm a careful driver") 

Sử dụng câu lệnh ternary là ngắn, ngọt ngào, và không được công việc.

+0

Điều kiện của tôi dài hơn nếu có. –

+0

Sau đó, tôi muốn gắn bó với câu lệnh 'if/elsif'. Không có gì sai khi sử dụng chúng. – BlackHatSamurai

+0

'đặt (tốc độ> 55)? "Tôi không thể lái 55!" : "Tôi là một người lái xe cẩn thận" ' – ZiggidyCreative

0
x = some condition ? some value : 
    another condition ? a different value : ... 
+1

Làm tổ? 'Không phải là một thực hành tốt. –

1

Một tuyên bố có điều kiện cũng là một biểu hiện, vì vậy một trong những điều đầu tiên bạn có thể làm, nếu biến là như nhau trong mỗi điều kiện, là:

x = if cond1 
    expr1 
elsif cond2 
    expr2 
.... 
end 

Nếu các điều kiện là tất cả các trạng thái của một biểu thức duy nhất, bạn có thể làm điều này thậm chí neater, bằng cách sử dụng một tuyên bố trường hợp.

Tuy nhiên, bài tập tính toán lại rõ ràng nhất tiếp theo là để có được điều kiện lớn bị cô lập thành một phương pháp, cần được cung cấp dữ liệu tối thiểu cần thiết để đánh giá tất cả các điều kiện và biểu thức.

Ví dụ:

# Where conditional is currently, and x assigned, assuming the conditionals 
# need a couple of variables . . . 
x = foo param1, param2 

# Elsewhere 
private 

def foo p1, p2 
    if cond1 
    expr1 
    elsif cond2 
    expr2 
    .... 
    end 
end 
0

Nếu bạn muốn cấu trúc lại cho mã rõ ràng và linh hoạt, hãy xem xét replacing conditional with polymorphism Refactor.

Không có đủ chi tiết trong câu hỏi của bạn để đi xa hơn với các đề xuất, nhưng trình tinh chỉnh này sẽ làm cho cơ sở mã của bạn có khả năng chống thay đổi nhiều hơn. Nếu bạn nhận được một yêu cầu mới, đó là hình thức xấu để phá vỡ mở điều kiện và sửa đổi nó (dễ bị giới thiệu lỗi, khó khăn hơn để làm); bạn nên tạo một đối tượng mới mà bạn có thể cắm vào cơ sở mã hiện có. Điều này linh hoạt những gì các Open/Closed Principle ("O" trong từ viết tắt SOLID) mô tả.

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