2012-01-30 17 views
9

Vì vậy, giả sử tôi có một vài chức năng để xử lý việc mở/đóng tệp.Không gian tên hoặc lớp, tốt hơn cho việc đóng gói chỉ các thành viên chức năng

Tốt hơn là tạo một lớp với tất cả các hàm này được khai báo tĩnh hoặc chỉ cần đặt hàm "công khai" vào tệp tiêu đề của "không gian tên" và đặt "chi tiết triển khai" còn lại trong tệp .cc?

Dưới đây là các mẫu mã.

Đó là một chút dài cho không gian tên một, vì tôi muốn làm cho nó rõ ràng nhất có thể.

THANKS !!


thi lớp

Tiêu đề:

#ifndef FILE_H 
#define FILE_H 

#include <iostream> 
#include <fstream> 

include "common.h" 

enum Errorcode { 
    FILE_CANNOT_OPEN, 
    FILE_CANNOT_CLOSE 
}; 

class file { 

public: 
    static common::Lines toLines(std::string filename); 

private: 
    static void err(Errorcode e, std::string msg); 
    static void toLines(std::ifstream &ifs, common::Lines &lines); 

}; 

#endif 

.cc file:

/*just the implementation details of above class.*/ 

namespace thực hiện

Tiêu đề:

0.123.
#ifndef FILE_H 
#define FILE_H 

#include <iostream> 
#include <fstream> 

#include "common.h" 

namespace file { 

common::Lines toLines(std::string filename); 

} 

#endif  

.cc file:

namespace file { 

enum Errorcode { 
    FILE_CANNOT_OPEN, 
    FILE_CANNOT_CLOSE 
}; 

void err(Errorcode e, std::string msg); 
void toLines(std::ifstream& ifs, common::Lines &lines); 

common::Lines toLines(std::string filename) 
{ 
    std::vector<std::string> lines; 

    try { 
     std::ifstream ifs(filename.c_str()); 
     if (ifs.fail()) throw FILE_CANNOT_OPEN; 

     toLines(ifs, lines); 

     ifs.close(); 
     if (ifs.fail()) throw FILE_CANNOT_CLOSE; 
    } 
    catch (Errorcode e) { 
     err(e, filename); 
    } 

    return lines; 
} 

void err(Errorcode e, std::string msg) 
{ 
    switch (e) { 
     default: 
      std::cerr << "Unknown error.\n"; 
      break; 
     case FILE_CANNOT_OPEN:   
      std::cerr << "file \"" << msg 
       << "\" could not be opened.\n"; 
      break; 
     case FILE_CANNOT_CLOSE:   
      std::cerr << "file \"" << msg 
       << "\" could not be closed.\n"; 
      break; 
    } 
    std::exit(-1); 
} 

void toLines(std::ifstream& ifs, common::Lines &lines) 
{ 
    std::string line; 

    while(std::getline(ifs, line)) { 
     lines.push_back(line); 
    } 

    ifs.clear(); // clear error bit set by getline() 
} 

}      
+0

Dù bằng cách nào cũng có thể hoạt động khá tốt, nhưng không gian tên là kiểu C++ phổ biến hơn. –

Trả lời

10

Bề ngoài, chức năng lớp tĩnh và chức năng namespaced gần như giống hệt nhau, và thực sự các lớp học đã được sử dụng trong những ngày đầu trước khi hỗ trợ namespace đã trở thành phổ biến.

Ngày nay, bạn nên làm những gì thể hiện hầu hết cấu trúc lôgic (tức là mô hình tinh thần) của chương trình của bạn. Nếu bạn đang nhóm các hàm liên quan, đó là một vùng tên. Tuy nhiên, sự khác biệt về mặt kỹ thuật trong tóm tắt là các không gian tên tham gia tra cứu phụ thuộc vào đối số (ADL), trong khi các hàm thành viên lớp không, nhưng các lớp có thể được chuyển thành các khuôn mẫu và chuyên biệt. Nếu bất kỳ sự khác biệt ngữ nghĩa nào quan trọng đối với bạn, thì việc xem xét đó có thể giúp bạn đưa ra lựa chọn đúng đắn.

+0

i dunno ADL là gì ... lolz, tôi đang googling nó ngay bây giờ –

+2

+1 cho ADL. Tôi bỏ lỡ điều đó. –

+4

@BeyondSora: Ở đây bạn đi: [ADL - Koenig Lookup] (http://stackoverflow.com/questions/8111677/detailed-explanation-on-how-koenig-lookup-works-with-namespaces-and-why-its -a-go) –

-1

Khi oop ngày càng trở nên phổ biến, Class là lựa chọn tốt hơn khi bạn phát triển một dự án nhỏ chỉ với 1 lập trình viên. Khi bạn phát triển một ứng dụng phức tạp, kết hợp lớp và không gian tên là tốt hơn.

+7

Bài đăng này mang tính suy đoán, chủ quan, trong phần lớn tiểu thuyết, và phần còn lại là suy nghĩ mơ ước. –

+4

Có, các lớp học rất tốt cho lập trình hướng đối tượng vì chúng mô hình hóa các đối tượng. Nhưng câu hỏi cụ thể nói rằng ông có một tập hợp các chức năng liên quan mà chỉ cần được đóng gói, không phải là họ mô hình hóa một đối tượng. Anh ta hỏi nếu một lớp tĩnh hoặc một không gian tên là tốt hơn. Không có gì đặc biệt là OOP về một lớp tĩnh, và trong trường hợp này, việc sử dụng một không gian tên có lẽ là một lựa chọn tốt hơn. Tôi không có ý tưởng tại sao nó quan trọng nếu nó là một ứng dụng đơn giản hoặc phức tạp; thiết kế tốt là thiết kế tốt, cho dù đó là đơn giản hay phức tạp, một lập trình viên hoặc một nghìn. –

+1

Làm thế nào oop ngày càng trở nên phổ biến hơn? Không phải sự nổi tiếng của nó có phần nào đã được cân bằng trong 10 năm qua hay một cái gì đó, và thậm chí từ chối với việc áp dụng các tính năng chức năng vào các ngôn ngữ chính thống? – fredoverflow

5

Có một câu hỏi đơn giản bao gồm hầu hết các tình huống: Nếu bạn đã biến nó thành một lớp, một thể hiện của lớp đó có ý nghĩa và thực hiện điều gì đó hữu ích không?

Nếu thể hiện hữu ích, thì bạn muốn có một lớp học. Nếu không, một không gian tên có lẽ là một lựa chọn tốt hơn.

+2

trong trường hợp của tôi sẽ không có nhu cầu cho một instnace. Vì vậy, có vẻ như không gian tên là một đối với tôi. –

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