6. バリデーション

今回は、POCOのバリデーションを詳解します。
POCOで用意されているバリデーションはコマンドラインオプションの入力値のバリデーションで、intと正規表現の2種類のバリデーションが提供されています。
オプションは、エラーメッセージに使われているだけなので、HTMLフォームのバリデーションに使うこともできます。ただ、実際のアプリケーションでは、エラーメッセージ体系を独自に決めるでしょうから、POCOの実装を参考にして自作することになると思います。
簡単なバリデーションのサンプルコードは以下のようになります。

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include "Poco/Util/RegExpValidator.h"
#include "Poco/Util/IntValidator.h"
#include "Poco/Util/Option.h"
#include "Poco/Util/OptionException.h"
#include "Poco/AutoPtr.h"
#include "Poco/Util/Application.h"
#include "Poco/Util/OptionSet.h"
#include "Poco/Util/HelpFormatter.h"
#include "Poco/Util/AbstractConfiguration.h"
#include <iostream>
using Poco::Util::Validator;
using Poco::Util::RegExpValidator;
using Poco::Util::IntValidator;
using Poco::Util::Option;
using Poco::Util::InvalidArgumentException;
using Poco::AutoPtr;
using Poco::Util::Application;
using Poco::Util::OptionSet;
using Poco::Util::HelpFormatter;
using Poco::Util::AbstractConfiguration;
using Poco::Util::OptionCallback;
class ValidatorSample: public Application
    /// This sample demonstrates some of the features of the Poco::Util::Validator class.
{
public:
    ValidatorSample(): _helpRequested(false)
    {
    }
protected:
    void initialize(Application& self)
    {
        loadConfiguration(); // load default configuration files, if present
        Application::initialize(self);
        // add your own initialization code here
    }
    void uninitialize()
    {
        // add your own uninitialization code here
        Application::uninitialize();
    }
    void reinitialize(Application& self)
    {
        Application::reinitialize(self);
        // add your own reinitialization code here
    }
    void defineOptions(OptionSet& options)
    {
        Application::defineOptions(options);
        options.addOption(
            Option("help", "h", "display help information on command line arguments")
                .required(false)
                .repeatable(false)
                .callback(OptionCallback<ValidatorSample>(this, &ValidatorSample::handleHelp)));
    }
    void handleHelp(const std::string& name, const std::string& value)
    {
        _helpRequested = true;
        displayHelp();
        stopOptionsProcessing();
    }
    void handleConfig(const std::string& name, const std::string& value)
    {
        loadConfiguration(value);
    }
    void displayHelp()
    {
        HelpFormatter helpFormatter(options());
        helpFormatter.setCommand(commandName());
        helpFormatter.setUsage("OPTIONS");
        helpFormatter.setHeader("A PropertySample application that demonstrates how to use Poco::Util::PropertyFileConfiguration.");
        helpFormatter.format(std::cout);
    }
    int main(const std::vector<std::string>& args)
    {
        if (!_helpRequested)
        {
            // 正規表現でバリデーションします。
            Option strField("string field", "s");
            AutoPtr<Validator> pRegVal(new RegExpValidator("[0-9]+"));
            pRegVal->validate(strField, "0");
            pRegVal->validate(strField, "12345");
            try
            {
                pRegVal->validate(strField, "234asdf");
            }
            catch (InvalidArgumentException& exc)
            {
                std::cout << exc.message() << std::endl;
            }
            // 整数(最大値、最小値)でバリデーションします。
            Option intField("integer field", "i");
            AutoPtr<Validator> pIntVal(new IntValidator(0, 100));
            pIntVal->validate(intField, "0");
            pIntVal->validate(intField, "100");
            pIntVal->validate(intField, "55");
            try
            {
                pIntVal->validate(intField, "-1");
            }
            catch (InvalidArgumentException& exc)
            {
                std::cout << exc.message() << std::endl;
            }
            try
            {
                pIntVal->validate(intField, "101");
            }
            catch (InvalidArgumentException& exc)
            {
                std::cout << exc.message() << std::endl;
            }
            try
            {
                pIntVal->validate(intField, "asdf");
            }
            catch (InvalidArgumentException& exc)
            {
                std::cout << exc.message() << std::endl;
            }
        }
        return Application::EXIT_OK;
    }
private:
    bool _helpRequested;
};
POCO_APP_MAIN(ValidatorSample)

Comments are closed.