Để làm cho mã của bạn được ghép lỏng lẻo ở đây là một số điều đơn giản cần nhớ:
Phần 1:
Về mặt kỹ thuật được gọi là "Tách mối quan tâm". Mỗi lớp có một vai trò cụ thể, cần xử lý logic nghiệp vụ hoặc logic ứng dụng. Hãy cố gắng và tránh xa lớp học kết hợp cả hai trách nhiệm. tức là Một lớp quản lý dữ liệu (thuật ngữ rộng) là logic ứng dụng trong khi một lớp sử dụng dữ liệu là logic nghiệp vụ.
Cá nhân tôi đề cập đến điều này (trong thế giới nhỏ bé của riêng tôi) như create it or use it
. Một lớp nên tạo một đối tượng hoặc sử dụng một đối tượng mà nó không bao giờ nên làm cả hai.
Phần 2:
Làm thế nào để thực hiện tách mối quan tâm.
Là một điểm khởi đầu, có hai kỹ thuật đơn giản:
Lưu ý: Các mẫu thiết kế không tuyệt đối.
Chúng được cho là tùy chỉnh theo tình huống nhưng có một chủ đề cơ bản tương tự như tất cả các ứng dụng. Vì vậy, đừng nhìn vào các ví dụ dưới đây và nói rằng tôi phải tuân theo điều này một cách cứng nhắc; đây chỉ là những ví dụ (và hơi giả tạo ở đó).
Phụ thuộc tiêm :
Đây là nơi bạn vượt qua trong một đối tượng mà một lớp sử dụng. Đối tượng mà bạn truyền vào dựa trên một giao diện để lớp của bạn biết phải làm gì với nó nhưng không cần biết triển khai thực tế.
class Tokenizer
{
public:
Tokenizer(std::istream& s)
: stream(s)
{}
std::string nextToken() { std::string token; stream >> token;return token;}
private:
std::istream& stream;
};
Ở đây chúng tôi tiêm luồng vào Tokenizer. Mã thông báo không biết loại luồng nào miễn là nó thực hiện giao diện của std :: istream.
Mẫu định vị dịch vụ :
Mẫu định vị dịch vụ là một biến thể nhỏ của tiêm phụ thuộc. Thay vì đưa ra một đối tượng mà nó có thể sử dụng, bạn truyền cho nó một đối tượng biết cách định vị (tạo) đối tượng bạn muốn sử dụng.
class Application
{
public:
Application(Persister& p)
: persistor(p)
{}
void save()
{
std::auto_ptr<SaveDialog> saveDialog = persistor.getSaveDialog();
saveDialog.DoSaveAction();
}
void load()
{
std::auto_ptr<LoadDialog> loadDialog = persistor.getLoadDialog();
loadDialog.DoLoadAction();
}
private:
Persister& persistor;
};
Ở đây chúng ta truyền đối tượng ứng dụng một đối tượng điện trở. Khi bạn thực hiện một hành động lưu / tải, nó sử dụng điện trở để tạo ra một đối tượng thực sự biết cách thực hiện hành động đó. Lưu ý: Một lần nữa, điện trở là một giao diện và bạn có thể cung cấp các cài đặt khác nhau tùy theo tình huống.
Điều này hữu ích khi một potentially
đối tượng duy nhất được yêu cầu mỗi khi bạn khởi tạo một hành động.
Cá nhân tôi thấy điều này đặc biệt hữu ích trong việc viết bài kiểm tra đơn vị.
Lưu ý về mẫu:
Các mẫu thiết kế là một chủ đề rất lớn đối với chính nó. Đây không phải là một danh sách các mẫu độc quyền mà bạn có thể sử dụng để trợ giúp với khớp nối lỏng lẻo; đây chỉ là một điểm khởi đầu phổ biến
Với kinh nghiệm bạn sẽ nhận ra bạn đã sử dụng các mẫu này, chỉ là bạn không sử dụng tên chính thức của chúng. Bằng cách tiêu chuẩn hóa tên của họ (và khiến mọi người tìm hiểu chúng), chúng tôi thấy rằng việc truyền đạt ý tưởng thật dễ dàng và nhanh chóng hơn.