我读过 somewhere控制反转 (IoC) 是(某种)框架原则。
(利用这一点)说我为 X 设计了一个框架只是因为采用了 IoC 模式是否正确?
我可以要求一个最小的框架示例(请使用 C++ 代码)吗?
或者,我可以尝试更具体一些,提供一些代码(一个完整的 Qt 项目)并询问那里是否有框架。
FrameworkForX 类(下面,最后)可以称为框架吗?
框架.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
主要.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
小部件.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
小部件.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);
}
解决问题.h
#ifndef SOLVEMYPROBLEM_H
#define SOLVEMYPROBLEM_H
#include "frameworkforx.h"
class SolveMyProblem : public FrameworkForX
{
public:
SolveMyProblem();
int doSpecificJob(const QString &text);
};
#endif // SOLVEMYPROBLEM_H
解决问题.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);
}
最佳答案
您的示例接近框架。而且它接近国际奥委会。但在我看来,由于这部分的原因,这不是确切的模式:
Widget::Widget(QWidget*)
: ... solveMyProblem(new SolveMyProblem)
Widget
仍然可以控制其策略。它甚至构建它。因此,没有反转。适当的 IoC 实现将采取策略,例如作为参数。然后,要求基类或接口(interface)才有意义:
Widget::Widget(QWidget*, FrameworkForX* mySolver)
: ... solveMyProblem(mySolver)
//of course, the declaration of solveMyProblem has to be adapted
IoC 部分到此为止。让我们来到框架部分。框架的可能定义如下:
A framework is a software component with extension points and variation points.
软件组件可以是任何东西。它可以是一个类、一个库、一整套库……IoC 提供的是一个变点。您可以通过提供自定义实现来改变类(在本例中为 Widget
)的功能。您可以将该实现插入框架以构建功能齐全的软件组件(而框架通常只是一种骨架)。
所以:是的。在我看来,每个 IoC 实现都可以看作是一个框架。在您的具体示例中,框架将由 Widget
和 FrameworkForX
组成(其中 FrameworkForX
甚至可以只是一个接口(interface))。 SolveMyProblem
是插入此框架的自定义实现。
关于c++ - 极简框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32301963/