2011-09-07 32 views
5

Tôi gặp phải mã này trong đó một cuộc gọi phương thức, ví dụ ClassA.search (a, b, flag) đang được sử dụng bởi 3 bộ điều khiển. Đây là phiên bản được đơn giản hóa của phương thức:Đây có phải là cách tốt để tái sử dụng/chia sẻ phương pháp không?

public List<Result> search(Object a, Object b, boolean flag) { 
    //do some code logic here, common to the 3 controllers 
    //at the middle there is: 
    if (flag) { 
     //code that affects 2 Controllers 
    } else { 
     //code affects only 1 
    } 
    //some more common code 
    //some more code with the flag if else 
} 

Đây có phải là ý tưởng hay vì mã được sử dụng lại? Hoặc là có cách nào tốt hơn để có thể tái sử dụng mã nhưng không giới thiệu cờ này cho tùy biến mã người gọi (khách hàng) (như có thể chia nhỏ thành 3 phương thức khác nhau nhưng vẫn có thể khai báo một phương thức mã hóa lại phổ biến)?

Trả lời

6

Thứ nhất, trích nhận xét dòng với các chức năng:

public void search(Object a, Object b, boolean flag) 
{ 
    commonToThree(); 
    if (flag) 
    { 
     affectTwoControllers(); 
    } 
    else 
    { 
     affectsOnlyOne(); 
    } 
    alsoCommon(); 
} 

Bây giờ thoát khỏi flag luận boolean, mà là một mùi code:

public void searchWithTrueFlag(Object a, Object b) { 
    commonToThree(); 
    affectTwoControllers(); 
    alsoCommon(); 
} 

public void searchWithFalseFlag(Object a, Object b) { 
    commonToThree(); 
    affectsOnlyOne(); 
    alsoCommon(); 
} 
+0

Tôi đồng ý với điều này miễn là bạn không kết thúc việc chuyển biến cục bộ thành các trường để làm cho nó hoạt động. –

+0

Tại sao bạn thấy các biến cục bộ xấu? Nếu trạng thái bạn phải vượt qua và hơn thông qua các tham số rất quan trọng, hãy tạo đối tượng một lần với trạng thái được khởi tạo cho các trường cuối cùng trong hàm tạo và chỉ sử dụng nó một lần. Chức năng trên steroid ;-). –

+0

Đó là sự thật tuy nhiên thêm một lớp với các lĩnh vực (và một nhà xây dựng?) Là rất nhiều công việc để tránh một lá cờ. ;) –

3

Nó là tốt nhưng không tuyệt vời. Một boolean có ý nghĩa, nhưng nếu bạn bắt đầu thêm nhiều người trong số họ, bạn sẽ không đi đúng hướng.

Nó không phải lúc nào cũng có thể, nhưng thường mang mã tốt hơn để làm:

functionOne: 
    sharedCodeOne() 
    specificCode 
    sharedCodeTwo() 

functionTwo: 
    sharedCodeOne() 
    specificCode 
    sharedCodeTwo() 

Như mọi khi, thật khó để thực hiện tuyên bố tổng quát: đây là rõ ràng không phải lúc nào cũng có thể/thực tế.

+1

+1: Điều này tốt nếu ba phần mã không chia sẻ bất kỳ biến cục bộ nào.(hoặc chỉ chia sẻ một số nhỏ) –

+1

@Peter: Tôi đồng ý hoàn toàn - Tôi nghĩ đó là thực sự và lợi thế của phương pháp này mà nó giúp bạn giảm số lượng và phạm vi của các biến cục bộ. (Mặc dù một số người có thể có khuynh hướng biến họ thành các lĩnh vực của lớp học kèm theo, tạo ra một mớ hỗn độn) –

+1

@Arnout Engelen, tôi đồng ý rằng việc thêm các trường để thực hiện công việc này không phải là một ý tưởng hay. –

0

Đó là một cách tương đối đơn giản để thực hiện. Có những lựa chọn thay thế nhưng chúng có thể phức tạp hơn. (Chẳng hạn như truyền khách truy cập hoặc gọi phương thức của bộ điều khiển để nói điều cần làm cho bộ điều khiển đó)

Cách tốt nhất là bạn chia sẻ biến cục bộ giữa ba phần mã và bạn sẽ phải sử dụng các trường thay thế.

0

Tôi muốn tham gia một cách tiếp cận khác nhau cố gắng để trả lời câu hỏi này theo cách tổng quát:

Mục tiêu chính phải là sạch mã. Chính xác điều này là gì, tất nhiên phụ thuộc vào trường hợp cụ thể. Nhưng chắc chắn, không có mã sao chép và dán ở nhiều nơi, vì điều này đòi hỏi phải thay đổi một số địa điểm nếu nó phải thay đổi - cũng không sao, hãy thử trích xuất các phần phổ biến ở bất kỳ nơi nào nhiều hơn một phần đang sử dụng trong mọi trường hợp.

Luôn tưởng tượng ai đó phải đọc mã của bạn (hoặc bạn phải làm điều này một vài tuần nữa) và phải hiểu càng nhanh càng tốt những gì đang xảy ra ở đó. Vì vậy, nó phụ thuộc vào trường hợp đặc biệt, nếu nó tốt hơn để sao chép một số dòng hoặc trích xuất chúng trong một phương pháp phổ biến.

Cờ không phải là xấu, nhưng nó không thực sự là cái gì đó nên được sử dụng quá mức trong các phương thức java. Thường thì một tình huống như vậy có thể được giải quyết một cách độc đáo bằng cách quá tải một phương thức và sử dụng một phương pháp khác, để trường hợp thông thường được thực hiện trong một và sự bổ sung đặc biệt trong cái kia. Ngoài ra, bạn có thể có một số phương thức con và soạn phương thức của bạn với một số cuộc gọi đến chúng, nhưng điều này chỉ có ý nghĩa, nếu bạn không cần truyền các tham số quá nhiều.

Một quy tắc (hoàn toàn chủ quan, nhưng dựa trên các bài học rút ra từ nhiều dự án) tôi có thể cung cấp cho bạn: Ưu tiên triển khai thực hiện cụ thể các cách tiếp cận chung. Chúng có thể dẫn đến nhiều mã hơn và có vẻ ít thông minh hơn, nhưng chúng dễ hiểu hơn, mở rộng và gỡ lỗi.

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