2009-09-03 45 views
6

Tôi có một cây khác sẽ phát triển khi tôi thêm các mục bổ sung để duy trì và tôi đang tìm cách tốt nhất để viết nó để bảo trì Tôi bắt đầu với mã nàyTái cấu trúc cây If else else

private void ControlSelect() 
{ 

    if (PostingType == PostingTypes.Loads && !IsMultiPost) 
    { 
     singleLoadControl.Visible = true; 
      singleTruckControl.Visible = false; 
      multiTruckControl.Visible = false; 
      multiLoadControl.Visible = false; 
    } 
    else if (PostingType == PostingTypes.Trucks && !IsMultiPost) 
    { 
     singleLoadControl.Visible = false; 
      singleTruckControl.Visible = true; 
      multiTruckControl.Visible = false; 
      multiLoadControl.Visible = false; 
    } 
    else if (PostingType == PostingTypes.Loads && IsMultiPost) 
    { 
     singleLoadControl.Visible = false; 
      singleTruckControl.Visible = false; 
      multiTruckControl.Visible = false; 
      multiLoadControl.Visible = true; 
    } 
    else if (PostingType == PostingTypes.Trucks && IsMultiPost) 
    { 
     singleLoadControl.Visible = false; 
     singleTruckControl.Visible = false; 
      multiTruckControl.Visible = true; 
     multiLoadControl.Visible = false; 
    } 
} 

và tư duy tái Sacombank nó một cái gì đó như thế này

private void ControlSelect() 
{ 
    List<UserControl> controlList = GetControlList(); 

     string visableControl = singleLoadControl.ID; 
     if (PostingType == PostingTypes.Loads && !IsMultiPost) 
     { 
     visableControl = singleLoadControl.ID; 
     } 
     else if (PostingType == PostingTypes.Trucks && !IsMultiPost) 
     { 
     visableControl = singleTruckControl.ID; 
     } 
     else if (PostingType == PostingTypes.Loads && IsMultiPost) 
     { 
     visableControl = multiLoadControl.ID; 
     } 
     else if (PostingType == PostingTypes.Trucks && IsMultiPost) 
     { 
     visableControl = multiTruckControl.ID; 
     } 

     foreach (UserControl userControl in controlList) 
     { 
     userControl.Visible = (userControl.ID == visableControl); 
     } 
} 

private List<UserControl> GetControlList() 
{ 
    List<UserControl> controlList = new List<UserControl> 
     { 
     singleLoadControl, 
      multiTruckControl, 
      singleTruckControl, 
      multiLoadControl 
     }; 
     return controlList; 
} 

tôi đi biểu diễn hit nhưng tôi có thể quản lý tất cả các điều khiển của tôi là một nơi duy nhất

wa suy nghĩ khác của tôi s để làm cho mỗi khối chọn kiểm soát nó phương pháp riêng, một cái gì đó như thế này

private void SetSingleLoadControlAsSelected() 
{ 
     singleLoadControl.Visible = true; 
     singleTruckControl.Visible = false; 
     multiTruckControl.Visible = false; 
     multiLoadControl.Visible = false; 
} 

tôi không đi biểu diễn hit nhưng tôi duy trì các điều khiển trong nhiều vị trí

Tôi đang nghiêng về lựa chọn cho một chỉ vì tôi thích khía cạnh bảo trì của nó.

+3

Tại sao bạn không chỉ đưa tất cả logic đó vào các lớp và thực hiện lựa chọn thông qua đa hình? –

+1

Đây là một mùi mã. –

Trả lời

23

gì về

singleLoadControl.Visible = 
     PostingType == PostingTypes.Loads && !IsMultiPost;  
singleTruckControl.Visible = 
     PostingType == PostingTypes.Trucks && !IsMultiPost;  
multiTruckControl.Visible = 
     PostingType == PostingTypes.Loads && IsMultiPost;  
multiLoadControl.Visible = 
     PostingType == PostingTypes.Trucks && IsMultiPost; 

nếu bạn muốn khả năng để làm cho nhiều điều khiển có thể nhìn thấy (hoặc thêm giá trị liệt kê hơn) trang trí enum với [Flags] thuộc tính như sau:

[Flags] 
public enum PostTyp { None=0, IsMultiPost = 1, Loads = 2, Trucks = 4 } 

và sửa đổi luật như sau:

singleLoadControl.Visible = 
     ((PostingType & (PostTyp.Loads | ~PostTyp.MultiCast)) 
     == PostingType);  
singleTruckControl.Visible = 
     ((PostingType & (PostTyp.Trucks | ~PostTyp.MultiCast)) 
     == PostingType);   
multiTruckControl.Visible = 
     ((PostingType & (PostTyp.Loads | PostTyp.MultiCast)) 
     == PostingType);   
multiLoadControl.Visible = 
     ((PostingType & (PostTyp.Trucks | PostTyp.MultiCast)) 
     == PostingType);  
