2012-01-13 6 views
6

Tôi có phương thức này trong C# và tôi muốn cấu trúc lại nó. Chỉ có quá nhiều bool và dòng. Điều gì sẽ là tái cấu trúc tốt nhất. Làm cho một lớp học mới có vẻ hơi quá mức, và việc cắt đơn giản chỉ có vẻ khó khăn. Bất kỳ thông tin chi tiết hoặc con trỏ sẽ được đánh giá cao.Tái cấu trúc phương pháp có quá nhiều bool trong đó

phương pháp để cấu trúc lại

private DialogResult CheckForSireRestrictionInSubGroup(bool deletingGroup,string currentId) 
    { 
     DialogResult result = DialogResult.No; 
     if (!searchAllSireList) 
     { 
      DataAccessDialog dlg = BeginWaitMessage(); 
      bool isClose = false; 
      try 
      { 
       ArrayList deletedSire = new ArrayList(); 
       ISireGroupBE sireGroupBE = sireController.FindSireGroupSearch(); 

       if (sireGroupBE != null) 
       { 
        //if the current group is in fact the seach group before saving 
        bool currentGroupIsSeachGroup = sireGroupBE.TheSireGroup.id == currentId; 

        //if we have setting this group as search group 
        bool selectedAsSearchGroup = this.chkBoxSelectedSireGroup.Checked; 

        //if the group we currently are in is not longer the seach group(chk box was unchecked) 
        bool wasSearchGroup = currentGroupIsSeachGroup && !selectedAsSearchGroup; 

        //if the group is becoming the search group 
        bool becomesSearchGroup = !currentGroupIsSeachGroup && selectedAsSearchGroup; 

        //if the group being deleted is in fact the search group 
        bool deletingSearchGroup = deletingGroup && currentGroupIsSeachGroup; 

        //if the user checked the checkbox but he's deleting it, not a so common case, but 
        //we shouldn't even consider to delete sire in this case 
        bool deletingTemporarySearchGroup = deletingGroup && !currentGroupIsSeachGroup;   

        //if we are not deleting a temporary search group and it's either 
        //becoming one (without deleting it) or we already are the search group 
        bool canDeleteSires = !deletingTemporarySearchGroup && 
              (becomesSearchGroup || currentGroupIsSeachGroup); 
        //we only delete sires if we are in search group 
        if (canDeleteSires) 
        { 
         if (deletingSearchGroup || wasSearchGroup) 
         { 
          // If we deleted all sires 
          deletedSire = new ArrayList(); 
          deletedSire.AddRange(sireGroupBE.SireList); 
         } 
         else 
         { 
          //if we delete a few sire from the change of search group 
          deletedSire = GetDeleteSire(sireGroupBE.SireList); 
         } 
        } 

        EndWaitMessage(dlg); 
        isClose = true; 
        result = ShowSubGroupAffected(deletedSire); 
       } 
      } 
      finally 
      { 
       if (!isClose) 
       { 
        EndWaitMessage(dlg); 
       } 
      } 
     } 

     return result; 
    } 
+0

này trông giống như một cách rõ ràng nhất để thể hiện logic - nó rất dễ dàng để đọc, và cũng được bình luận. Tôi sẽ không chạm vào nó chút nào. – dasblinkenlight

+0

Đồng ý .... có thể dài nhưng có thể đọc được. –

+1

Tôi có ý kiến ​​rằng mã hiện tại có thể đọc được, nhưng làm giảm mục tiêu của phương thức, để xóa các mục nhập. Logic boolean có thể vẫn như cũ và di chuyển sang một phương thức khác sao cho phương thức chính có thể cắt giảm mã "hỗ trợ" không giải quyết vấn đề chính của việc xóa các công cụ. –

Trả lời

7

Một lựa chọn là để cấu trúc lại ra mỗi phép toán sơ cấp (canDeleteSires, deletingSearchGroup || wasSearchGroup) vào phương pháp với tên mô tả phiên bản có thể đọc được các logic:

if (WeAreInSearchGroup()) 
{ 
    if (WeAreDeletingAllSires()) 
    { 
     deletedSire = new ArrayList(); 
     deletedSire.AddRange(sireGroupBE.SireList); 
    } 
    else 
    { 
     deletedSire = GetDeleteSire(sireGroupBE.SireList); 
    } 
} 

Bạn sau đó đóng gói logic boolean hiện tại của bạn trong những phương pháp , cách bạn vượt qua trạng thái (các đối số phương thức hoặc các thành viên lớp) là vấn đề về hương vị.

Thao tác này sẽ xóa boolean khỏi phương thức chính thành các phương thức nhỏ hơn hỏi và trả lời trực tiếp câu hỏi. Tôi đã nhìn thấy cách tiếp cận này được sử dụng trong phong cách phát triển "ý kiến ​​ác". Thành thật mà nói, tôi thấy điều này một chút quá mức cần thiết nếu bạn là một con sói đơn độc, nhưng trong một nhóm nó có thể dễ đọc hơn nhiều.

Out of sở thích cá nhân tôi cũng sẽ đảo ngược của bạn đầu tiên nếu tuyên bố quay trở lại sớm, điều này sẽ giảm mức độ thụt đầu dòng của toàn bộ phương pháp:

if (searchAllSireList) 
{ 
    return result; 
} 

DataAccessDialog dlg = BeginWaitMessage(); 
bool isClose = false; 
try 
... 

