2012-02-24 42 views
5

Tôi đang sử dụng reek làm công cụ phân tích để có các phương pháp hay nhất trong mã của mình. Tuy nhiên gần đây tôi thấy rằng nếu trong phương pháp, tôi có các tham số boolean, chẳng hạn như.Các tham số Boolean trong phương thức. Tại sao không?

def method (flag = true) 

reek cảnh báo cho tôi. Tại sao reek cho tôi biết rằng đó là cảnh báo?

+0

Nhiều khả năng từ một phương pháp dùng chỉ một boolean thường nên được chia thành hai, ví dụ như một 'setEnabled (bool) 'có thể được chia thành một' Enable' và 'Disable' có ý nghĩa hơn. –

+0

Joachim, tôi sẽ tranh luận rằng OK để chuyển một giá trị boolean như là một giá trị được lưu, giống như bạn có thể thiết lập một số nguyên với một phương thức setter. – AJcodez

Trả lời

3

Một vài năm trước tôi đã viết reek Tôi viết blog về mã mùi này ở đây: http://silkandspinach.net/2004/07/15/avoid-boolean-parameters/

Những vấn đề với các thông số Boolean tất cả phải làm với sự trùng lặp và SRP: được gọi là phương pháp có hai trách nhiệm, và người gọi biết cái nào nó muốn gọi.

+0

Đó là một sự cường điệu tổng trong quan điểm của tôi. Có rất nhiều trường hợp khi một phương thức có tham số Boolean tuân thủ SRP. Giống như 'def import (ignore_errors)', v.v. –

0

Biến cờ được coi là thực hành không tốt. Điều này là bởi vì nó vốn đã vi phạm nguyên tắc mà các chức năng nên làm một, và chỉ có một điều. Bằng cách đi qua một lá cờ boolean bạn đang nói, "Làm điều này nếu nó là sự thật, và rằng nếu nó là sai", đó là hai điều.

+5

nhưng chức năng luôn làm những việc khác nhau tùy thuộc vào thông số của chúng. –

0

Cũ câu hỏi, nhưng tôi nghĩ rằng tôi muốn thêm suy nghĩ của tôi đối với những người đến từ google:

phương pháp riêng biệt tốt trong một số trường hợp, nhưng lựa chọn tốt hơn thường trong tâm trí của tôi là như sau:

def method(option = {:flag => false}) 
    options[:flag] ? doFoo : doBar 
end 

method(:flag => true) 

này cũng có thể bao gồm một tấm séc nếu cờ thực sự là một boolean:

def method(option = {:flag => false}) 
    flag = options.fetch(:flag) { false } 
    unless [true, false].include?(flag) 
    raise ArgumentError, ':flag option should be true or false' 
    end 
    flag? doFoo : doBar 
end 

method(:flag => true) 
Các vấn đề liên quan