2010-06-03 36 views
6

Nếu tôi có một chức năng được gọi từ một vài địa điểm và yêu cầu phải đáp ứng một số điều kiện để thực hiện bất kỳ điều kiện nào. Trong trường hợp của tôi, nó là để vẽ - nếu nút chuột được giữ lại, sau đó thực hiện logic vẽ (điều này đang được thực hiện trong trình xử lý chuyển động của chuột khi bạn kéo.)Thực hành tốt nhất - Khi nào để đánh giá điều kiện thực hiện chức năng

Tùy chọn một cho biết đặt nó trong hàm rằng nó được đảm bảo để được kiểm tra. Tóm tắt, nếu bạn muốn.

public function Foo() { 
    DoThing(); 
} 

private function DoThing() { 
    if (!condition) return; 
    // do stuff 
} 

Tôi có vấn đề với điều này là khi đọc mã của Foo, có thể xa DoThing, nó trông giống như một lỗi. Ý nghĩ đầu tiên là tình trạng không được kiểm tra.

Tùy chọn hai, sau đó, là kiểm tra trước khi gọi.

public function Foo() { 
    if (condition) DoThing(); 
} 

Điều này tốt hơn, nhưng bây giờ bạn phải lo lắng về việc kiểm tra từ mọi nơi bạn gọi.

Tùy chọn ba là đổi tên hàm thành mô tả hơn.

public function Foo() { 
    DoThingOnlyIfCondition(); 
} 

private function DoThingOnlyIfCondition() { 
    if (!condition) return; 
    // do stuff 
} 

Đây có phải là giải pháp "đúng" không? Hay chuyện này có hơi quá xa không? Tôi cảm thấy như mọi thứ giống như tên chức năng này sẽ bắt đầu lặp lại mã của họ.

Về điều này là chủ quan: tất nhiên là vậy, và có thể không có câu trả lời đúng, nhưng tôi nghĩ nó vẫn hoàn toàn ở nhà tại đây. Nhận lời khuyên từ những người lập trình tốt hơn tôi là cách tốt nhất thứ hai để học. Các câu hỏi chủ quan chính xác là điều Google không thể trả lời.

Trả lời

5

Theo DRY, tôi sẽ làm điều đầu tiên.

public function Foo() { 
    DoThing(); 
} 

private function DoThing() { 
    if (!condition) return; 
    // do stuff 
} 

Khi bạn quen với mẫu, bạn không cần phải nhìn thấy một số DoThing() đơn lẻ trong mã của mình. Bạn sẽ bắt đầu đọc nó như một EnsureThingDone().

+2

Câu trả lời cho câu hỏi cấu trúc. Đối với tên, suy nghĩ nhiều hơn một chút nên mang lại một thay thế đó là phù hợp mô tả và không lặp đi lặp lại. Có lẽ một cái gì đó trong tĩnh mạch của 'DrawOnDrag()' cho 'DoThing()'. – Novelocrat

0

Tôi muốn kiểm tra điều kiện tiên quyết bên trong hàm,

public function DoThing() 
{ 
    ValidatePreconditions(); 
    DoWork(); 
} 

private function DoWork() 
{ 
    //Do the actual work; 
} 

Bằng cách này tôi chắc chắn tất cả các điều kiện tiên quyết đúng đắn được đáp ứng trước khi thực hiện các chức năng của tôi và không có nhu cầu cho người tiêu dùng thêm mã unnecesary mỗi thời gian chức năng của tôi được gọi.

0

Bạn có thể sử dụng hệ thống kiểu. Đặt tham số cho DoThing một đối tượng mà bạn chỉ có thể khởi tạo nếu các điều kiện tiên quyết được thông qua.

Cách gọn gàng để thực hiện việc này là đặt DoThing một phương thức thể hiện trên đối tượng đó.

2

Tùy chọn bốn, bọc biến vị ngữ và cuộc gọi thực tế trong hàm thứ 3.

function DoThing() { 
    // do stuff 
} 

function DoThingOnlyIfCondition() { 
    if (!condition) return; 
    DoThing(); 
} 

function Foo() { 
    DoThingOnlyIfCondition(); 
} 

// Foo version 2 
function FooBar() { 
    DoThing(); 
} 

Bây giờ Foo, hoặc bất kỳ chức năng nào, đều có thể sử dụng phiên bản DoXXX() phù hợp nhất.

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