2010-04-07 6 views
5

Tôi có tuyên bố chuyển đổi khá dài. Một số trường hợp thực sự ngắn và tầm thường. Một vài dài hơn và cần một số các biến mà không bao giờ được sử dụng bất cứ nơi nào khác, như thế này:Bạn có nên định nghĩa một biến trong một khối cục bộ cho một trường hợp của một câu lệnh switch không?

switch (action) { 
    case kSimpleAction: 
     // Do something simple 
     break; 
    case kComplexAction: { 
     int specialVariable = 5; 
     // Do something complex with specialVariable 
     } break; 
} 

Việc thay thế sẽ phải khai báo biến trước khi đi sâu vào switch như thế này:

int specialVariable = 5; 
switch (action) { 
    case kSimpleAction: 
     // Do something simple 
     break; 
    case kComplexAction: 
     // Do something complex with specialVariable 
     break; 
} 

này có thể nhận được khá khó hiểu vì nó không phải là rõ ràng mà case biến thuộc và nó sử dụng một số bộ nhớ không cần thiết.

Tuy nhiên, tôi chưa bao giờ thấy việc sử dụng này ở bất kỳ nơi nào khác.
Bạn có nghĩ rằng bạn nên khai báo biến cục bộ trong một khối cho một đơn case?

Trả lời

11

Nếu specialVariable không được sử dụng sau khối chuyển đổi, hãy khai báo nó trong khối "case".

Nói chung, các biến phải được khai báo trong phạm vi nhỏ nhất có thể, nó sẽ được sử dụng.

+0

Mỗi trường hợp có phải là phạm vi không? Tôi hỏi vì một trường hợp không có ý nghĩa gì nếu không có một công tắc, chắc chắn? – gbn

+4

@gbn - bởi chính nó, một 'trường hợp' không tạo ra một phạm vi mới.Mã sẽ cần thêm '{}' để giới thiệu phạm vi mới (như OP làm trong ví dụ đầu tiên của mình). –

+0

có, bạn cần phải tạo ra một "phạm vi" trong trường hợp bạn dự định sử dụng biến trong trường hợp (pun), nơi biến sẽ được sử dụng chỉ trong trường hợp đó. – Max

3

Có xác định các biến trong phạm vi hẹp nhất cần thiết.

Vì vậy, ví dụ 1 được ưu tiên.

1

Đồng ý với phạm vi tối đa có thể tối đa có thể. Bằng cách đó, khi người tiếp theo cần cập nhật nó, người đó không cần phải lo lắng về việc biến đó có được sử dụng trong các phần khác của câu lệnh switch hay không.

3

Nếu câu lệnh switch trở nên vô cùng lớn, bạn có thể muốn chuyển sang bảng con trỏ hàm. Bằng cách có mã cho từng trường hợp trong các hàm riêng biệt, bạn không phải lo lắng về việc khai báo và định nghĩa biến.

Một ưu điểm khác là bạn có thể đặt từng hàm case vào đơn vị dịch riêng biệt. Điều này sẽ đẩy nhanh quá trình xây dựng bằng cách chỉ biên dịch các số case mà đã thay đổi. Cũng cải thiện chất lượng bằng cách cô lập các thay đổi cho phạm vi nhỏ nhất của chúng.

1

Quy tắc riêng của tôi cho báo cáo chuyển đổi là phải có tối đa một câu lệnh trong mỗi trường hợp, không bao gồm dấu ngắt. Điều này có nghĩa là câu lệnh hoặc là một khởi tạo, một nhiệm vụ hoặc một cuộc gọi hàm. Đặt bất kỳ mã phức tạp hơn trong trường hợp là một công thức cho thảm họa - tôi "trìu mến" nhớ tất cả mã Windows mà tôi đã thấy (lấy cảm hứng từ Petzold) để xử lý thông số trong dòng trong cùng một trường hợp của quy trình cửa sổ.

Vì vậy, hãy gọi một hàm và đặt biến trong đó!

2

Tôi là tất cả cho

case X: 
    { 
     type var; 
     ...; 
    } 
    break; // I like to keep breaks outside of the blocks if I can 

Nếu những thứ trong đó trở nên quá phức tạp và bắt đầu nhận được trong cách của khả năng của bạn để xem chuyển đổi toàn bộ/trường hợp như một switch/trường hợp sau đó xem xét di chuyển càng nhiều khi bạn có thể thành một hoặc hai hàm nội tuyến được gọi bằng mã trường hợp. Điều này có thể cải thiện khả năng đọc mà không cần phải trả phí gọi hàm trong đó.