2012-04-01 33 views
5

Thật khó để tôi tìm kiếm chủ đề liên quan, vì vậy đây là câu hỏi của tôi. Tôi bắt đầu sử dụng Qt như hai ngày trước, và do đó tôi không có bất kỳ đầu mối nào làm cho nó hoạt động (ở phía mã).Qt - thiết kế mã ứng dụng thích hợp

[offtopic] Dưới đây là một số lịch sử: lúc đầu, tôi nghĩ đến việc tách logic của ứng dụng khỏi giao diện của nó. Tôi đã có một số lớp lõi, một số khác cho GUI (hiển thị và kiểm soát), và một số loại "cầu nối" giữa, ví dụ, di chuyển dữ liệu từ lớp A đã có std :: liệt kê các thành viên vào lớp B: public QAbstractListView, QStringList. Nhưng tôi đã từ bỏ, khi tôi đã phải sử dụng nhiều hơn và nhiều hơn nữa mã Qt (yêu cầu HTTP, đĩa I/O, regex). Mã của tôi bắt đầu trông giống như một mớ hỗn độn, tôi nghĩ về việc tái cấu trúc mã của tôi.

(Dù sao, nó là một ý tưởng tốt để kết hợp hai điều này? - ứng dụng logic vào Qt phụ) lớp() [/ Offtopic]

Và tôi đã đến một vấn đề khác và nó cuối cùng liên quan đến câu hỏi trong topic: là tốt hơn (nói, Qt-way), ví dụ, để có một lớp với QWebPage thành viên tư nhân và một số phương pháp công cộng, khe và tín hiệu để hoạt động trên nó hoặc đơn giản để thêm chức năng của tôi trong phân lớp của QWebPage?

+0

"Dù sao thì, nó là một ý tưởng tốt để kết hợp hai điều này - ứng dụng logic vào Qt (phụ) lớp học?" Tôi muốn nói không, nhưng tôi không có kinh nghiệm với Qt (hơn hai ngày). Tôi luôn luôn quản lý để làm điều này (QAbstractModel và bạn bè làm cho cầu nối giữa giao diện người dùng và mã bình thường), nhưng đối với các dự án lớn nó có thể không phải là lựa chọn tốt nhất. Ngoài ra, có vẻ như với tôi rằng các lớp Qt được thiết kế để dễ dàng phân lớp. –

Trả lời

3

Thừa kế là một trong những điều tuyệt vời nhất của OOP, nếu được sử dụng đúng cách.

Một "phân lớp", trong tất cả các thiết kế OO tốt, phải tuân thủ một quy tắc đơn giản: IS là con LOẠI cha mẹ? Điều đó thường được gọi là, trong văn học OOP, một mối quan hệ "là một". Và quan trọng hơn: đứa trẻ luôn làm hai việc: chuyên hành vi chung hoặc mở rộng chức năng của người cha. Tôi coi nó là một mùi mã khi một lớp con không làm.

Điều đó nói rằng, quyết định của bạn không liên quan gì đến Qt, hoặc với những gì tốt hơn hoặc kém hơn về mặt lập trình. Nó sẽ có ý nghĩa.

Một ví dụ: Nếu bạn đã có một QLabel rằng phải hiển thị số điểm của một trò chơi, và chỉ có vậy, nó có thể là một ý tưởng tốt để làm điều gì đó như

class MyScoreBoard : public QLabel 
{ 
private: 
    int scoreP1; 
    int scoreP2; 
    Game *_g; 
public: 
    MyScoreBoard(QWidget *parent = 0) : 
     QLabel(parent) 
    { 
     scoreP1 = 0; 
     scoreP2 = 0; 
     connect(_g, SIGNAL(scoreChanged(int,int)), this, SLOT(updateScore(int,int))); 
    } 
public slot: 
    updateScore(int a, int b) { 
     scoreP1 = a; 
     scoreP2 = b; 
     this->setText(QString::number(scoreP1) + "x" + QString::number(scoreP2)); 
    }; 

}; 

Mặt khác, nếu bạn bảng điểm có một số đèn trên đầu, nó sẽ nhấp nháy bất cứ khi nào điểm số thay đổi, nếu nó có một nhãn cho mỗi người chơi, điều đó phải thay đổi màu sắc tùy thuộc vào điểm số, thì tốt hơn nên tạo một lớp ScoreBoard mà HAD hai nhãn, HAD hai đèn, và sau đó thực hiện các hành vi dự định.

Điểm mấu chốt là: thừa kế nếu nó có ý nghĩa trên thiết kế của bạn

Wikipedia has a good small article about an anti-pattern that appears when inheritance is used without care.

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