2009-07-17 16 views
13

Vì vậy, tôi có một lớp học. Đó là một lớp học hữu ích. Tôi thích rất nhiều. Hãy gọi nó là MyUsefulClass. MyUsefulClass có phương pháp công khai. Hãy gọi nó là processUsefulData(std::vector<int>&).có nên sử dụng chức năng trợ giúp của lớp C++ không? Là thành viên, miễn phí, hoặc không gian tên anon?

Bây giờ giả sử processUsefulData thực sự hai điều và tôi muốn cấu trúc lại nó từ này:

std::vector<int> MyUsefulClass::processUsefulData(std::vector<int>& data) 
{ 
    for (/*...*/) 
    { 
     for (/*...*/) 
     { 
      // a bunch of statements... 
     } 
    } 

    for (/*...*/) 
    { 
     for (/*...*/) 
     { 
      // a bunch of other statements... 
     } 
    } 
    return data; 
} 

Bây giờ, tôi muốn chia những trách nhiệm này và viết lại các mã như

std::vector<int> MyUsefulClass::processUsefulData(std::vector<int>& data) 
{ 
    doProcessA(data, dataMember_); 
    doProcessB(data, otherDataMember_); 
    return data; 
} 

Vì vậy, tôi không biết nếu tôi nên làm cho hai chức năng trợ giúp miễn phí chức năng hoặc chức năng thành viên, và khi mỗi sẽ là thích hợp. Tôi cũng không biết liệu tốt hơn là làm cho họ trong một không gian tên vô danh hay không. Có ai biết thời gian tốt để làm điều này?

+0

Việc tổng quát như thế này sẽ không giúp bạn có được câu trả lời hay. Mỗi tình huống phụ thuộc vào những gì bạn đang làm. –

Trả lời

7

miễn phí chức năng/chức năng thành viên

tôi sẽ làm cho họ chức năng miễn phí có thể (họ không cần truy cập vào bên trong của lớp).Nếu họ làm việc trên một tập hợp các thuộc tính hoặc cần quyền truy cập vào các thành viên khác thì hãy biến nó thành một hàm thành viên.

Truy cập

Nếu mã chỉ có ý nghĩa trong phạm vi này, và sẽ không được sử dụng từ mã khác sau đó làm cho họ tin: private nếu nó là một thành viên, hoặc thực hiện trong một không gian tên vô danh nếu nó là một chức năng miễn phí.

Nếu mã khác sẽ được hưởng lợi từ việc sử dụng mã, hãy xuất bản mã đó trong giao diện. Điều đó có nghĩa là làm cho nó được bảo vệ nếu nó là một thành viên hoặc có chức năng miễn phí có thể truy cập thông qua một tiêu đề trong một không gian tên được đặt tên (hoặc không gian tên chung).

3

Tôi thường làm cho chúng protected hoặc private chức năng thành viên. Nó sẽ phụ thuộc vào việc bạn có kế hoạch bắt đầu lớp và ghi đè các chức năng hay không.

Nếu chúng là các hàm phổ biến mà chúng được sử dụng trong các lớp khác, hãy chuyển chúng sang các hàm tĩnh chứa trong một lớp chung hoặc một đối tượng riêng biệt mà lớp của bạn sử dụng.

0

Suy nghĩ về phạm vi. Những chức năng đó sẽ được sử dụng trong lớp khác hay ở nơi khác? Họ có nên gọi công khai không?

Có vẻ như chúng phải là các hàm thành viên riêng tư đối với tôi, nhưng tất cả đều phụ thuộc vào cấu trúc phạm vi tổng thể của bạn.

2

Luôn thích các chức năng miễn phí hơn các thành viên. Xem câu trả lời của tôi here để biết lý do.

+0

Thực ra câu trả lời khác của bạn không chứa lời giải thích trực tiếp ;-) – Simson

+2

@Simson - Ngạc nhiên thay, nó chỉ người đọc vào [bài đăng blog này] (http://www.gotw.ca/publications/mill08.htm), sau đó đề cập đến người đọc trở lại [bài đăng trước này] (http://www.gotw.ca/publications/mill02.htm). May mắn cho sự tỉnh táo của chúng tôi, bài đăng đó không giới thiệu cho chúng tôi trở lại bài đăng SO này (mặc dù nó có tham chiếu tới bài đăng trên blog đầu tiên). –

0

Chức năng thành viên chắc chắn nếu hàm ban đầu có ý nghĩa như một hàm thành viên.

IMHO riêng tư/được bảo vệ phụ thuộc vào cách chức năng của chúng được sử dụng: nếu hoạt động của hàm ban đầu vẫn được yêu cầu và trình tái cấu trúc chỉ làm cho mã sạch hơn, sau đó bảo vệ chúng hoặc bảo mật và gọi chúng từ chức năng thông thường. Bạn có được trình cấu trúc lại nhưng giữ nguyên giao diện công khai của lớp đó theo cách đó.

2

Thực tế là bạn đề cập đến các chức năng miễn phí khiến tôi tin rằng 'nhóm các câu lệnh khác' không yêu cầu quyền truy cập vào dữ liệu lớp học. Nếu có, hãy miễn phí. Điều này làm giảm độ phức tạp của tiêu đề lớp của bạn, cộng với các hàm miễn phí dễ sử dụng hơn trong các thuật toán chuẩn (có thể là std :: for_each vì bạn đang làm việc với các vectơ?).

10

Tôi thường làm cho các thói quen trợ giúp "thói quen" miễn phí trong một không gian tên an toàn nếu có thể. Bằng cách đó, tôi không làm phức tạp giao diện (tắt trong tệp * .h) với những thứ mà khách hàng không cần phải lo lắng.

Tuy nhiên, bạn phải cẩn thận rằng bạn không giới thiệu không reentrancy bằng cách làm điều đó. Ví dụ, bằng cách sửa đổi các đối tượng dữ liệu toàn cục hoặc các địa phương tĩnh hơn là các thành viên lớp. Nếu bạn cần làm điều đó, bạn nên làm cho nó trở thành một thành viên lớp học thích hợp.

+0

+1 Điểm tốt để giữ giao diện sạch sẽ! – math

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