第5回 解答例

const・名前空間・オーバーロード

演習の解答例。まず自分で書いてから読むこと。

1. constでマジックナンバーを排除する

修正前:

if (analogRead(6) > 2000) {
    analogWrite(24, 128);
}

修正後:

const int SENSOR_PIN = 6;
const int MOTOR_PIN = 24;
const int SENSOR_THRESHOLD = 2000;
const int MOTOR_HALF = 128;

if (analogRead(SENSOR_PIN) > SENSOR_THRESHOLD) {
    analogWrite(MOTOR_PIN, MOTOR_HALF);
}

34や2000が何の数字なのかが名前から分かる。配線を変えたときも1か所直せばよい。

2. 名前空間にまとめる

Sensor.hpp
namespace Sensor {
const int PIN = 6;
const int THRESHOLD = 2000;

void begin();
int read();
bool isNear();
}
Sensor.cpp
#include <Arduino.h>

#include "Sensor.hpp"

namespace Sensor {
void begin() {
    pinMode(PIN, INPUT);
}

int read() {
    return analogRead(PIN);
}

bool isNear() {
    return read() > THRESHOLD;
}
}

使う側:

Sensor::begin();

if (Sensor::isNear()) {
    // ...
}

3. 関数オーバーロード

int add(int a, int b) {
    return a + b;
}

float add(float a, float b) {
    return a + b;
}

void setup() {
    Serial.begin(115200);

    Serial.println(add(1, 2));          // int版が呼ばれる → 3
    Serial.println(add(1.5f, 2.5f));    // float版が呼ばれる → 4.00
}

引数の型で呼び分けられる。呼ぶ側はaddという1つの名前を覚えればよい。

→ 第5回の本文に戻る