スイッチを押すとき、スイッチもまた指を押しているのだ。
この記事では、スイッチとは何か。哲学的に考察していく…つもりはない。
求めているものを、どう実現するかについて少しまじめに書いてみる。
ちなみに、前回の記事は「スイッチを押すとき #前編 - もみあげあしめ」です。
前回の振り返り
前提
- スイッチは正極性(押されると通電)
- スイッチの通電状態は下記関数で取得する
/* スイッチの値を取得(0:OFF、それ以外:通電) */ int sw_value(void);
- ボタンが押されたときに何かをする
- 基本的には sleep を挟んでぶん回す(別のスレッドで)
恐るべきスイッチのコード
こんなコードを書いていた時期もありました…。
int is_pressed() { return sw_value(); } int main(void) { while(1) /* for(;;)派の人とはきっと仲良くなれない */ { if( is_pressed() ){ do_someting(); } usleep(XX); } }
何が起きるか?
- スイッチを1回押したときにチャタリングが起きて、do_someting() が意図せず複数回呼ばれる
- スイッチ1回だけを検出したいときに、do_someting() が呼ばれ続ける
- 逆にスイッチが押されているときに do_someting() を続けられない
問題は何か?
この例で問題となっているのは、「目的」が明らかでないこと。
経験や知識の不足も一つの要因であるとは思うが、それ以上にすべきことが全く分からない。
何かを実現するときに必要なのは「要求」ではなく「目的」である。
「目的」を無視して、作られたものは大抵「要求」を満たさない。#すべてがそうではないが…。
スイッチを例に
例えば、スイッチ一つをとっても「目的」にあった「要求」の実現方法が複数考えられる。
1.役割を切り替える場合
スイッチ自体の「機能」を切り替えて保持する必要がある。
家電の本体スイッチはこれ。
2.押されたときに何かを変化させる場合
スイッチが押されたイベント、離した「イベント」を正確に検出する必要がある。
エアコンの温度とかを調整するときのスイッチはこれ。
3.押されている間は何かを続ける場合
押されている状態、押されていない状態を正確に検出する必要がある。
テレビの音量を調整するときのスイッチはこれ。
おわりに
求めているものを予想することほど、難しいことはない。
必要とされないものを作り出しても、誰も喜ばない。
自分勝手な解釈は、自分以外の誰をも幸せにしない。
話をして相手の考え、目的を理解してこそ良いものができる。
結局何が言いたいのかというと、「相手の立場で考えること」が大切であること。
相手の立場に立つためには、「相手の話を聞いて理解すること」が大切であること。
#なんとなく、説教っぽくなってしまった。もうおっさんやな