c++ - 极简框架

标签 c++ design-patterns frameworks

我读过 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 实现都可以看作是一个框架。在您的具体示例中,框架将由 WidgetFrameworkForX 组成(其中 FrameworkForX 甚至可以只是一个接口(interface))。 SolveMyProblem 是插入此框架的自定义实现。

关于c++ - 极简框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32301963/

相关文章:

c++ - 如何在 C++ 中重置函数的静态变量

c++ - 如何更改 C++ 中的文件内容?

c# - 为什么将设计模式分为三部分?

c# - 使用 C# Action 委托(delegate)实现命令模式

c++ - 检索远程 pc Qt C++ 的 mac 地址

c++ - 是否可以在 VS2013 中轻松地重新组织 C++ 函数?

ios - 迦太基 Xcode 9 错误

ios - 将我的 Obj-C 框架与 Swift 框架联系起来

javascript - 揭示模块模式问题

frameworks - 框架时代的封装