首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >极简主义框架

极简主义框架
EN

Stack Overflow用户
提问于 2015-08-30 22:57:24
回答 1查看 120关注 0票数 0

我读过某处,控制反转(IoC)是一种框架原理。

仅仅因为使用了IoC模式,我就为X设计了一个框架(利用这个优势),这是正确的吗?

我可以要求一个最小的框架示例(C++代码吗)?

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

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

framework.pro

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

widget.h

代码语言:javascript
运行
复制
#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

代码语言:javascript
运行
复制
#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

代码语言:javascript
运行
复制
#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

代码语言:javascript
运行
复制
#include "solvemyproblem.h"

SolveMyProblem::SolveMyProblem()
{

}

int SolveMyProblem::doSpecificJob(const QString &text)
{
    int i = text.size();
    return i;
}

frameworkforx.h

代码语言:javascript
运行
复制
#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

代码语言:javascript
运行
复制
#include "frameworkforx.h"

FrameworkForX::FrameworkForX()
{

}

void FrameworkForX::doSomething(const QString &text)
{
    int value = doSpecificJob(text);
    emit result(value);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-01 19:51:22

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

代码语言:javascript
运行
复制
Widget::Widget(QWidget*)
: ... solveMyProblem(new SolveMyProblem)

Widget仍然控制着它的战略。它甚至建造了它。因此,没有反演。适当的IoC实现将策略(例如,作为参数)接受。然后,只需要基类或接口:

代码语言:javascript
运行
复制
Widget::Widget(QWidget*, FrameworkForX* mySolver)
: ... solveMyProblem(mySolver) 
//of course, the declaration of solveMyProblem has to be adapted

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

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32301963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档