Open H1rono opened 4 months ago
はじめの...に std::pair<PinName, PinName>& joy_pins;; PinName& volume_pin,; std::pair<PinName, PinName>& mpu_pins; を入れて、 2つめの...に InputModules( const std::pair<PinName, PinName>& joy_pins, const PinName& volume_pin, const std::pair<PinName, PinName>& mpu_pins); を入れて、 .cppファイルのほうでbuild()、builder()の関数を実装すればいいのでしょうか。
そもそも変更後はこのように使用することが目的です ( #192 )
InputModules input_modules = InputModules::builder()
.joy_pins(A4, A5)
.volume_pin(A6)
.mpu_sda_pin(D4)
.mpu_scl_pin(D5)
.build();
// こう書いても同じ
InputModules::Builder builder = InputModules::builder();
builder.joy_pins(A4, A5);
builder.volume_pin(A6);
builder.mpu_sda_pin(D4);
builder.scl_pin(D5);
InputModules input = builder.build();
はじめの...
Builder
は内部状態として確かにそれを持っておく必要があるんですが、メソッドチェーンできるようにするためにSetterをかます必要があります。
class Builder {
private:
PinName _volume_pin;
...
public:
auto volume_pin(PinName pin) -> Builder&;
...
};
2つめの...
擬似コードのコメントにも書きましたが、InputModules
をBuilder
以外から構築できないようにしたいです。そのため、↓のようなコンストラクタはそもそも作らないか、private
指定してInputModules
の外からは見えないようにしたいです。
InputModules(
const std::pair<PinName, PinName>& joy_pins,
const PinName& volume_pin,
const std::pair<PinName, PinName>& mpu_pins,
);
あとこれは擬似コードが悪いんですが、Builder
を受け取るコンストラクタはpublic
にしても良さそう
2つめの...にはそれ以外で既存のメソッドたちが入るはずです。
.cppファイルのほうで...
はい、それに加えてBuilder
の持つ各種setterを実装する必要があります
擬似コード書き直し
class InputModules {
public:
class Builder {
private:
PinName _volume_pin;
// 他のピンも書く
public:
auto volume_pin(const PinName& pin) -> Builder&;
// その他setterも
auto build() -> InputModules;
};
private:
// あってもなくてもいい
InputModules(
const std::pair<PinName, PinName>& joy_pins,
const PinName& volume_pin,
const std::pair<PinName, PinName>& mpu_pins
);
public:
static auto builder() -> Builder;
// InputModulesをBuilder以外の方法で構築できないようにする
// すなわち、publicなコンストラクタはこれだけ
InputModules(Builder builder);
// 元々あったメソッドたち
};
丁寧な解説ありがとうございます。 やってみます
https://github.com/rogy-AquaLab/omniboat_robokit/blob/2d3b5b3c458545a219c165dd51108eb6995a1f62/include/device/input.hpp#L33-L41
https://github.com/rogy-AquaLab/omniboat_robokit/blob/2d3b5b3c458545a219c165dd51108eb6995a1f62/src/device/input.cpp#L13-L20
この部分を↓にしたい
クラスを入れ子にするあたりが怪しいかも?要調査