2009-02-24 42 views
5

Tôi có bộ đệm char (tức là byte) mà tôi đang gửi qua mạng. Tại một số thời điểm trong tương lai, tôi có thể muốn chuyển bộ đệm sang một loại khác như unsigned char hoặc short. Tôi đã suy nghĩ về việc làm một cái gì đó như thế này:Sử dụng hợp lệ typedef?

typedef char bufferElementType; 

Và bất cứ khi nào tôi làm bất cứ điều gì với một yếu tố đệm Tôi tuyên bố nó như bufferElementType hơn char. Bằng cách đó, tôi có thể chuyển sang loại khác bằng cách thay đổi typedef này (tất nhiên nó sẽ không đơn giản như vậy, nhưng ít nhất cũng sẽ dễ dàng xác định các địa điểm cần sửa đổi ... sẽ có bufferElementType gần đó) .

Đây có phải là cách sử dụng hợp lệ/tốt cho typedef không? Nó không đáng để giải quyết rắc rối? Nó sẽ làm tôi đau đầu vào một thời điểm nào đó trong tương lai? Nó sẽ làm cho các lập trình viên bảo trì ghét tôi chứ?

Tôi đã đọc qua When Should I Use Typedef In C++, nhưng không ai thực sự đề cập đến điều này.

+0

Bạn có sử dụng mảng loại này cho bộ đệm của mình không? Hoặc bạn có nghĩa là bộ đệm là 1 byte dài, và bạn có thể muốn làm cho nó 2 byte hoặc 4 byte trong tương lai? –

+0

Trong trường hợp đó, không có nhiều lợi thế khi sử dụng "typedef char bufferElementType;". Nếu bạn sử dụng cùng một kích thước mảng ở khắp mọi nơi, có thể hữu ích khi gõ toàn bộ loại mảng: "typedef char [1024] bufferElementType;" - cho phép bạn thay đổi kích thước bộ đệm ở mọi nơi trong một lần. –

+0

Nếu các bộ đệm của bạn thực sự giữ các ký tự "văn bản" và bạn đang xem xét chuyển đổi từ mã hóa ký tự chính xác-1-byte (ví dụ ANSI) thành mã hóa ký tự chính xác 2 byte hoặc chính xác 4 byte, typedef là con đường để đi. –

Trả lời

11

Đó là cách sử dụng tuyệt vời (và bình thường). Tuy nhiên, bạn phải cẩn thận, ví dụ, loại bạn chọn đáp ứng cùng một tiêu chí đã ký/chưa ký, hoặc chúng phản hồi tương tự như các toán tử. Sau đó, sẽ dễ dàng thay đổi loại sau đó.

Tùy chọn khác là sử dụng mẫu để tránh sửa loại cho đến thời điểm bạn đang biên soạn. Một lớp được định nghĩa là:

template <typename CharType> 
class Whatever 
{ 
    CharType aChar; 
    ... 
}; 

có thể làm việc với bất kỳ loại char nào bạn chọn, trong khi nó phản hồi tất cả các toán tử theo cùng một cách.

+0

Tôi không hiểu những lợi thế nào khi sử dụng typedef trong trường hợp này. Mục đích duy nhất của biến bộ đệm là cung cấp một số lượng byte lưu trữ nhất định và char luôn là kích thước của đơn vị lưu trữ địa chỉ nhỏ nhất. Bạn có thể đưa ra một kịch bản mà việc thay đổi kiểu đã gõ có hữu ích không? Ví dụ: –

+0

char to wchar; char để XMLChar (libxml2), vv Tôi nhận ra trường hợp của một char duy nhất không phải là thú vị nhất, nhưng đưa ra các tên ngữ nghĩa mô tả cho các loại cũng là một thực hành tốt, ngoài những lý do khác tôi đã đưa ra. –

+0

Có, đó là một trường hợp sử dụng. Tôi có cảm giác từ câu hỏi của người hỏi rằng anh ta quan tâm đến bộ đệm của * byte *, nhưng nếu nó được cho là giữ các ký tự văn bản trong một số mã hóa (kích thước cố định nhưng có thể đa byte) thì nó thích hợp để xem xét các loại phần tử đệm khác nhau. –

1

Có, đây là việc sử dụng hoàn hảo cho typedef, ít nhất là trong C.

Đối với C++ nó có thể lập luận rằng mẫu là một ý tưởng tốt hơn (như Diego Sevilla đã gợi ý) nhưng họ có nhược điểm của họ. (Thêm công việc nếu mọi thứ sử dụng kiểu dữ liệu chưa được bao bọc trong một vài lớp, thời gian biên dịch chậm hơn và cấu trúc tệp nguồn phức tạp hơn, v.v.)

Nó cũng có ý nghĩa để kết hợp hai cách tiếp cận, đó là, cho một tên typedef cho một tham số mẫu.

Lưu ý rằng khi bạn đang gửi dữ liệu qua mạng, các loại số nguyên khác và char có thể không được hoán đổi cho nhau (ví dụ: do cuối kỳ). Trong trường hợp đó, sử dụng một lớp templated với các chức năng chuyên biệt có thể có ý nghĩa hơn. (Gửi <char> gửi byte, gửi < ngắn > chuyển nó tới mạng thứ tự byte đầu tiên)

Tuy nhiên, một giải pháp khác sẽ được tạo ra một lớp "BufferElementType" với các phương pháp helper (convertToNetworkOrderBytes()) nhưng tôi sẽ đặt cược đó sẽ là một việc quá mức cần thiết cho bạn.

2

Một ưu điểm khác của typedef là, nếu được sử dụng một cách khôn ngoan, chúng có thể tăng khả năng đọc. Như một ví dụ thực sự câm, một đồng hồ và một bằng cấp có thể được tăng gấp đôi, nhưng bạn muốn phân biệt giữa chúng. Sử dụng typedef là onc nhanh chóng & giải pháp dễ dàng để make errors more visible.

Lưu ý: một giải pháp mạnh mẽ hơn cho ví dụ trên sẽ là tạo các loại khác nhau cho đồng hồ và mức độ. Do đó, trình biên dịch có thể thực thi chính những thứ đó. Điều này đòi hỏi một chút công việc, mà không phải luôn luôn trả hết, tuy nhiên.Sử dụng typedefs là cách nhanh chóng & cách dễ dàng để thực hiện lỗi hiển thị, như được mô tả trong bài viết được liên kết ở trên.

+0

typedefs chắc chắn có thể tăng khả năng đọc, tuy nhiên chúng không thể làm cho lỗi hiển thị nhiều hơn vì chúng chỉ là bí danh mà trình biên dịch ngay lập tức dịch sang kiểu cơ bản của chúng. Vì vậy, nếu đồng hồ và bằng cấp được gõ cả hai để tăng gấp đôi, mã "Meter x; Độ y; x = y;" biên dịch không có lỗi. –

+0

Tôi chưa từng tuyên bố khác. Nó tốt hơn nhiều nếu trình biên dịch có thể thực thi chính nó. Nhưng điều đó đòi hỏi nhiều mã hơn. Một giải pháp nhanh chóng và dễ dàng là làm cho nó hiển thị đối với HUMANS - xem bài viết được liên kết để biết thêm. –

+0

Đủ công bằng. Bạn có thể tránh gán ngẫu nhiên trực tiếp giữa các loại bằng cách sử dụng "class Meter {double _x; public: Meter (double x): _x (x) {}; toán tử double &() {return _x;}};" và tương tự cho Bằng cấp; nhưng điều này vẫn cho phép, ví dụ: "Mét x; Độ y; x = y + 5;". Điều này cũng có thể tránh được nhưng khó hơn. –

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