🔖

組み込みソフトウェアを想定したC言語でのobserver

に公開

概要

C言語をオブジェクト指向で書くメリットの1つとしてあるobserverを組み込み向けに書いてみました。
これが本当にメリットかどうかはまだ不明ですので他のメリットや書き方などあればご教授お願い致します。

observerとは

「観察者」「傍聴者」「立会人」などを意味し、特にビジネスシーンでは、会議や研修に発言権や決定権を持たずに参加し、その内容を傍で見守る役割を持つ人を指すらしいです。(AIによる概要より)
つまり文字の通りプログラム上でも実行権限を持たせずにただ通知をするだけの役割を担います。
通知をするだけのためmain内の処理を複雑にせずに様々な動作パターンを定義することができます。

ソースコード

https://github.com/begengineer/modanC/blob/main/observer/main.c

コード説明

今回は温度センサを想定してobserverを実装してみました。
温度を取得したときの動作を記載しています。

  1. observer構造体の作成
    TempObserverが温度取得時の実際の処理、TempSensorがobserver登録用構造体です。
typedef struct {
    void (*update)(float temperature);
} TempObserver;

typedef struct {
    TempObserver *observers[MAX_OBSERVERS];
    int observer_count;
    float current_temp;
} TempSensor;
  1. observeの追加及び通知
    先ほどのTempSensorを使用しobserverへの登録と通知を実装します。
    notify_observersを実行することで登録されたobserverすべてに通知がいきます。
void attach_observer(TempSensor *sensor, TempObserver *observer) {
    if (sensor->observer_count < MAX_OBSERVERS) {
        sensor->observers[sensor->observer_count++] = observer;
    }
}

void notify_observers(TempSensor *sensor) {
    for (int i = 0; i < sensor->observer_count; i++) {
        sensor->observers[i]->update(sensor->current_temp);
    }
}
  1. 使用方法
    実際の使用方法です。
    observerを管理するTempSensorを宣言し、TempSensorにobserverを登録していきます。
    そしてセンサの値が更新されたタイミングでupdate_temperatureを実行するとすべてのobserverに通知がいきます。
    新機能追加: attach するだけ
    機能削除: attach しないだけ
    順序変更: attach の順番を変えるだけ
    上記のようにセンサ値を取得した際の処理を柔軟に変更できます。
int main() {
    TempSensor sensor = {.observer_count = 0};
    
    TempObserver alarm = {.update = alarm_system};
    TempObserver fan = {.update = fan_controller};
    TempObserver logger = {.update = data_logger};
    
    attach_observer(&sensor, &alarm);
    attach_observer(&sensor, &fan);
    attach_observer(&sensor, &logger);
    
    // センサー値のシミュレーション
    printf("=== 温度: 30℃ ===\n");
    update_temperature(&sensor, 30.0f);
    
    printf("\n=== 温度: 65℃ ===\n");
    update_temperature(&sensor, 65.0f);
    
    printf("\n=== 温度: 85℃ ===\n");
    update_temperature(&sensor, 85.0f);
    
    return 0;
}

最後に

observerについて中々理解しきれませんでしたが、ユースケースを1つ教えてもらうとわかったような気がします。センサの処理時に使用することが多いのでしょうか。
observerを使用することで組み込み製品のランクに応じた処理を元のコードをあまり変えずにobserverのみを変化させることで実装できるのが良いところなのかなと感じました。

Discussion