Closed 23-saho closed 7 months ago
volume.read()
は呼ぶたびにGPIOからアナログ値を読み込むことになって非効率なので、一度だけ読み込むようにしたいです。変更元のコードはこの問題を構造体のプロパティに持たせることで解決していました。
struct Machine {
float volume_;
// ここではGPIO読み込み、呼び出しの度に(比較的)重たい処理が入る
// 簡単のため volume の存在、およびこの関数の実装は省略
float read_volume();
// 元コードの one_step と同じように定期的に呼ばれる
void one_step();
// one_step 中になんかやる関数たち 実装は略
void do_something1();
void do_something2();
};
void Machine::one_step() {
// volume 読み込み
this->volume_ = this->read_volume();
// 読み込んだ値を使ってなんかやる
// this->read_volume() を呼び出す代わりに this->volume_ を参照するので効率がいい
this->do_something1();
this->do_something2();
}
しかし、わざわざプロパティにせずともローカル変数で読み込んだ値を受け渡せるのでは?というのが #144 の趣旨です。
struct Machine {
//float volume_; 最終的にここを消したい
// ここではGPIO読み込み、呼び出しの度に(比較的)重たい処理が入る
// 簡単のため volume の存在、およびこの関数の実装は省略
float read_volume();
// 元コードの one_step と同じように定期的に呼ばれる
void one_step();
// one_step 中になんかやる関数たち 実装は略
// volume を引数で受け取ることで read_volume() の呼び出しを避ける
void do_something1(float volume);
void do_something2(float volume);
};
void Machine::one_step() {
// volume 読み込み
float volume = this->read_volume();
// 読み込んだ値を使ってなんかやる
// this->read_volume() を呼び出す代わりにここでは volume の値を読む
this->do_something1(volume);
this->do_something2(volume);
}
これは #156 がかなりいい感じに実現できています。そこも参考にしつつ書き直してください。
volume_をvolume.read()に書き換えました。間違っていたら教えてください。