极简主义的框架

Minimalist framework

本文关键字:框架      更新时间:2023-10-16

我在某处读到控制反转(IoC)是(某种)框架的原则。

(利用这一点)说我为X设计了一个框架只是因为使用了IoC模式,这是正确的吗?

我可以问一个最小的框架的例子(c++代码请)?

或者相反,我可以尝试更具体,提供一些代码(一个完整的Qt项目),并询问是否有一个框架。

类FrameworkForX(在下面,在最后)可能被称为框架?

framework.pro

QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = framework
TEMPLATE = app
SOURCES += main.cpp
        widget.cpp 
    frameworkforx.cpp 
    solvemyproblem.cpp
HEADERS  += widget.h 
    frameworkforx.h 
    solvemyproblem.h

main.cpp

#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
class QLineEdit;
class QLabel;
class SolveMyProblem;
class Widget : public QWidget
{
    Q_OBJECT
public:
    Widget(QWidget *parent = 0);
    ~Widget();
private:
    QLineEdit *lineEdit;
    QLabel *label;
    SolveMyProblem *solveMyProblem;
public slots:
    void doit();
    void onResult(int result);
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "QVBoxLayout"
#include "QPushButton"
#include "QLineEdit"
#include "QLabel"
#include "solvemyproblem.h"
Widget::Widget(QWidget *parent)
    : QWidget(parent), solveMyProblem(new SolveMyProblem)
{
    QVBoxLayout *vLayout = new QVBoxLayout(this);
    lineEdit = new QLineEdit;
    vLayout->addWidget(lineEdit);
    QPushButton *bt = new QPushButton("Do It!");
    connect(bt, &QPushButton::clicked, this, &Widget::doit);
    vLayout->addWidget(bt, 1, Qt::AlignRight);
    label = new QLabel("The result will be shown here.");
    connect(solveMyProblem, &SolveMyProblem::result, this, &Widget::onResult);
    vLayout->addWidget(label);
    resize(400, 100);
    setWindowTitle("Is it (FrameworkForX) a framework?");
}
Widget::~Widget()
{
}
void Widget::doit()
{
    QString text = lineEdit->text();
    solveMyProblem->doSomething(text);
}
void Widget::onResult(int result)
{
    QString text = QString::number(result);
    label->setText(text);
}

solvemyproblem.h

#ifndef SOLVEMYPROBLEM_H
#define SOLVEMYPROBLEM_H
#include "frameworkforx.h"
class SolveMyProblem : public FrameworkForX
{
public:
    SolveMyProblem();
    int doSpecificJob(const QString &text);
};
#endif // SOLVEMYPROBLEM_H

solvemyproblem.cpp

#include "solvemyproblem.h"
SolveMyProblem::SolveMyProblem()
{
}
int SolveMyProblem::doSpecificJob(const QString &text)
{
    int i = text.size();
    return i;
}

frameworkforx.h

#ifndef FRAMEWORKFORX_H
#define FRAMEWORKFORX_H
#include "QObject"
class QString;
class FrameworkForX : public QObject
{
    Q_OBJECT
public:
    FrameworkForX();
    void doSomething(const QString &text);
protected:
    virtual int doSpecificJob(const QString &text) = 0;
signals:
    void result(int i);
};
#endif // FRAMEWORKFORX_H

frameworkforx.cpp

#include "frameworkforx.h"
FrameworkForX::FrameworkForX()
{
}
void FrameworkForX::doSomething(const QString &text)
{
    int value = doSpecificJob(text);
    emit result(value);
}

您的示例接近于框架。它接近IoC。但在我看来,这不是确切的模式,因为这一部分:

Widget::Widget(QWidget*)
: ... solveMyProblem(new SolveMyProblem)

Widget仍然对其策略有控制权。它甚至构建了它。因此,没有反转。适当的IoC实现应该将策略例如作为参数。那么,只有要求基类或接口才有意义:

Widget::Widget(QWidget*, FrameworkForX* mySolver)
: ... solveMyProblem(mySolver) 
//of course, the declaration of solveMyProblem has to be adapted

到目前为止,对于IoC部分。让我们来看看框架部分。框架的可能定义如下:

框架是一个具有扩展点和变异点的软件组件。

软件组件可以是任何东西。它可以是一个类,一个库,一整套库……IoC提供的是一个变化点。您可以通过提供自定义实现来改变类的功能(在本例中是Widget)。您可以将该实现插入框架以构建功能齐全的软件组件(而框架通常只是一种骨架)。

:是的。在我看来,每个IoC实现都可以看作是一个框架。在您的具体示例中,框架将由WidgetFrameworkForX组成(其中FrameworkForX甚至可能只是一个接口)。SolveMyProblem是插入到这个框架中的自定义实现。