我已经阅读somewhere控制反转(IoC)是(一种)框架的原则。
是否正确(利用这一点)说我为X设计了一个框架,因为采用了IoC模式?
请问一个最小的框架示例(请使用C ++代码)?
或者,我可以尝试更具体,提供一些代码(一个完整的Qt项目)并询问是否有框架。
FrameworkForX类(下面,最后)可能被称为框架?
framework.pro
Variant HHVM_METHOD(MyClass1, get) {
Object ob{Unit::loadClass(s_MyClass2.get()};
ob.o_set(s_PropertyName1, value1, s_MyClass2 );
ob.o_set(s_PropertyName1, value2, s_MyClass2 );
return ob;
}
的main.cpp
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
widget.h
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
widget.cpp
#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
solvemyproblem.h
#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.cpp
#ifndef SOLVEMYPROBLEM_H
#define SOLVEMYPROBLEM_H
#include "frameworkforx.h"
class SolveMyProblem : public FrameworkForX
{
public:
SolveMyProblem();
int doSpecificJob(const QString &text);
};
#endif // SOLVEMYPROBLEM_H
frameworkforx.h
#include "solvemyproblem.h"
SolveMyProblem::SolveMyProblem()
{
}
int SolveMyProblem::doSpecificJob(const QString &text)
{
int i = text.size();
return i;
}
frameworkforx.cpp
#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
答案 0 :(得分:1)
您的示例接近框架。它接近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实现都可以看作是一个框架。在您的具体示例中,框架由Widget
和FrameworkForX
组成(其中FrameworkForX
甚至可以只是一个接口)。 SolveMyProblem
是一个插入此框架的自定义实现。