+3

Điều này sẽ vẫn hoạt động. Tất cả các giá trị sẽ là false trừ một giá trị có thuật toán ở trên. –

+0

@JS là đúng. Chỉ có một cái sẽ được đặt thành hiển thị vì tất cả các biểu thức boolean là độc quyền –

+1

Nó hoạt động cho kịch bản được đăng, nhưng tôi cảm thấy cách tiếp cận này có thể khó chứng minh nếu cần thêm nhiều giá trị và điều khiển bổ sung hoặc kết hợp. Nếu nó không bao giờ thay đổi, tuy nhiên, tôi nghĩ rằng đây là một tốt, gọn gàng refactoring. –

5

Điều gì về điều này:

 singleLoadControl.Visible = false; 
    singleTruckControl.Visible = false; 
    multiTruckControl.Visible = false; 
    multiLoadControl.Visible = false; 

    if (PostingType == PostingTypes.Loads && !IsMultiPost) 
    { 
      singleLoadControl.Visible = true; 
    } 
    else if (PostingType == PostingTypes.Trucks && !IsMultiPost) 
    { 
      singleTruckControl.Visible = true; 
    } 
    else if (PostingType == PostingTypes.Loads && IsMultiPost) 
    { 
     multiLoadControl.Visible = true; 
    } 
    else if (PostingType == PostingTypes.Trucks && IsMultiPost) 
    { 
      multiTruckControl.Visible = true; 
} 
+1

Điều này chắc chắn tốt hơn mã OPS, nhưng tôi cảm thấy nó đang trên con đường để tái cấu trúc chặt chẽ hơn theo gợi ý của Charles Bretana, Chris Brandsma, hoặc bản thân tôi. –

6

Có vẻ như bạn đang sử dụng một điều tra, tôi khuyên bạn nên chuyển đổi với trường hợp mặc định để đối phó với các giá trị không xác định. Tôi tin rằng cách tiếp cận này làm cho những ý định rõ ràng hơn là làm tất cả việc kiểm tra trong bài tập.

switch (PostingType) 
{ 
case PostingTypes.Loads: 
    singleLoadControl.Visible = !IsMultiPost; 
    multiTruckControl.Visible = IsMultiPost; 
    singleTruckControl.Visible = false; 
    multiTruckLoadControl.Visible = false; 
    break; 

case PostingTypes.Trucks: 
    singleLoadControl.Visible = false; 
    multiTruckControl.Visible = false; 
    singleTruckControl.Visible = !IsMultiPost; 
    multiLoadControl.Visible = IsMultiPost; 
    break; 

default: 
    throw InvalidOperationException("Unknown enumeration value."); 
} 
+1

+1 cho khả năng đọc/rõ ràng mã so với các bài tập thông minh và bitwiseness (là ngay cả một từ !?). –

1

Nếu bạn đang mong đợi để có thêm rất nhiều thông số khác nhau, bạn có thể tạo một mảng đa chiều của các đối tượng

Arr[0][0] = singleLoadControl 
Arr[0][1] = singleTruckControl 
Arr[1][0] = multiLoadControl 
Arr[1][1] = multiTruckControl 

này là khá đáng sợ, nhưng làm cho đơn giản hơn nếu phát biểu. Nếu bạn sẽ có vô số tham chiếu đến các điều khiển dù sao đi nữa, tôi muốn sử dụng một biểu diễn dựa trên mã của những gì các tải đó là gì. một mảng như vậy có thể được bọc trong một lớp học để cho phép bạn truy cập vào các yếu tố sử dụng một cái gì đó giống như:

ControlClassInstance.single.truck 

Bạn muốn có mã như thế này:

p1 = IsMultiPost ? ControlClassInstance.multi : ControlClassInstance.single 
p2 = p1[PostingType] //(this call would mean adding an indexer) 

Loại giải pháp này là cách quá phức tạp trừ khi bạn mong đợi mọi thứ trở nên phức tạp ... và cũng có thể nghèo nàn.

+0

Tôi không chắc chắn phức tạp là từ thích hợp cho việc này. Obfuscated, unmaintainable, khó hiểu, overkill; những từ này có vẻ phù hợp hơn. Trong khi việc sử dụng trở nên rõ ràng hơn, việc thực hiện được phức tạp đến mức người khác có thể đấu tranh để hiểu và duy trì nó, điều này có thể dẫn đến các lỗi dễ dàng. –

+0

@ Jeff: Vâng, nó có thêm quá nhiều chi phí. Nó sẽ thực sự chỉ được biện minh nếu có rất nhiều tài sản đã được thêm vào và nếu việc sử dụng thay đổi nó nuôi dưỡng sẽ chảy máu vào những nơi khác. Nhưng trong trường hợp đó, có lẽ là một cách tốt hơn. ::: Shrug ::: – Brian