Nhưng sau đó bạn có thể bị trừng phạt bởi "nhiều lợi nhuận là "đám đông" ác. Tôi nhận được thực tế phát triển ấn tượng cũng giống như chính trị ...

+0

+1 cho phương thức trả lại sớm. Quá nhiều nhà phát triển lo sợ điều này, nhưng nó là một cách tuyệt vời để cải thiện sự rõ ràng của một khối như thế này. Và đơn giản. –

+0

@CarlManaster Tôi đồng ý với bạn ở đây, tôi có xu hướng ưu tiên lợi nhuận sớm nếu có các điều khoản về bom. Tôi có xu hướng ủng hộ trả về duy nhất nếu có nhiều giá trị trả về có thể có liên quan đến logic, nếu điều đó có ý nghĩa gì lol –

+0

Ồ, nhóm mà tôi làm việc có trong giáo phái của phương thức trả về cho mỗi phương thức. Vì vậy, không có nhiều sự lựa chọn ở đây. Personnaly Tôi chưa cố định nếu thực hành này là xấu xa hay không. – Xavier

0

Trên thực tế, cá nhân tôi sẽ để nó như nó là. Các boolean mà bạn có tất cả các nơi, mặc dù không hiệu quả, làm cho chức năng này dễ đọc và dễ hiểu.

Bạn có thể làm một cái gì đó như kết hợp tất cả các bool vào một dòng đơn (như dưới đây), tuy nhiên đó không phải là duy trì như những gì bạn đã viết.

x = ((a & b) &! D) | e;

0

Có thể bạn có thể thử xóa tất cả nhận xét. Các biến bool mà bạn có đang thêm giá trị vào sự hiểu biết về mã, bạn có thể đặt một vài giá trị trong số chúng vào trong dòng lệnh cho hàm getDeleteSires, nhưng tôi không nghĩ rằng sẽ thêm bất kỳ giá trị nào.

Mặt khác, mã đó có trong biểu mẫu của bạn, vì vậy nó có thể tốt hơn trong bộ điều khiển của bạn để bạn có thể giữ biểu mẫu đơn giản và bộ điều khiển thực sự kiểm soát hành vi.

+0

Hehe, bạn đã phát hiện ra thứ gì đó mà tôi cũng phát hiện ra. Nó thực sự không phải ở nơi tốt. Đó là mã cũ tôi đang tái cấu trúc để dễ đọc. Tôi chắc chắn sẽ đặt nó trong một số bộ điều khiển bên cạnh hoặc bất cứ nơi nào không có trong xem. – Xavier

+0

Nhưng điều đó sẽ cung cấp cho bạn khả năng đọc. Tôi nghĩ rằng mã là tốt trong cách nó bây giờ, tôi nghĩ rằng nó đã sẵn sàng cho "cấp độ tiếp theo". – ivowiblo

1

Đây là một cấu trúc lại nhỏ để loại bỏ một số thụt đầu dòng:

private DialogResult CheckForSireRestrictionInSubGroup(bool deletingGroup,string currentId) 
{ 
    if (searchAllSireList) 
     return DialogResult.No; 

    DataAccessDialog dlg = BeginWaitMessage(); 
    bool isClose = false; 

    try 
    { 
     ISireGroupBE sireGroupBE = sireController.FindSireGroupSearch(); 

     if (sireGroupBE == null) 
      return DialogResult.No; 

     //if the current group is in fact the seach group before saving 
     bool currentGroupIsSeachGroup = sireGroupBE.TheSireGroup.id == currentId; 

     //if we have setting this group as search group 
     bool selectedAsSearchGroup = this.chkBoxSelectedSireGroup.Checked; 

     //if the group we currently are in is not longer the seach group(chk box was unchecked) 
     bool wasSearchGroup = currentGroupIsSeachGroup && !selectedAsSearchGroup; 

     //if the group is becoming the search group 
     bool becomesSearchGroup = !currentGroupIsSeachGroup && selectedAsSearchGroup; 

     //if the group being deleted is in fact the search group 
     bool deletingSearchGroup = deletingGroup && currentGroupIsSeachGroup; 

     //if the user checked the checkbox but he's deleting it, not a so common case, but 
     //we shouldn't even consider to delete sire in this case 
     bool deletingTemporarySearchGroup = deletingGroup && !currentGroupIsSeachGroup;   

     //if we are not deleting a temporary search group and it's either 
     //becoming one (without deleting it) or we already are the search group 
     bool canDeleteSires = !deletingTemporarySearchGroup && 
           (becomesSearchGroup || currentGroupIsSeachGroup); 

     ArrayList deletedSire = new ArrayList(); 

     //we only delete sires if we are in search group 
     if (canDeleteSires) 
     { 
      if (deletingSearchGroup || wasSearchGroup) 
      { 
       // If we deleted all sires 
       deletedSire.AddRange(sireGroupBE.SireList); 
      } 
      else 
      { 
       //if we delete a few sire from the change of search group 
       deletedSire = GetDeleteSire(sireGroupBE.SireList); 
      } 
     } 

     EndWaitMessage(dlg); 
     isClose = true; 
     return ShowSubGroupAffected(deletedSire); 
    } 
    finally 
    { 
     if (!isClose) 
     { 
      EndWaitMessage(dlg); 
     } 
    } 
    return DialogResult.No; 
}