2013-02-14 63 views
6

Đây có thể không phải là câu hỏi cụ thể đối với C++ và nhiều hơn nữa để làm với lập trình hướng đối tượng. Tôi mới đến điều này và tôi nghi ngờ về thiết kế của mình. Tôi có một lớp học Trình phân tích cú pháp về cơ bản thực hiện nhiều chức năng xử lý phân tích cú pháp biểu thức, chuyển đổi từ mã nhúng sang postfix, v.v. Tôi sử dụng các hàm Phân tích cú pháp này trong chức năng chính. Tôi nhận ra rằng tôi không cần bất kỳ thành viên dữ liệu nào cho lớp này. Do đó, tôi không thực sự cần một đối tượng của lớp này. Do đó, tôi đã làm cho mọi hàm tĩnh trong lớp. Có điều gì lạ về thiết kế này không. Tôi có nên sử dụng giao diện này thay thế không? Bất kỳ đề xuất?Lớp không có thành viên dữ liệu trong C++

+6

Nói chung, trong C++ người ta sẽ đặt các hàm không phải thành viên bên trong một không gian tên. Không cần lớp cho các hàm nhóm như thế này. – juanchopanza

+1

Nếu bạn chỉ có một Trình phân tích cú pháp, một không gian tên sẽ làm. Nếu bạn có Parser1 và Parser2 và muốn có thể sử dụng một trong hai, thiết kế này là một cách hợp lý để làm điều đó. –

+0

Tại sao không phải hai không gian tên khác nhau trong trường hợp đó? – user592748

Trả lời

6
  1. Bạn muốn trình phân tích cú pháp và bạn biết bạn muốn làm gì bạn - điều này có hiệu lực, "giao diện" của bạn.

  2. Thực hiện hiện tại của trình phân tích cú pháp không cần bất kỳ biến thành viên nào - do đó, để triển khai giao diện, bạn không cần một lớp. Vì vậy, có, làm đi với các phương pháp tĩnh của bạn. Giống như Kevin nói, sử dụng một không gian tên với các hàm cũ đơn giản (không tĩnh) là một ý tưởng tuyệt vời.

  3. Nếu bạn cảm thấy cần thêm một trình phân tích cú pháp mới cần duy trì trạng thái bên trong, thì bạn có thể muốn định nghĩa một giao diện trong (1) - một tệp tiêu đề có thể nhìn thấy công khai cũ với các khai báo hàm bên trong một không gian tên của sự lựa chọn của bạn là đủ.

+0

Cảm ơn. Điều đó xóa nó lên. Thumbs up để làm rõ ý nghĩa của giao diện và giải thích làm thế nào để đối phó với trường hợp thứ 2. – user592748

+0

Bạn được chào đón. Vui mừng được giúp đỡ. – Carl

+0

Phương thức tĩnh không thể được gọi từ hàm tạo của đối tượng cha một cách tự động. – peterh

6

Lớp học không có gì ngoài chức năng tĩnh có vẻ không thể phân biệt được với không gian tên đối với tôi. Vì vậy, tại sao không chỉ sử dụng một không gian tên?

+0

Bạn không chắc chắn tầm quan trọng của việc này, nhưng bạn không thể giả lập một không gian tên (trong các khung mocking mà tôi biết). –

+0

Không, một lớp không có thành viên dữ liệu _can_ có một hàm tạo. – peterh

+1

Một hàm tạo không thú vị bởi vì nó không khác gì một hàm tĩnh khác. Một destructor có thể là thú vị, nhưng một destructor thú vị có thể cần ít nhất một thành viên dữ liệu boolean để ghi lại xem lớp đã được di chuyển chưa (và do đó liệu destructor không nên làm bất cứ điều gì thú vị nó sẽ làm). –

0

Việc tạo các hàm tiện ích tĩnh là bình thường, vì vậy, nếu các hàm của lớp Parser của bạn không dựa vào nhau, bạn hoàn toàn có thể làm cho chúng tĩnh. Nếu họ dựa vào nhau và có thể các chức năng tương tự có thể được thực hiện theo cách khác, bạn nên cân nhắc sử dụng giao diện

1

Cách để quyết định câu hỏi này là cách sử dụng các chức năng?

1) Nếu tất cả các chức năng được sử dụng trong một tệp và không cần xuất ở bất kỳ đâu, thì chắc chắn sử dụng các hàm tĩnh. Tại sao? Bởi vì bạn có thể chỉ cần gõ chúng trực tiếp vào phần thân của lớp trong tệp .cpp và bạn không phải lo lắng về việc duy trì các khai báo và giữ các tham số được căn chỉnh. Bởi vì khi một lớp C++ được phân tích tất cả các mã bên trong mỗi hàm được định nghĩa bên trong thân lớp được bỏ qua và sau đó phân tích cú pháp khi tất cả các thành viên của lớp đã được khai báo, vì vậy các hàm có thể nhìn thấy nhau và đang ở trong tình trạng tên tốt hơn. cũng sẽ nội tuyến rất nhiều các hàm nhỏ hơn nếu bạn khai báo chúng trực tiếp trong lớp như thế.

2) Nếu các chức năng cần được sử dụng từ bên ngoài tệp .cpp hiện tại, hãy sử dụng các chức năng bình thường. Bởi vì sau này họ có thể được sử dụng từ bất cứ nơi nào khác và xuất khẩu chúng theo tên dễ dàng hơn.

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