1
singleLoadControl.Visible = false; 
    singleTruckControl.Visible = false; 
    multiTruckControl.Visible = false; 
    multiLoadControl.Visible = false; 


    singleLoadControl.Visible = (PostingType == PostingTypes.Loads && !IsMultiPost); 
    singleTruckControl.Visible = (PostingType == PostingTypes.Trucks && !IsMultiPost); 
    multiLoadControl.Visible = (PostingType == PostingTypes.Loads && IsMultiPost); 
    multiTruckControl.Visible = (PostingType == PostingTypes.Trucks && IsMultiPost); 
+2

Không có lý do gì để khởi tạo tất cả các giá trị thành false vì điều này sẽ xảy ra bởi đức hạnh của các khai báo sau này của bạn. –

+0

Tôi đã nghĩ về một cái gì đó như thế này, nhưng sau đó chỉ cần sử dụng một tuyên bố chuyển đổi để chọn ví dụ cụ thể để kích hoạt, nhưng câu trả lời của Jeff Yate hoạt động khá nhiều giống như vậy anyway (và có lẽ là một chút thanh lịch hơn với boolean trong đó) –

+0

Hoàn toàn có. Nhưng một cái gì đó trong câu trả lời của bài đăng khiến tôi nghĩ rằng đây là một phần của nhiều mã hơn. Vì vậy, tôi để chúng lại. –

2

Nếu nó sẽ khác hợp lý (ví dụ, nếu những đã là điều khiển tùy chỉnh tên miền cụ thể), bạn có thể đóng gói logic bên trong điều khiển tự (Replace Conditional with Polymorphism).Có lẽ tạo ra một giao diện như thế này:

public interface IPostingControl { 
    void SetVisibility(PostingType postingType, bool isMultiPost); 
} 

Sau đó, mỗi kiểm soát sẽ chịu trách nhiệm cho các quy tắc tầm nhìn riêng của mình:

public class SingleLoadControl: UserControl, IPostingControl { 

    // ... rest of the implementation 
    public void SetVisibility(PostingType postingType, bool isMultiPost) { 
     this.Visible = postingType == PostingType.Load && !isMultiPost); 
    } 
} 

Cuối cùng, trong trang của bạn, chỉ cần lặp qua IPostingControls của bạn và gọi SetVisibility(postingType, isMultiPost).

+1

Một ý tưởng thú vị, nhưng nếu lý do duy nhất để chuyên là thêm xử lý cho logic hiển thị này, tôi không nghĩ đó là một sự tái cấu trúc tốt. Tôi không muốn chuyên về TextBox chỉ để thêm mã cụ thể để xử lý khi chúng được hiển thị - tôi thậm chí không nghĩ rằng mỗi trường hợp cần phải biết trạng thái chủ sở hữu của nó muốn mọi thứ. –

+1

Đồng ý, điều này là quá mức cần thiết nếu các điều khiển được đề cập chỉ là TextBox (hoặc bất kỳ UserControl nào khác), miền không có khả năng thay đổi và logic chỉ ở một nơi duy nhất. Nó có thể thậm chí không có giá trị nếu chỉ có hai trong số đó là sự thật. Nhưng nếu một hoặc không ai trong số đó là đúng, nó chắc chắn sẽ đáng giá! –

+0

điều này sẽ kiểm soát chặt chẽ việc sử dụng cụ thể này –

-1
private void ControlSelect() 
{ 
    if (PostingType == PostingTypes.Loads && !IsMultiPost) 
    { 
     singleLoadControl.Visible = true; 
     singleTruckControl.Visible = false; 
     multiTruckControl.Visible = false; 
     multiLoadControl.Visible = false; 
     return; 
    } 
    if (PostingType == PostingTypes.Trucks && !IsMultiPost) 
    { 
     singleLoadControl.Visible = false; 
     singleTruckControl.Visible = true; 
     multiTruckControl.Visible = false; 
     multiLoadControl.Visible = false; 
     return; 
    } 
    if (PostingType == PostingTypes.Loads && IsMultiPost) 
    { 
     singleLoadControl.Visible = false; 
     singleTruckControl.Visible = false; 
     multiTruckControl.Visible = false; 
     multiLoadControl.Visible = true; 
     return; 
    } 
    if (PostingType == PostingTypes.Trucks && IsMultiPost) 
    { 
     singleLoadControl.Visible = false; 
     singleTruckControl.Visible = false; 
     multiTruckControl.Visible = true; 
     multiLoadControl.Visible = false; 
     return; 
    } 
} 
+0

đây chính xác là những gì tôi KHÔNG cố gắng làm –

+0

-1 đây là một gợi ý khủng khiếp, IMHO. Nó làm cho mã tồi tệ hơn là tốt hơn, giới thiệu nhiều cơ hội cho các lỗi bảo trì. –

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